浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)

 更新时间:2013年06月29日 12:13:32   作者:  
本篇文章是对web上存漏洞及原理分析、防范方法(文件名检测漏洞)进行了详细的分析介绍,需要的朋友参考下
我们通过前篇:<浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)>,已经知道后端获取服务器变量,很多来自客户端传入的。跟普通的get,post没有什么不同。下面我们看看,常见出现漏洞代码。
1、检测文件类型,并且用用户上存文件名保存
复制代码 代码如下:

if(isset($_FILES['img']))
{
    $file = save_file($_FILES['img']);
 if($file===false) exit('上存失败!');

 echo "上存成功!",$file;
}
function check_file($img)
{
 ///读取文件
 if($img['error']>0) return false;

 $tmpfile = $img['tmp_name'];
 $filename = $img['name'];

 
 ///读取文件扩展名
 $len=strrpos($filename,".");
 if($len===false) return false;

 //得到扩展名
 $ext = strtolower(substr($filename,$len+1));
 if(!in_array($ext,array('jpg','jpeg','png'))) return false;
 return true;
}
function save_file($img)
{
 if(!check_file($img)) return false;

 //格式检测ok,准备移动数据
 $filename = $img['name'];
 $newfile = "upload/" .$filename;
 if(!move_uploaded_file($img["tmp_name"],$newfile)) return false;

 return $newfile;
}
?>

以上代码,对输入类型也做了判断,看了没有问题。但是问题,确恰恰出现在对获取的用户名变量检测上面。直接获取传入用户名,然后存为文件。 有朋友会说:这些文件名都是我电脑里面存在的,文件名格式都受限于操作系统对文件名定义。 但是,需要注意是,对于$_FILES里面获取变量,是直接来自http request请求。它跟普通获取其它get,post变量一样。 因此,别有用心的人,往往会自己模拟浏览器,给服务器发送一个特殊文件名。然后,让存文件时候,能够正常保存为自己格式。

前些年,”\0” 在字符串中,保存为文件,会自动截断后面内容。 如:$filename 构造为:”a.php\0.jpg” ,我们想想,将会变成怎么样?
$newfile = “upload/a.php\0.jpg” 因为,对扩展名验证,最右边”.”后面字符是jpg ,是允许图片格式。 但是,我们一以该文件名,保存。 发现磁盘会在upload目录下面生成a.php ,\0后面所有字符,被自动截断。

该漏洞,风靡一时。当时几乎大多数上存网站都有漏洞。一时,很多平台关闭了上存。其实,根本原因就在此。我们拿到文件名,自己作为最终生成文件名保存了。  好的方法,是自己随机生成文件名+读取扩展名 。这样可以组织输入特殊字符,在进行文件保存时候,被抛弃或截断了。

php4时代这个漏洞可以利用,到php5时代,生成的变量文件名值中,会自动过滤掉”\0” ,这样无论用户构造怎么样的特殊”\0”用户名,都会被截断。 但是 ,目前这类漏洞,在asp,jsp 等站点。还经常有出现。老版本的php站点也会经常出现。
好了,今天先到这里,后面还有2种其它常见方法,后面给出!欢迎交流!

相关文章

  • 详解PHP的抽象类和抽象方法以及接口总结

    详解PHP的抽象类和抽象方法以及接口总结

    这篇文章主要介绍了PHP的抽象类和抽象方法以及接口总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • PHP 采集获取指定网址的内容

    PHP 采集获取指定网址的内容

    用php来获取指定网页内容的实现代码,一般采集程序经常用的一些代码,这里只是一个简单的基础。更详细的资料可以参考php 采集成品,可以使用的源码,这样才能学会更多的东西。
    2010-01-01
  • php计算税后工资的方法

    php计算税后工资的方法

    这篇文章主要介绍了php计算税后工资的方法,涉及php流程控制及数学运算的相关技巧,比较简单实用,需要的朋友可以参考下
    2015-07-07
  • php全局变量和类配合使用深刻理解

    php全局变量和类配合使用深刻理解

    本文详细介绍下php全局变量和类在多种情况下的配合使用,感兴趣的朋友可以参考下哈,希望对大家有所帮助
    2013-06-06
  • PHP排序算法系列之桶排序详解

    PHP排序算法系列之桶排序详解

    这篇文章主要为大家详细介绍了PHP排序算法系列之桶排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • PHP结构型模式之装饰器模式

    PHP结构型模式之装饰器模式

    这篇文章主要介绍了PHP结构型模式之装饰器模式,装饰器模式是一种结构型模式,它允许你在运行时为一个对象动态地添加新的行为,而不影响其原始的行为。这种类型的设计模式属于结构型模式,它结合了透明性和多样性
    2023-04-04
  • 一款简单实用的php操作mysql数据库类

    一款简单实用的php操作mysql数据库类

    这篇文章主要介绍了一款简单实用的php操作mysql数据库类,不但包含了php针对mysql数据库的常见操作之外,还有针对危险字符的过滤功能,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • php pcntl_fork和pcntl_fork 的用法

    php pcntl_fork和pcntl_fork 的用法

    这是两个php的多线程的方法,在Windows下不可用,在Linux下需要编译。
    2009-04-04
  • 理清PHP在Linxu下执行时的文件权限方法

    理清PHP在Linxu下执行时的文件权限方法

    下面小编就为大家带来一篇理清PHP在Linxu下执行时的文件权限方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • PHP实现大数(浮点数)取余的方法

    PHP实现大数(浮点数)取余的方法

    这篇文章主要介绍了PHP实现大数(浮点数)取余的方法,结合实例形式分析了php数学运算相关操作技巧,需要的朋友可以参考下
    2017-02-02

最新评论