浅谈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 相关文章推荐
IIS6.0中配置php服务全过程解析
Aug 07 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
php curl 上传文件代码实例
Apr 27 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP+jQuery翻板抽奖功能实现
Oct 19 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
php常用数组函数实例小结
Dec 29 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
Laravel框架Request、Response及Session操作示例
May 06 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开启openssl的方法
2014/05/15 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
让python在hadoop上跑起来
2016/01/27 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
对python 命令的-u参数详解
2018/12/03 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
parser.add_argument中的action使用
2020/04/20 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
护士检查书
2014/01/17 职场文书
寄语是什么意思
2014/04/10 职场文书
企业标语口号
2014/06/10 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
人事任命通知书
2015/04/21 职场文书
雷锋的观后感
2015/06/10 职场文书
高二数学教学反思
2016/02/18 职场文书