0x00 簡介
在長亭科技舉辦的 Real World CTF 中,國外安全研究員 Andrew Danau 在解決一道 CTF 題目時發現,向目標服務器 URL 發送 %0a 符號時,服務返回異常,疑似存在漏洞。
在使用一些有錯誤的Nginx配置的情況下,通過惡意構造的數據包,即可讓PHP-FPM執行任意代碼。
但由於是配置文件的開放性。還請使用 nginx+php-fpm 的服務管理員/運維人員及時做好自查自檢工作。
0x01 漏洞詳情
由於\n(%0a)的傳入導致nginx傳遞給php-fpm的PATH_INFO為空。
進而導致可以通過FCGI_PUTENV與PHP_VALUE相結合,修改當前的php-fpm進程中的php配置。在特殊構造的配置生效的情況下可以觸發任意代碼執行。
注:完全復制Nginx官方給出的php-fpm示例配置的用戶受到此漏洞影響
示例配置如下:
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
0x02 漏洞復現
在vulhub上已經更新了相應的靶場環境:
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
拉取鏡像環境:
環境啟動后,訪問http://your-ip:8080/index.php即可查看到一個默認頁面。
使用https://github.com/neex/phuip-fpizdam
中給出的工具,發送數據包:
(前提本機擁有正常的golang環境)
可見,這里已經執行成功。
我們訪問http://your-ip:8080/index.php?a=id,即可查看到命令已成功執行:
注意,因為php-fpm會啟動多個子進程,在訪問/index.php?a=id時需要多訪問幾次,以訪問到被污染的進程。
0x03 修復建議
1.修改 nginx 配配置文件中fastcgi_split_path_info的正則表達式,不允許.php之后傳入不可顯字符
2.暫停使用 nginx+php-fpm 服務
3.刪除如下配置
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
0x04 參考鏈接
https://www.anquanke.com/post/id/189415
https://github.com/vulhub/vulhub/blob/master/php/CVE-2019-11043/README.zh-cn.md
https://mp.weixin.qq.com/s/XPFIEiNvNorfgQHein_NGw