浅谈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 session有效期session.gc_maxlifetime
Apr 20 PHP
php 文件上传类代码
Aug 06 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
PHP性能优化大全(php.ini)
May 20 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
详解PHP队列的实现
Mar 14 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
Mar 14 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
php中大括号作用介绍
2012/03/22 PHP
PHP反射机制用法实例
2014/08/28 PHP
yii中widget的用法
2014/12/03 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
javascript 动态参数判空操作
2008/12/22 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
js实现网页随机验证码
2020/10/19 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Python中unittest用法实例
2014/09/25 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
Weblogc domain问题
2014/01/27 面试题
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
教师实习自我鉴定
2013/12/18 职场文书
工程师岗位职责规定
2014/02/26 职场文书
工作分析计划书
2014/04/30 职场文书
新店开张活动方案
2014/08/24 职场文书
英文演讲稿开场白
2014/08/25 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python