文章

关于PHPMultipart/form-data远程DoS攻击漏洞的检测与修复

文章目录

漏洞说明

CVE-ID: 2015-4024
编号:69364

PHP以往版本都存在一Multipart/form-data远程攻击漏洞,如下:

PHP 5.0.0 – 5.0.5
PHP 5.1.0 – 5.1.6
PHP 5.2.0 – 5.2.17
PHP 5.3.0 – 5.3.29
PHP 5.4.0 – 5.4.40
PHP 5.5.0 – 5.5.24
PHP 5.6.0 – 5.6.8

攻击条件不受网站程序限制,只要当前有运行PHP脚本,攻击者都可通过发送恶意的HTTP请求进行攻击。
目前PHP-5.4.41、PHP-5.5.25、PHP-5.6.9版本已经修复。

具体描述:

PHP是一种流行的WEB服务器端编程语言,它功能强大,简单易用,在很多Unix操作系统缺省都安装了PHP, 它也可以在Windows系统下运行。

PHP 4.2.0和4.2.1在处理HTTP POST请求的代码中存在一个严重安全问题。远程或者本地攻击者可能利用这个漏洞以Web服务器运行权限执行任意指令或者造成Web服务器崩溃。

PHP 包含一段代码用来对HTTP POST请求的头部数据进行智能分析,它主要用来区分用户发来的”multipart/form-data”请求中哪些是变量、哪些是文件。PHP 4.2.0开始这部分分析代码被完全重写了,由于缺乏足够的输入检查,用户通过发送一个畸形的POST请求,就可能触发一个错误条件,这个错误并没有被正确的处理。当错误发生时,一个未被初始化的结构被附在mime头链表的后面,当这个链表被释放或者销毁时,PHP会试图释放该结构中的一些指针。由于这个结构没有进行初始化,因此这些指针可能包含以前的函数调用留在堆栈中的数据。如果这些数据是攻击者可以控制的,就有可能利用free/malloc实现中的一些特性来获取控制权。

根据漏洞发现者和PHP开发组的报告,在x86平台下,由于堆栈布局的问题,留在堆栈中的数据无法被有效利用,攻击者无法获取控制权,但可以造成进程崩溃。而在Solaris sparc平台下(可能包含其他系统及平台),攻击者就可以控制堆栈中的数据,使得PHP去释放一个攻击者可以控制的内存块,从而可能获得系统控制权。通常,攻击者可以获取一个普通用户的执行权限。如果web服务器错误地以特权用户(例如 root)身份执行,攻击者也可能获取该特权用户的权限。

详细查阅

官网的漏洞报告和讨论 https://bugs.php.net/bug.php?id=69364

乌云:PHP multipart/form-data 远程DOS漏洞 http://drops.wooyun.org/papers/6077

 

漏洞测试

以下需要提交php脚本的地址进行测试,如使用index.html测试会是不正确

漏洞修复

升级到各版本的最新版:

如果你目前使用的是 php5.4.x or php5.5.x or php5.6.x请升级到官网最新版本
如果你目前使用的是 php5.3.29 or php5.3.x 建议升级到 php5.4.41

其中php升级带来的代码兼容问题请结合自己的项目参考官方文档进行升级。

其他民间补丁

针对PHP-5.3.29和PHP-5.2.17:https://coding.net/u/simapple/p/oldphppatch/git/tree/master/CVE-ID2015-4024

关于PHPMultipart/form-data远程DoS攻击漏洞的检测与修复

发表评论