浅谈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 相关文章推荐
关于BIG5-HKSCS的解决方法
Mar 20 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
php array_filter除去数组中的空字符元素
Jun 21 PHP
php中通过curl检测页面是否被百度收录
Sep 27 PHP
php加密解密实用类分享
Jan 07 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
10个值得深思的PHP面试题
Nov 14 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
关于php unset对json_encode的影响详解
Nov 14 PHP
PHP与Web页面交互操作实例分析
Jun 02 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图片上传类带图片显示
2006/11/25 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
PyTorch中的C++扩展实现
2020/04/02 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
职业生涯规划书基本格式
2014/01/06 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
三八妇女节活动总结
2014/05/04 职场文书
2014年电工工作总结
2014/11/20 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Python基础之tkinter图形化界面学习
2021/04/29 Python
用php如何解决大文件分片上传问题
2021/07/07 PHP
详解 TypeScript 枚举类型
2021/11/02 Javascript