浅谈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部分常见问题总结
Oct 09 PHP
建立文件交换功能的脚本(一)
Oct 09 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
PHP 信号管理知识整理汇总
Feb 19 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 PHP
Laravel find in set排序实例
Oct 09 PHP
PHP中多字节字符串操作实例详解
Aug 23 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
javascript的内存管理详解
2013/08/07 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
python定时器(Timer)用法简单实例
2015/06/04 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
python中set常用操作汇总
2016/06/30 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
2015年防汛工作总结
2015/05/15 职场文书
离婚案件答辩状
2015/05/22 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
手残删除python之后的补救方法
2021/06/26 Python