前言
可能有些人是第一次聽到這個慢速攻擊,這個是什么東西,會給我們的服務(wù)造成什么樣的傷害。今天就跟大家分享一下,希望大家可以得到一些啟發(fā),加固好我們的系統(tǒng)服務(wù)。
慢速攻擊
慢速攻擊是利用HTTP現(xiàn)有合法機制,在建立了與HTTP服務(wù)器的連接后,盡量長時間保持該連接,不釋放,達到對HTTP服務(wù)器的攻擊。
比如攻擊者對任何一個開放了HTTP訪問的服務(wù)器HTTP服務(wù)器,先建立了一個連接,指定一個比較大的content-length,然后以非常低的速度發(fā)表,比如1-10s發(fā)一個字節(jié),然后維持住這個連接不斷開。如果客戶端持續(xù)建立這樣的連接,那么服務(wù)器上可用的連接將一點一點被占滿,從而導(dǎo)致拒絕服務(wù)。
慢速攻擊種類
1.Slow body:攻擊者發(fā)送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務(wù)器或代理認為客戶端要發(fā)送很大的數(shù)據(jù)。服務(wù)器會保持連接準備接收數(shù)據(jù),但攻擊客戶端每次只發(fā)送很少量的數(shù)據(jù),使該連接一直保持存活,消耗服務(wù)器的連接和內(nèi)存資源。
2.Slow headers:Web應(yīng)用在處理HTTP請求之前都要先接收完所有的http頭部,因為HTTP頭部中包含了一些Web應(yīng)用可能用到的重要的信息。攻擊者利用這點,發(fā)起一個HTTP請求,一直不停的發(fā)送HTTP頭部,消耗服務(wù)器的連接和內(nèi)存資源。
3.Slow read:客戶端與服務(wù)器建立連接并發(fā)送了一個HTTP請求,客戶端發(fā)送完整的請求給服務(wù)器端,然后一直保持這個連接,以很低的速度讀取Response,比如很長一段時間客戶端不讀取任何數(shù)據(jù),通過發(fā)送Zero Window到服務(wù)器,讓服務(wù)器誤以為客戶端很忙,直到連接快超時前才讀取一個字節(jié),以消耗服務(wù)器的連接和內(nèi)存資源。
怎么慢速攻擊
這里我跟大家介紹一個工具slowhttptest,并說明怎么安裝使用。
- 官網(wǎng)下載
$ git clone https://github.com/shekyan/slowhttptest
- 編譯安裝
這里安裝到指定目錄
/opt/testerzhang/mytool/safe,大家可自行安裝指定的目錄。
$ ./configure --prefix=/opt/testerzhang/mytool/safe
$ make
$ make install
- 查看工具語法
$ cd /opt/testerzhang/mytool/safe
$ ./slowhttptest -h
可以看到有很多選項
- 參數(shù)說明
-g 在測試完成后,以時間戳為名生成一個CVS和html文件的統(tǒng)計數(shù)據(jù)
-H SlowLoris模式
-B Slow POST模式
-R Range Header模式
-X Slow Read模式
-c number of connections 測試時建立的連接數(shù)
-d HTTP proxy host:port 為所有連接指定代理
-e HTTP proxy host:port 為探測連接指定代理
-i seconds 在slowrois和Slow POST模式中,指定發(fā)送數(shù)據(jù)間的間隔。
-l seconds 測試維持時間
-n seconds 在Slow Read模式下,指定每次操作的時間間隔。
-o file name 使用-g參數(shù)時,可以使用此參數(shù)指定輸出文件名
-p seconds 指定等待時間來確認DoS攻擊已經(jīng)成功
-r connections per second 每秒連接個數(shù)
-s bytes 聲明Content-Length header的值
-t HTTP verb 在請求時使用什么操作,默認GET
-u URL 指定目標url
-v level 日志等級(詳細度)
-w bytes slow read模式中指定tcp窗口范圍下限
-x bytes 在slowloris and Slow POST tests模式中,指定發(fā)送的最大數(shù)據(jù)長度
-y bytes slow read模式中指定tcp窗口范圍上限
-z bytes 在每次的read()中,從buffer中讀取數(shù)據(jù)量
- 怎么攻擊HTTP服務(wù)
這里我從官網(wǎng)下載了一個Tomcat服務(wù),安裝了一個JAVA工程,并啟動了服務(wù)。
我們?nèi)ピL問
http://10.10.10.10:8100/test/loginDisplay這個登錄頁面,目前可以正常顯示登錄頁面。
$ slowhttptest -c 1000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u http://10.10.10.10:8100/test/loginDisplay -x 10 -p 3
通過上面這個命令,我們再去訪問
http://10.10.10.10:8100/test/loginDisplay這個登錄頁面,發(fā)現(xiàn)已經(jīng)沒有那么快響應(yīng)了。
這樣長時間下去,你的系統(tǒng)服務(wù)已經(jīng)慢得不能對外提供服務(wù),影響正常用戶的體驗。
慢速攻擊怎么處理
這里列舉兩個常用的服務(wù):
- tomcat服務(wù):可通過運行模式NIO和connectionTimeout值進行緩解。
tomcat的connect保留的時間默認設(shè)置為20s,可以適當減少connect的時間,比如將connectTimeout修改為2秒。
- Nginx服務(wù)
1、通過調(diào)整$request_method,配置服務(wù)器接受http包的操作限制;
2、在保證業(yè)務(wù)不受影響的前提下,調(diào)整client_max_body_size, client_body_buffer_size, client_header_buffer_size,large_client_header_buffersclient_body_timeout, client_header_timeout的值,必要時可以適當?shù)脑黾樱?3、對于會話或者相同的ip地址,可以使用HttpLimitReqModule and HttpLimitZoneModule參數(shù)去限制請求量或者并發(fā)連接數(shù);
4、根據(jù)CPU和負載的大小,來配置worker_processes 和 worker_connections的值,公式是:max_clients = worker_processes * worker_connections。
由于本人非從事安全領(lǐng)域,以上的處理方式僅僅提供參考。
結(jié)束語
安全無小事,我們身處互聯(lián)網(wǎng)下,保護好自己的系統(tǒng)服務(wù),才是王道。






