前言
可能有些人是第一次聽到這個慢速攻擊,這個是什么東西,會給我們的服務造成什么樣的傷害。今天就跟大家分享一下,希望大家可以得到一些啟發,加固好我們的系統服務。

慢速攻擊
慢速攻擊是利用HTTP現有合法機制,在建立了與HTTP服務器的連接后,盡量長時間保持該連接,不釋放,達到對HTTP服務器的攻擊。
比如攻擊者對任何一個開放了HTTP訪問的服務器HTTP服務器,先建立了一個連接,指定一個比較大的content-length,然后以非常低的速度發表,比如1-10s發一個字節,然后維持住這個連接不斷開。如果客戶端持續建立這樣的連接,那么服務器上可用的連接將一點一點被占滿,從而導致拒絕服務。

慢速攻擊種類
1.Slow body:攻擊者發送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務器或代理認為客戶端要發送很大的數據。服務器會保持連接準備接收數據,但攻擊客戶端每次只發送很少量的數據,使該連接一直保持存活,消耗服務器的連接和內存資源。
2.Slow headers:Web應用在處理HTTP請求之前都要先接收完所有的http頭部,因為HTTP頭部中包含了一些Web應用可能用到的重要的信息。攻擊者利用這點,發起一個HTTP請求,一直不停的發送HTTP頭部,消耗服務器的連接和內存資源。
3.Slow read:客戶端與服務器建立連接并發送了一個HTTP請求,客戶端發送完整的請求給服務器端,然后一直保持這個連接,以很低的速度讀取Response,比如很長一段時間客戶端不讀取任何數據,通過發送Zero Window到服務器,讓服務器誤以為客戶端很忙,直到連接快超時前才讀取一個字節,以消耗服務器的連接和內存資源。
怎么慢速攻擊
這里我跟大家介紹一個工具slowhttptest,并說明怎么安裝使用。
- 官網下載
$ 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
可以看到有很多選項

- 參數說明
-g 在測試完成后,以時間戳為名生成一個CVS和html文件的統計數據
-H SlowLoris模式
-B Slow POST模式
-R Range Header模式
-X Slow Read模式
-c number of connections 測試時建立的連接數
-d HTTP proxy host:port 為所有連接指定代理
-e HTTP proxy host:port 為探測連接指定代理
-i seconds 在slowrois和Slow POST模式中,指定發送數據間的間隔。
-l seconds 測試維持時間
-n seconds 在Slow Read模式下,指定每次操作的時間間隔。
-o file name 使用-g參數時,可以使用此參數指定輸出文件名
-p seconds 指定等待時間來確認DoS攻擊已經成功
-r connections per second 每秒連接個數
-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模式中,指定發送的最大數據長度
-y bytes slow read模式中指定tcp窗口范圍上限
-z bytes 在每次的read()中,從buffer中讀取數據量
- 怎么攻擊HTTP服務
這里我從官網下載了一個Tomcat服務,安裝了一個JAVA工程,并啟動了服務。
我們去訪問
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這個登錄頁面,發現已經沒有那么快響應了。

這樣長時間下去,你的系統服務已經慢得不能對外提供服務,影響正常用戶的體驗。

慢速攻擊怎么處理
這里列舉兩個常用的服務:
- tomcat服務:可通過運行模式NIO和connectionTimeout值進行緩解。
tomcat的connect保留的時間默認設置為20s,可以適當減少connect的時間,比如將connectTimeout修改為2秒。

- Nginx服務
1、通過調整$request_method,配置服務器接受http包的操作限制;
2、在保證業務不受影響的前提下,調整client_max_body_size, client_body_buffer_size, client_header_buffer_size,large_client_header_buffersclient_body_timeout, client_header_timeout的值,必要時可以適當的增加;
3、對于會話或者相同的ip地址,可以使用HttpLimitReqModule and HttpLimitZoneModule參數去限制請求量或者并發連接數;
4、根據CPU和負載的大小,來配置worker_processes 和 worker_connections的值,公式是:max_clients = worker_processes * worker_connections。
由于本人非從事安全領域,以上的處理方式僅僅提供參考。
結束語
安全無小事,我們身處互聯網下,保護好自己的系統服務,才是王道。