關于php遠程代碼執行漏洞的介紹

關于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免費學習筆記(深入)”;

對于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;

推薦教程:java視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享