結合DoS壓力測試工具slowhttptest來學習利用方式,slowhttptest包括三種攻擊模式Slowloris, Slow HTTP POST, Slow Read attack。
slowhttptest介紹:https://www.cnblogs.com/shenlinken/p/7400336.html
1. Slowloris
1.1 原理
抓一個正常的http請求包,可以看到http header的結尾是"0d0a0d0a",如下圖:
HTTP協議默認在接收到全部信息之后才會開始處理,Slowloris發送的http deader結尾為"0d0a",此時服務器會因為沒有接受到完整信息而保留連接池一直等待直到超時,當建立的連接占滿連接池之后,DoS攻擊達到目的。
1.2 利用方式
先訪問一下靶機,此時可以訪問成功
開啟slowhttptest執行以下命令:
slowhttptest -c 1000 -H -i 10 -r 200 -s 8192 -t SLOWHEADER -u URL
執行命令之后,當連接數達到265時,靶機服務不可用:
2.Slow HTTP POST
2.1 原理
http deader完整發送,但設置超大的content-length值,但每次只發送很小的一個包,此時服務器會開啟連接池一直等待后續數據直到超時,當建立的連接占滿連接池之后,DoS攻擊達到目的。
2.2 利用方式
開啟slowhttptest執行以下命令(設置content-length值為81920):
slowhttptest -c 1000 -B -i 10 -r 200 -s 81920 -t SLOWBODY -u URL
3.Slow Read attack
3.1 原理
設置傳輸速率為一個特別小的值,同時請求一個特別大的資源,服務器就會保持連接進行長時間通信直到連接池被占滿。
3.2 利用方式
開啟slowhttptest執行以下命令(設置content-length值為81920):
slowhttptest -c 1000 -X -r 1000 -w 10 -y 20 -t SLOWREAD -n 5 -z 32 -u URL
4. 防御實驗
用網上建議的方法設置apache如下:
httpd.conf增加配置:
<IfModule reqtimeout_module> RequestReadTimeout header=5,MinRate=500 body=10,MinRate=500 </IfModule>
同時配置mpm_winnt模塊的參數如下
<IfModule mpm_winnt_module> ThreadsPerChild 450 MaxConnectionsPerChild 45000 </IfModule>
對應的配置參數作用如下:
ThreadsPerChild
每個子進程的最大並發線程數。
- MaxRequestsPerChild
- 每個子進程允許處理的請求總數。如果累計處理的請求數超過該值,該子進程將會結束(然后根據需要確定是否創建新的子進程),該值設為0表示不限制請求總數(子進程永不結束)。該參數建議設為非零的值,可以帶來以下兩個好處:
- 可以防止程序中可能存在的內存泄漏無限進行下去,從而耗盡內存。
- 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
設置完成后,再次用slowhttptest發請求:
Slowloris模式下,靶機沒有掛掉:
另外兩種模式下,靶機會掛掉但會再次恢復,服務沒有完全掛掉,起到了很好的緩解作用:
個人理解Slowloris模式下靶機沒有掛掉,是RequestReadTimeout設置的header等待時間起了作用,header不會一直等待所以攻擊失敗。
另外兩種模式下靶機沒有掛掉,是mpm_winnt的設置起的作用,當請求超過最大值時,子進程自動結束(靶機出現中斷),然后子進程自己恢復(靶機又能訪問),從而很好的緩解了DoS攻擊。
如需轉載,請注明出處,這是對他人勞動成果的尊重~