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


Posted in PHP onJune 29, 2013

我们通过前篇:<浅谈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 set_time_limit(0)长连接的实现分析
Mar 02 PHP
深入PHP中慎用双等于(==)的详解
Jun 06 PHP
php GUID生成函数和类
Mar 10 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
PHP实现懒加载的方法
Mar 07 PHP
PHP动态柱状图实现方法
Mar 30 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
用PHP的socket实现客户端到服务端的通信实例详解
Feb 04 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 #PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 #PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
Jun 29 #PHP
解析PHP中empty is_null和isset的测试
Jun 29 #PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 #PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 #PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 #PHP
You might like
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
python ip正则式
2009/05/07 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python实现线程状态监测简单示例
2018/03/28 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
中层干部岗位职责
2013/12/18 职场文书
租赁意向书范本
2014/04/01 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书