在長亭科技舉辦的 Real World CTF 中,國外安全研究員 Andrew Danau 在解決一道 CTF 題目時發現,向目標服務器 URL 發送 %0a 符號時,服務返回異常,疑似存在漏洞。php
在使用一些有錯誤的Nginx配置的狀況下,經過惡意構造的數據包,便可讓PHP-FPM執行任意代碼。nginx
但因爲是配置文件的開放性。還請使用 nginx+php-fpm 的服務管理員/運維人員及時作好自查自檢工做。git
因爲\n(%0a)的傳入致使nginx傳遞給php-fpm的PATH_INFO爲空。github
進而致使能夠經過FCGI_PUTENV與PHP_VALUE相結合,修改當前的php-fpm進程中的php配置。在特殊構造的配置生效的狀況下能夠觸發任意代碼執行。golang
注:徹底複製Nginx官方給出的php-fpm示例配置的用戶受到此漏洞影響正則表達式
示例配置以下:安全
location ~ [^/]\.php(/|$) { ... fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php:9000; ... }
在vulhub上已經更新了相應的靶場環境:服務器
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
拉取鏡像環境: 運維
環境啓動後,訪問http://your-ip:8080/index.php便可查看到一個默認頁面。php-fpm
使用https://github.com/neex/phuip-fpizdam
中給出的工具,發送數據包: (前提本機擁有正常的golang環境)
可見,這裏已經執行成功。
咱們訪問http://your-ip:8080/index.php?a=id,便可查看到命令已成功執行:
注意,由於php-fpm會啓動多個子進程,在訪問/index.php?a=id時須要多訪問幾回,以訪問到被污染的進程。
1.修改 nginx 配配置文件中fastcgi_split_path_info的正則表達式,不容許.php以後傳入不可顯字符 2.暫停使用 nginx+php-fpm 服務 3.刪除以下配置
fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info;
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