浅谈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&amp;MYSQL服务器配置说明
Oct 09 PHP
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
PHP 读取和编写 XML
Nov 19 PHP
PHP常见数组函数用法小结
Mar 21 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
php layui实现前端多图上传实例
Jul 30 PHP
PHP遍历数组的6种方式总结
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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
javascript回到顶部特效
2016/07/30 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Python 字典dict使用介绍
2014/11/30 Python
Python 内置函数complex详解
2016/10/23 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
Python 自由定制表格的实现示例
2020/03/20 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
写给爸爸的道歉信
2014/01/15 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL