浅谈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 相关文章推荐
在mysql数据库原有字段后增加新内容
Nov 26 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
Ping服务的php实现方法,让网站快速被收录
Feb 04 PHP
PHP中数组的三种排序方法分享
May 07 PHP
php中实现记住密码下次自动登录的例子
Nov 06 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
两款万能的php分页类
Nov 12 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
深入解析PHP底层机制及相关原理
Dec 11 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_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python类的多重继承问题深入分析
2014/11/09 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
详解Python 切片语法
2019/06/10 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
python如何提升爬虫效率
2020/09/27 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
一道SQL面试题
2012/12/31 面试题
取保候审保证书
2014/04/30 职场文书
环保倡议书300字
2014/05/15 职场文书
化学工程专业求职信
2014/08/10 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers