浅谈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
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
php加密解密字符串示例
Oct 13 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
php中的buffer缓冲区用法分析
May 31 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 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获取参数的几种方法总结
2014/02/18 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js函数排序的实例代码
2013/07/01 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
初步认识Python中的列表与位运算符
2015/10/12 Python
python调用fortran模块
2016/04/08 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
python与mysql数据库交互的实现
2020/01/06 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
小加工厂管理制度
2014/01/21 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
《猫》教学反思
2014/02/26 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
违章停车检讨书
2014/10/21 职场文书
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技