【技術分享】PHPStress:PHP拒絕服務***(含PoC)

http://p9.qhimg.com/t0106b5936187418320.png


前言


導致這種拒絕服務***的根本原因,在於大多數現代Web服務器的配置漏洞。簡而言之,簡單而穩定的PHP調用將使Web服務器疲於打開PHP進程,而無力顧及其他。對於個人而言,通過耗盡Web服務器所有可用資源來實現拒絕服務***,是一種非常簡單有效的方法。

使用標準電纜/DSL連接,這種***就可以通過標準的HTTP請求來耗盡Linux Web服務器的CPU和RAM資源。同時,這種***還會影響使用PHP-CGI或PHP-FPM(包括WordPress網站)處理動態PHP內容的Apache或NGINX Web服務器。此外,這些用於***Web服務器配置漏洞的請求,在***結束後將繼續佔用服務器的資源。

要想發動這種***,請設置目標URL和時間延遲參數,剩下的事情可以交由腳本來完成。


***的對象


需要注意的是,這種***與Slowloris有同樣的前提要求。主要區別在於,Slowloris專注於消耗HTTP(apache)連接,而這種***主要側重於吞噬PHP-CGI或PHP-FPM連接(在Apache或NGINX中)。

http://p2.qhimg.com/t01266752f0d4ea8c21.png


爲什麼PHPStress***能夠得逞


在大多數環境中,動態(PHP)內容的處理方法有兩種:使用PHP-FPM或PHP FastCGI(mod_fcgid)。雖然Plesk、Cpanel、ISPConfig等共享託管上的現代控制面板已經開始使用PHP-FPM作爲動態內容處理的標準,但大多數(默認情況下)情況下還是通過FastCGI來處理PHP內容。


FastCGI/Mod_fcgid


FastCGI應用程序在Web服務器(Apache或其他智能)之外執行,並使用套接字等待來自Web服務器的請求。如果FastCGI/ PHP-CGI經過了正確的設置,它將忽略請求,而不是繼續分配內存。在此期間,客戶會超時。當流量高峯過去後,一切會恢復正常。

需要注意的是:當PHP-CGI耗盡可用進程時,Apache將啓動並開始生成其他進程以嘗試滿足需求。由於這個過程使用了佔用大量內存的httpd進程,所以很快就會耗盡服務器(其中包括每個進程中嵌入的完整PHP解釋器)的內存資源。生成的Apache進程的最大數量,是由ServerLimit或MaxClients設置中設置的數字(通常爲256或512)而定的。啓動256個Apache進程的話,將花費Web服務器的很長時間。


PHP-FPM(FastCGI進程管理)


FPM(FastCGI進程管理)是PHP FastCGI的一種替代實現,它提供了一些額外的功能來支持高負載的站點。根據我自己的經驗,PHP-FPM在處理PHP方面要快得多。

***過程

首先,從GitHub下載PHPStress或通過下列的命令克隆repo: 

1
git clone https://github.com/nightlionsecurity/phpstress phpstress

要進行***,請設置目標URL和時間延遲參數,然後讓腳本執行其餘操作。同時,腳本需要嚴格按照如下所示的參數來使用。

1
php phpstress.php www.targeturl.com -d 0 -r 0

***結果

在這兩種情況下,FPM和/或CGI進程都被請求全部佔用;服務器的內存被填滿,一切都會停擺。對於運行PHP-FCGI的Apache或NGINX服務器來說,會有一些有趣的事情要注意。


PHP-FPM


在PHP-FPM服務器上,生成的最大進程數由配置文件中的相關內容決定。如果你的pm.max_children = 25,那麼最多產生的進程數將是25。

根據超時的設置情況,進程在***後的一段時間內仍保持打開狀態(通常最少爲兩分鐘)。

http://p0.qhimg.com/t01c4b33e0576db486e.png


PHP-FCGI


FastCGI的結果更加有趣。隨着FastCGI緩衝區被填滿,Apache會將這些請求排隊,等待處理。Apache不再繼續生成FastCGI進程,而是根據MaxClients指令啓動相匹配的進程。結果是生成數百個Apache進程,致使服務器徹底超載,如下所示 

http://p8.qhimg.com/t016f6949436af18155.png


緩解措施


爲了防禦這種***,您要調整的NGINX和FastCGI的一些標準配置。下面的設置是默認值,但是它們不是最佳的,應該根據自己的情況進行調整。我通常將超時設置爲1-2秒。

FCGID.CONF

/etc/httpd/conf.d/fcgid.conf

1
2
3
4
5
6
# Number of seconds of idle time before a process is terminated
FcgidIOTimeout 1000 # maximum period of time the module will wait while trying to read from or write to a FastCGI application
FcgidMaxProcessesPerClass 100 #maximum number of processes per class (user)
FcgidIdleTimeout 240 # application processes which have not handled a request for this period of time will be terminated
FcgidProcessLifeTime 3600 # maximum lifetime of a single process (seconds)
FcgidMaxProcesses 1000 #maximum number of FastCGI application processes which can be active at one time.

Apache – Httpd.Conf

/etc/httpd/conf/httpd.conf

1
2
3
4
5
6
7
8
9
Timeout 60
KeepAliveTimeout 15
KeepAlive Off
MaxKeepAliveRequests 100
StartServers   8
MinSpareServers    5
MaxSpareServers   20
ServerLimit 256
MaxClients 256

Php-Fpm.Conf

/etc/php-fpm.conf

1
2
3
4
5
; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 10s

/etc/php-fpm.d/domain.conf

1
2
3
4
; By default use ondemand spawning (this requires php-fpm >= 5.3.9)
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 60s

PoC下載地址:https://github.com/nightlionsecurity/phpstress 



本文由 安全客 翻譯,作者:shan66

原文鏈接:https://n0where.net/phpstress/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章