【研究】緩慢的http拒絕服務攻擊


1 詳細描述:

緩慢的http拒絕服務攻擊是一種專門針對於Web的應用層拒絕服務攻擊,攻擊者操縱網絡上的肉雞,對目標Web服務器進行海量http request攻擊,直到服務器帶寬被打滿,造成了拒絕服務。

 

慢速HTTP拒絕服務攻擊經過不斷的演變和發展,主要有三種攻擊類型,分別是Slow headers、Slow body、Slow read。以Slow headers為例,Web應用在處理HTTP請求之前都要先接收完所有的HTTP頭部,因為HTTP頭部中包含了一些Web應用可能用到的重要的信息。攻擊者利用這點,發起一個HTTP請求,一直不停的發送HTTP頭部,消耗服務器的連接和內存資源。抓包數據可見,攻擊客戶端與服務器建立TCP連接后,每40秒才向服務器發送一個HTTP頭部,而Web服務器再沒接收到2個連續的\r\n時,會認為客戶端沒有發送完頭部,而持續的等等客戶端發送數據。如果惡意攻擊者客戶端持續建立這樣的連接,那么服務器上可用的連接將一點一點被占滿,從而導致拒絕服務。這種攻擊類型稱為慢速HTTP拒絕服務攻擊。

2 原理

是以極低的速度往服務器發送HTTP請求。由於Web Server對於並發的連接數都有一定的上限,因此若是惡意地占用住這些連接不釋放,那么Web Server的所有連接都將被惡意連接占用,從而無法接受新的請求,導致拒絕服務。

要保持住這個連接,RSnake構造了一個畸形的HTTP請求,准確地說,是一個不完整的HTTP請求。

  •         GET / HTTP/1.1\r\n
  •         HOST: host\r\n
  •         User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; )\r\n
  •         Content-Length: 42\r\n

在正常的HTTP包頭中,是以兩個CLRF表示HTTP Headers部分結束的。

由於Web Server只收到了一個\r\n,因此將認為HTTP Headers部分沒有結束,並保持此連接不釋放,繼續等待完整的請求。此時客戶端再發送任意HTTP頭,保持住連接即可。

X-a: b\r\n

當構造多個連接后,服務器的連接數很快就會達到上限。

3 測試工具SlowHTTPTest

安裝方法一:

1 安裝openssl和libssl-dev

  • sudo apt-get install openssl
  • sudo apt-get install libssl-dev

安裝libssl如果失敗,執行apt-get update,然后再執行sudo apt-get install libssl-dev

2 安裝slowhttptest

  • git clone https://github.com/shekyan/slowhttptest.git
  • cd slowhttptest
  • ./configure
  • make
  • make install

安裝方法二:

  • sudo apt-get install slowhttptest

使用:

測試http緩慢攻擊可以這樣,把url換成自己的:

  • slowhttptest -c 1000 -X -g -o -slow_read_stats -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u http://192.168.18.252/bWAPP/sm_dos_1.php  -p 8

 

參數:

  • -a  —開始開始值范圍說明符用於范圍頭測試
  • -b 將字節限制的范圍說明符用於范圍頭測試
  • – c 的連接數限制為65539
  • – d proxy host:port  用於指導所有流量通過web代理
  • – e proxy host:port  端口用於指導只有探針交通通過web代理
  • – h,B,R或x   指定減緩在頭部分或在消息體,- R 允許范圍檢驗,使慢讀測試- x
  • – g 生成統計數據在CSV和HTML格式,模式是緩慢的xxx。csv / html,其中xxx是時間和日期
  • – i seconds   秒間隔跟蹤數據在幾秒鍾內,每個連接
  • – k 管道因子次數重復請求在同一連接慢讀測試如果服務器支持HTTP管道內襯。
  • – l 在幾秒鍾內,秒測試時間
  • – n 秒間隔從接收緩沖區讀取操作
  • – o 文件定義輸出文件路徑和/或名稱,如果指定有效- g
  • – p 秒超時等待HTTP響應在探頭連接后,服務器被認為是不可訪問的
  • – r seconds   連接速度
  • – s 字節值的內容長度標題詳細說明,如果指定- b
  • – t verb   自定義
  • – u URL    目標URL,相同的格式鍵入瀏覽器,e。g https://host[:port]/
  • – v level  冗長等級0 – 4的日志
  • – w 字節范圍廣告的窗口大小會選擇從
  • – x 字節最大長度的跟蹤數據結束
  • – y 字節范圍廣告的窗口大小會選擇從
  • – z 字節從接收緩沖區讀取字節與單一的read()操作

4 解決辦法:

針對不同的Server其對慢速http拒絕服務攻擊防范方法也不同,建議使用以下措施防范慢速http拒絕服務攻擊:

 

WebSphere

========

 

  • 1、限制 HTTP 數據的大小

在WebSphere Application Server 中進行如下設置:

任何單個 HTTP 頭的默認最大大小為 32768 字節。可以將它設置為不同的值。

HTTP 頭的默認最大數量為 50。可以將它設置為不同的限制值。

另一種常見的 DOS 攻擊是發送一個請求,這個請求會導致一個長期運行的 GET 請求。WebSphere Application Server Plug-in 中的 ServerIOTimeoutRetry 屬性可限制任何請求的重試數量。這可以降低這種長期運行的請求的影響。

設置限制任何請求正文的最大大小。詳見參考鏈接。

 

  • 2、設置keepalive參數

打開ibm http server安裝目錄,打開文件夾conf,打開文件httpd.conf,查找KeepAlive值,改ON為OFF,其默認為ON。

這個值說明是否保持客戶與HTTP SERVER的連接,如果設置為ON,則請求數到達MaxKeepAliveRequests設定值時請求將排隊,導致響應變慢。

Weblogic

============

1、在配置管理界面中的協議->一般信息下設置 完成消息超時時間小於400

2、在配置管理界面中的協議->HTTP下設置 POST 超時、持續時間、最大 POST 大小為安全值范圍。

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。

 

Apache

============

 

建議使用mod_reqtimeout和mod_qos兩個模塊相互配合來防護。

1、mod_reqtimeout用於控制每個連接上請求發送的速率。配置例如:

#請求頭部分,設置超時時間初始為10秒,並在收到客戶端發送的數據后,每接收到500字節數據就將超時時間延長1秒,但最長不超過40秒。可以防護slowloris型的慢速攻擊。

RequestReadTimeout header=10-40,minrate=500

#請求正文部分,設置超時時間初始為10秒,並在收到客戶端發送的數據后,每接收到500字節數據就將超時時間延長1秒,但最長不超過40秒。可以防護slow message body型的慢速攻擊。

RequestReadTimeout body=10-40,minrate=500

需注意,對於HTTPS站點,需要把初始超時時間上調,比如調整到20秒。

 

2、mod_qos用於控制並發連接數。配置例如:

當服務器並發連接數超過600時,關閉keepalive

QS_SrvMaxConnClose 600

限制每個源IP最大並發連接數為50

QS_SrvMaxConnPerIP 50

這兩個數值可以根據服務器的性能調整。

 

 

IHS服務器

============

 

請您先安裝最新補丁包,然后啟用mod_reqtimeout模塊,在配置文件中加入:

LoadModule reqtimeout_module modules/mod_reqtimeout.so

為mod_reqtimeout模塊添加配置:

<IfModule mod_reqtimeout.c>

RequestReadTimeout header=10-40,MinRate=500 body=10-40,MinRate=500

</IfModule>

對於HTTPS站點,建議header=20-40,MinRate=500。

參見:http://www-01.ibm.com/support/docview.wss?uid=swg21652165

 

F5負載均衡修復建議

============

關於F5的慢速攻擊防護配置,請參考以下鏈接:

https://support.f5.com/kb/en-us/solutions/public/10000/200/sol10260.html

https://devcentral.f5.com/articles/mitigating-slow-http-post-ddos-attacks-with-irules-ndash-follow-up


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM