浅谈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 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
PHP取余函数介绍MOD(x,y)与x%y
May 15 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP goto语句用法实例
Aug 06 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
switchery按钮的使用方法
2017/12/18 Javascript
js实现移动端轮播图
2020/12/21 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
Python实现的tab文件操作类分享
2014/11/20 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python global全局变量函数详解
2018/09/18 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python 实现视频 图像帧提取
2019/12/10 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
房产转让协议书
2014/04/11 职场文书
2015年女职工工作总结
2015/05/15 职场文书
地震捐款简报
2015/07/21 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书