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 。