PHP任意文件上传漏洞CVE-2015-2348浅析
当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多版本!如果漏洞属实,看来今晚又要通宵打补丁了啊。
不过经过简单分析后,发现漏洞的利用条件相当苛刻(很多人好奇到底有多苛刻),楼主简单记录自己的分析过程和大家分享一下,如有不当,请多多指正。
一、漏洞概述
漏洞报告者说php的上传函数 move_uploaded_file的目的路径参数可以使用空字符截断,绕过jpg,png上传类型的检测,从而导致任意文件上传。报告者给出的测试EXP:
move_uploaded_file($_FILES['x']['tmp_name'],"/tmp/test.php\x00.jpg")
按照漏洞报告者的描述 5.3 以后版本都受影响(https://bugs.php.net/bug.php?id=69207)

二、漏洞测试
为验证漏洞有效性楼主搭建一个测试环境,版本 5.3.6,构造测试代码如下:
上传前台页面upload.htm:

上传处理脚本upload.php

测试上传upload.php始终返回失败false

于是换了一个版本5.3.29,依旧未测试成功,难道是我测试的方法不对,那就看一下源码吧。
三、漏洞调试
move_uploaded_file的代码实现在 ext/standard/basic_functions.c 文件,关键代码:

代码中有几处return false的逻辑,那么测试不成功肯定是命中了其中的一个逻辑。
楼主使用最原始的打log方法来调试,确认测试代码被上述标红代码过滤了,于是查看打印出来strlen(new_path) 和 new_path_len的值 —— 分别是19 和 23。
new_path 是路径名字符串“/tmp/whoisdashuaige\x00jpg”的长度,由于strlen计算到空字符处\x00结束,因此长度19可以理解。
那么为什么new_path_len是23呢?
PHP语言中所有的变量类型都保存在一个如下的结构体中,new_path_len对应标红的len。这里的len是一个二进制长度,不会遇到空字符结束所以长度为23。所以测试demo使用\0在这里长度不等一直返回失败。

那测试成功的又是什么情况呢,组里另外一位同事发来消息说在5.6.6版本可测试成功,打开5.6.6漏洞代码处一看震惊了,5.6.6代码如下:

原来在高版本(受影响版本中),PHP把长度比较的安全检查逻辑给去掉了,导致了漏洞的发生,不知道这段代码是哪个开发者更新的,什么仇什么怨。
四、漏洞利用条件
漏洞利用需要控制第二个参数(目标路径),比如:

但是,实际在开发场景中,目标路径一般是程序自己生成的(避免同名文件覆盖的情况),就算退一步,程序猿同学想取原来的文件名,往往也习惯用$_FILES变量取文件名。
而$_FILES变量中如果加入\0字符截断,却又不影响程序逻辑:
提交a.php\0jpg 和 a.php 是等价的。
测试方法如下:

上传抓包修改name为a.php\0jpg(\0是nul字符),可以看到$_FILES['xx']['name']存储的字符串是a.php,不会包含\0截断之后的字符,因此并不影响代码的验证逻辑。
但是如果通过$_REQUEST方式获取的,则可能出现扩展名期望值不一致的情况,造成“任意文件上传”。
五、总结
1、漏洞影响版本必须在5.4.x<= 5.4.39, 5.5.x<= 5.5.23, 5.6.x <= 5.6.7,详见CVE公告:https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-2348
2、漏洞利用条件苛刻,与实际业务书写代码习惯有较大的差异,因此风险较低
行为仓促,如有不当请指正。
摘自:TSRC
PHP任意文件上传漏洞CVE-2015-2348浅析的更多相关文章
- WordPress Contact Form 7插件任意文件上传漏洞
漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...
- WordPress Suco Themes ‘themify-ajax.php’任意文件上传漏洞
漏洞名称: WordPress Suco Themes ‘themify-ajax.php’任意文件上传漏洞 CNNVD编号: CNNVD-201311-403 发布时间: 2013-11-28 更新 ...
- WordPress Kernel Theme ‘upload-handler.php’任意文件上传漏洞
漏洞名称: WordPress Kernel Theme ‘upload-handler.php’任意文件上传漏洞 CNNVD编号: CNNVD-201311-127 发布时间: 2013-11-12 ...
- WordPress Think Responsive Themes ‘upload_settings_image.php’任意文件上传漏洞
漏洞名称: WordPress Think Responsive Themes ‘upload_settings_image.php’任意文件上传漏洞 CNNVD编号: CNNVD-201311-06 ...
- WordPress Checkout插件跨站脚本漏洞和任意文件上传漏洞
漏洞名称: WordPress Checkout插件跨站脚本漏洞和任意文件上传漏洞 CNNVD编号: CNNVD-201311-015 发布时间: 2013-11-04 更新时间: 2013-11-0 ...
- WordPress Lazy SEO插件lazyseo.php脚本任意文件上传漏洞
漏洞名称: WordPress Lazy SEO插件lazyseo.php脚本任意文件上传漏洞 CNNVD编号: CNNVD-201309-446 发布时间: 2013-09-26 更新时间: 201 ...
- WordPress Complete Gallery Manager插件‘upload-images.php’任意文件上传漏洞
漏洞名称: WordPress Complete Gallery Manager插件‘upload-images.php’任意文件上传漏洞 CNNVD编号: CNNVD-201309-377 发布时间 ...
- WordPress NextGEN Gallery ‘upload.php’任意文件上传漏洞
漏洞名称: WordPress NextGEN Gallery ‘upload.php’任意文件上传漏洞 CNNVD编号: CNNVD-201306-259 发布时间: 2013-06-20 更新时间 ...
- 【原创】JEECMS v6~v7任意文件上传漏洞(1)
文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定 ...
随机推荐
- MySQL 5.5 主从复制
MySQL 5.5 主从复制的原理.过程 分为同步复制和异步复制,实际复制架构中大部分为异步复制.复制的基本过程如下: 1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指 ...
- 解题:POI 2009 Lyz
题面 板板讲的霍尔定理 霍尔定理:一张二分图有完全匹配的充要条件是对于任$i$个左部点都有至少$i$个右部点与它们相邻.放在这个题里就是说显然最容易使得鞋不够的情况是一段连续的人,那就维护一下最大子段 ...
- Java--Inheritance constructor继承中的构造方法问题(二)
看了前辈的博客,觉得这两点说的精辟:子类构造方法必须要调用父类的某个构造方法:被子类调用的父类构造方法在父类中必须是存在的. 上篇的例子有一点不明白,子类继承了父类的成员变量,父类的构造函数里引用了该 ...
- poi对excel的操作(二)
二.进阶的对象 1.CellType 枚举类 单元格类型 CellType.STRING---文本型 等 如何是指单元格类型:cell.setCellType(CellType.STRING) 2.C ...
- MyBatis操作oracle的一些问题加载
mybatis在更新数据或者插入数据为空的时候必须指定jdbcType类型 1:传入的参数是对象类型 User user =new User(); INSERT INTO t_user ( id, u ...
- [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 数学&动态规划:期望DP
BZOJ3036 给定一张有向无环图,起点为1,终点为N,每个点i有ki条出边,从每个点走其中一条出边的概率是1/ki,求从1到N的期望步数 我们注意到一点,走每条边都是等概率的,那么就相当于 给定一 ...
- laravel后台返回ajax数据
后台模式: $array = array('msg'=>'添加失败!','status'=>'false'); return json_encode($array); 前台显示: $.aj ...
- mysql数据库 批量替换 某字段中的数据
当数据库出现这种情况: 表名:area id name 1 太仓 2 太仓市 3 太仓市 ... ... 我需要把 name字段中 的太仓市 的“市“去掉 可以使用: update `area` ...
- MSSQL 基础知识002
---启用sa账号 1. 先使用一个windows账号登陆. 2.在数据库实例上面右键,属性,安全性,登录名,sa. 右键,属性. 常规,修改sa的密码. 状态,启用sa账号. 主键的作用: 1.唯一 ...