首頁  >  文章  >  運維  >  關於php遠端程式碼執行漏洞的介紹

關於php遠端程式碼執行漏洞的介紹

王林
王林轉載
2020-04-09 15:35:593191瀏覽

關於php遠端程式碼執行漏洞的介紹

前言:

在2019年9月26日,PHP官方發布了一則漏洞公告,這次漏洞公告中官方揭露了一個遠端程式碼執行漏洞,此漏洞是因PHP-FPM中的fpm_main.c檔案的env_path_info下溢而導致的。

此漏洞存在於PHP-FPM Nginx組合使用並採用一定配置的情況下。該漏洞PoC已在2019年10月22日公佈,PHP與Nginx組合使用的情況較為廣泛,攻擊者可利用該漏洞遠端執行任意程式碼,所以危害性較大。

PHP-FPM元件介紹

PHP-FPM(FastCGI流程管理器)是另一個PHP FastCGI實現,具有一些其他功能,可用於各種規模的站點,尤其是繁忙的站點。

對於PHP 5.3.3之前的php來說,PHP-FPM是一個補丁包,旨在將FastCGI進程管理整合進PHP包中。如果你使用的是PHP 5.3.3之前的PHP的話,就必須將它patch到你的PHP原始碼中,在編譯安裝PHP後才可以使用。

而PHP 5.3.3已經整合php-fpm了,不再是第三方的套件了。 PHP-FPM提供了更好的PHP進程管理方式,可以有效控制記憶體和進程、可以平滑重載PHP配置。

(學習推薦:java影片教學

漏洞描述

該漏洞是PHP-FPM中的fpm_main. c檔案的env_path_info下溢導致,在sapi/fpm/fpm/fpm_main.c檔案中的第1140行包含pointer arithmetics,這些pointer arithmetics假定env_path_info的前綴等於php腳本的路徑。但是,程式碼不會檢查這些假設是否被滿足,缺少檢查會導致”path_info”變數中的指標無效。

這樣的條件可以在標準的Nginx配置中實現。如果有這樣的Nginx配置:

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_pass   php:9000;
        ...
  }

攻擊者可以使用換行符號(編碼格式為​​%0a)來破壞`fastcgi_split_path_info`指令中的regexp。 regexp損壞將導致空PATH_INFO,觸發該錯誤。

這個錯誤會導致程式碼執行漏洞。在後面的程式碼中,path_info[0]的值設定為0,然後再呼叫FCGI_PUTENV。攻擊者可以使用精心選擇的URL路徑長度和查詢字串,使path_info精確地指向_fcgi_data_seg結構的第一位元組。然後將0放入其中則‘char* pos’字段向後移動,然後FCGI_PUTENV使用腳本路徑覆蓋一些資料(包括其他快速cgi變數)。

使用這種技術,攻擊者可以建立一個偽PHP_VALUE fcgi變量,然後使用一系列精心選擇的配置值來執行程式碼。

影響產品:

在2019-09-26更新前下載的PHP-FPM,且必須為Nginx php-fpm 的伺服器使用如下配置,會受到影響。

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
 
        fastcgi_pass   php:9000;
        ...
  }

修正建議

如果業務不需要以下配置,建議使用者刪除:

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;

推薦教學:伺服器安全教學

以上是關於php遠端程式碼執行漏洞的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:secpulse.com。如有侵權,請聯絡admin@php.cn刪除