CVE-2019-11043: PHP 7 RCE漏洞分析
- 2019 年 10 月 30 日
- 筆記
研究人員在PHP 7中找出有個遠程代碼執行(RCE)漏洞,該漏洞CVE編號為CVE-2019-11043。攻擊者利用該漏洞只需要訪問通過精心偽造的URL就可以在服務器上運行命令。
漏洞簡介
該漏洞位於PHP-FPM模塊的env_path_info函數,漏洞實際上是有個內存下溢破壞漏洞,攻擊者利用該漏洞結合其他漏洞利用可以讓攻擊者在有漏洞的web網站上執行任意代碼。該漏洞影響的是PHP-FPM的特定配置的網站。PHP-FPM是一種可選的PHP FastCGI實現,可以為PHP編程語言編寫的腳本來提供高級和高效地處理。
在特定的nginx + php-fpm配置中,web用戶就可能會進行代碼執行。有漏洞的配置如下所示:
location ~ [^/].php(/|$) { ... fastcgi_split_path_info ^(.+?.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php:9000; ... }
從中可以看出,以上代碼上缺乏腳本檢查,因此攻擊者可以用sploit來觸發漏洞。
漏洞利用條件
fastcgi_split_path_info directive必須存在,並且含有以 ^開頭,以 $結尾的正則表達式。
必須通過fastcgi_param PATH_INFO $fastcgi_path_info;語句來實現 PATH_INFO變量。首先,研究人員認為必須在fastcgi_params 文件中。
沒有文件存在性檢查,比如try_files $uri =404 or if (-f $uri)。如果Nginx在FastCGI轉發前釋放請求到不存在的腳本,研究人員創建的請求就不會到達php-fpm。
雖然漏洞利用只在PHP 7+版本上工作,但該漏洞本身存在於之前的版本中。很長時間內,php-fpm都不會限制腳本的擴展,比如/avatar.png/some-fake-shit.php可以將 avatar.png 作為php腳本執行。PoC代碼見:https://github.com/neex/phuip-fpizdam
GitHub上的PoC腳本可以通過發送特殊偽造的請求來查詢目標web服務器來識別是否受到該漏洞的影響。識別了有漏洞的目標後,攻擊者可以在URL中加上'?a='並發送偽造的請求到有漏洞的web服務器。
建議
因為PoC漏洞利用已經在GitHub上公布了,雖然補丁已經發佈了,但是黑客可能已經利用該漏洞了。研究人員建議用戶更新PHP到最新的 PHP 7.3.11 或 PHP 7.2.24 。