浅谈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的bbs设计(四)
Oct 09 PHP
使用adodb lite解决问题
Dec 31 PHP
php一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
Laravel框架路由设置与使用示例
Jun 12 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
thinkphp分页集成实例
2017/07/24 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
JS 表单验证大全
2011/11/23 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
理解JS绑定事件
2016/01/19 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
Angular实现响应式表单
2017/08/04 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python中的Django基本命令实例详解
2018/07/15 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
python中pivot()函数基础知识点
2021/01/03 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
Internal修饰符有什么含义
2013/07/10 面试题
《赵州桥》教学反思
2014/02/17 职场文书
电子商务专业求职信
2014/03/08 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
计划生育证明书写要求
2014/09/17 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
运动会入场词
2015/07/18 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书