浅析phpunit之CVE-2017-9841
/0x01 简介
最近hw遇到phpunit的攻击流量,之前没分析过,这里简单看下。
Composer 是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。Composer 默认情况下不是全局安装,而是基于指定的项目的某个目录中(例如 vendor)进行安装,并将所有文件放在该目录中。
PHPUnit是一个轻量级的PHP测试框架。使用Composer来安装PHPUnit扩展时,PHPUnit的所有文件都会存在于vendor目录中。
0x02 CVE-2017-9841
靶机环境
靶机环境参考Vulhub:https://vulhub.org/#/environments/phpunit/CVE-2017-9841/
影响版本
phpunit漏洞版本如下:
- 4.8.19-4.8.27
- 5.0.10-5.6.2
漏洞原理
如果通过Composer安装的phpunit扩展的版本是漏洞版本,且vendor目录放在外部能访问的Web目录中,就存在phpunit远程代码执行漏洞。
漏洞代码,phpunit/src/Util/PHP/eval-stdin.php:
1 |
|
漏洞复现
直接往eval-stdin.php文件所在路径直接POST发送PHP代码即可:
1 | POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1 |
补丁分析
5.6.3版本的eval-stdin.php:
1 |
|
就是将php://input
伪协议替换为php://stdin
伪协议。
这样当然能修补漏洞了。但是听说php://stdin
伪协议在某些PHP SAPI场景下还是有问题的,这个可自行探究。
防御方法
不将vendor放在Web目录中。