浅谈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
手把手教你使用DedeCms V3的在线采集图文教程
Apr 03 PHP
实用函数8
Nov 08 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 PHP
关于PHP数组迭代器的使用方法实例
Nov 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 小乘法表实现代码
2009/07/16 PHP
php实现mysql同步的实现方法
2009/10/21 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
jQuery extend 的简单实例
2013/09/18 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python-opencv颜色提取分割方法
2018/12/08 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
《藤野先生》教学反思
2014/02/19 职场文书
道德演讲稿
2014/05/21 职场文书
体育教师求职信
2014/06/30 职场文书
员工试用期自我评价
2014/09/18 职场文书
幼儿园感谢信
2015/01/21 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
python Tkinter模块使用方法详解
2022/04/07 Python