漏洞簡介:
來自Wallarm的安全研究員Andrew Danau在9月14-16號舉辦的Real World CTF中,意外的向服務器發送%0a(換行符)時,服務器返回異常信息。由此發現了這個0day漏洞,9月26日,PHP官方發佈漏洞通告,其中指出,使用Nginx+php-fpm的服務器,在部分配置下,存在遠程代碼執行漏洞。並且該配置已被廣泛使用,危害較大
漏洞概述:
Nginx上fastcgi_split_path_info在處理帶有%0a的請求時,會因爲遇到換行符\n導致PATH_INFO爲空。而php-fpm在處理PATH_INFO爲空的情況下,存在邏輯缺陷,攻擊者通過精心構造和利用,可以導致遠程代碼執行。
漏洞影響版本:
Nginx+php-fpm的服務器,在使用如下配置的情況下,都有可能存在遠程代碼執行的漏洞
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
漏洞復現:
使用vulhub啓動環境:
github下載漏洞環境
git clone https://github.com/vulhub/vuhub/tree/master/php/CVE-2019-111043
POC下載:https://github.com/neex/phuip-fpizdam
POC需要go語言編譯,需要go語言環境(linux下go語言安裝)
漏洞啓動後,訪問http://yuo ip:8080/index.php即可查看到一個默認頁面
現在編譯POC,進入下載好的poc文件夾內,執行go build進行編譯,編譯好後,文件內出現phuip-fpizdam可執行文件
如果編譯失敗,顯示timeout,則需要設置代理,執行以下語句添加環境變量:
export GOPROXY=https://goproxy.io
使用編譯好的工具,發送數據包:
這裏已經成功執行,訪問http://ip:8080/index.php?a=whoami 即可查看到命令已經成功執行。
注意:因爲php-fpm會啓動多個子進程,在訪問index.php?a=id時需要多訪問幾次,以訪問被污染的進程
漏洞修復方式:
1.在不影響正常業務的情況下,刪除Nginx配置文件中如下配置:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_paramPATH_INFO $fastcgi_path_info;
2.官網下載最新補丁