緩慢的HTTP拒絕服務(wù)攻擊
今天其他部門的研發(fā)找我說被客戶說有個漏洞,問修復(fù)建議。
對任何一個開放了http訪問的服務(wù)器,先建立一個連接,指定一個比較大的content-length,然后以非常低的速度發(fā)包,比如1-10s發(fā)一個字節(jié),然后維持這個連接不斷開。如果客戶端持續(xù)建立這樣的連接,那么服務(wù)器的可用連接將一點一點被占滿,從而導(dǎo)致拒絕服務(wù)。
和CC攻擊一樣,只要Web服務(wù)器開放了Web服務(wù),那么它就可以是一個靶子,HTTP協(xié)議在接收到request之前是不對請求內(nèi)容作校驗的,所以即使你的Web應(yīng)用沒有可用的form表單,這個攻擊一樣有效。
在客戶端以單線程方式建立較大數(shù)量的無用連接,并保持持續(xù)發(fā)包的代價非常的低廉。實際試驗中一臺普通PC可以建立的連接在3000個以上。這對一臺普通的Web server,將是致命的打擊。更不用說結(jié)合肉雞群做分布式DoS了。
對任何一個開放了HTTP訪問的服務(wù)器HTTP服務(wù)器,先建立了一個連接(三次握手),指定一個比較大的content-length,然后以非常低的速度發(fā)包,比如1-10s發(fā)一個字節(jié),然后維持住這個連接不斷開。如果客戶端持續(xù)建立這樣的連接,那么服務(wù)器上可用的連接將一點一點被占滿,從而導(dǎo)致拒絕服務(wù)。
慢速攻擊的分類:
Slow headers:Web應(yīng)用在處理HTTP請求之前都要先接收完所有的HTTP頭部,因為HTTP頭部中包含了一些Web應(yīng)用可能用到的重要的信息。攻擊者利用這點,發(fā)起一個HTTP請求,一直不停的發(fā)送HTTP頭部,消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,攻擊客戶端與服務(wù)器建立TCP連接后,每30秒才向服務(wù)器發(fā)送一個HTTP頭部,而Web服務(wù)器再沒接收到2個連續(xù)的\r\n時,會認為客戶端沒有發(fā)送完頭部,而持續(xù)的等等客戶端發(fā)送數(shù)據(jù)。
Slow body:攻擊者發(fā)送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務(wù)器或代理認為客戶端要發(fā)送很大的數(shù)據(jù)。服務(wù)器會保持連接準備接收數(shù)據(jù),但攻擊客戶端每次只發(fā)送很少量的數(shù)據(jù),使該連接一直保持存活,消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,攻擊客戶端與服務(wù)器建立TCP連接后,發(fā)送了完整的HTTP頭部,POST方法帶有較大的Content-Length,然后每10s發(fā)送一次隨機的參數(shù)。服務(wù)器因為沒有接收到相應(yīng)Content-Length的body,而持續(xù)的等待客戶端發(fā)送數(shù)據(jù)。
Slow read:客戶端與服務(wù)器建立連接并發(fā)送了一個HTTP請求,客戶端發(fā)送完整的請求給服務(wù)器端,然后一直保持這個連接,以很低的速度讀取Response,比如很長一段時間客戶端不讀取任何數(shù)據(jù),通過發(fā)送Zero Window到服務(wù)器,讓服務(wù)器誤以為客戶端很忙,直到連接快超時前才讀取一個字節(jié),以消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,客戶端把數(shù)據(jù)發(fā)給服務(wù)器后,服務(wù)器發(fā)送響應(yīng)時,收到了客戶端的ZeroWindow提示(表示自己沒有緩沖區(qū)用于接收數(shù)據(jù)),服務(wù)器不得不持續(xù)的向客戶端發(fā)出ZeroWindowProbe包,詢問客戶端是否可以接收數(shù)據(jù)。
測試工具:
SlowHttpTest
sudo apt-get install slowhttptest
Slow headers攻擊
slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u https://x.x.x.x -x 24 ?-p 3
Slow body攻擊
slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u https://x.x.x.x -x 10 -p 3
Slow read攻擊
slowhttptest -c 8000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u https://x.x.x.x -p 3
解決方案:
可以部署waf防護設(shè)備進行防護,也可以在本地進行緩解。
針對不同的Server其對慢速http拒絕服務(wù)攻擊防范方法也不同:
WebSphere
1、限制 HTTP 數(shù)據(jù)的大小
在WebSphere Application Server 中進行如下設(shè)置:
任何單個 HTTP 頭的默認最大大小為 32768 字節(jié)。可以將它設(shè)置為不同的值。
HTTP 頭的默認最大數(shù)量為 50??梢詫⑺O(shè)置為不同的限制值。
另一種常見的 DOS 攻擊是發(fā)送一個請求,這個請求會導(dǎo)致一個長期運行的 GET 請求。WebSphere Application Server Plug-in 中的 ServerIOTimeoutRetry 屬性可限制任何請求的重試數(shù)量。這可以降低這種長期運行的請求的影響。
設(shè)置限制任何請求正文的最大大小。
2、設(shè)置keepalive參數(shù)
打開ibm http server安裝目錄,打開文件夾conf,打開文件httpd.conf,查找KeepAlive值,改ON為OFF,其默認為ON。
這個值說明是否保持客戶與HTTP SERVER的連接,如果設(shè)置為ON,則請求數(shù)到達MaxKeepAliveRequests設(shè)定值時請求將排隊,導(dǎo)致響應(yīng)變慢。
詳見參考鏈接:
http://www.ibm.com/developerworks/cn/websphere/techjournal/1210_lansche/1210_lansche.html#new-step32
Weblogic
1、在配置管理界面中的協(xié)議->一般信息下設(shè)置 完成消息超時時間小于200
2、在配置管理界面中的協(xié)議->HTTP下設(shè)置 POST 超時、持續(xù)時間、最大 POST 大小為安全值范圍。
http://docs.oracle.com/cd/E12890_01/ales/docs32/integrateappenviron/configWLS.html#wp1101063
Nginx
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ù)脑黾樱?br>3、對于會話或者相同的ip地址,可以使用HttpLimitReqModule and HttpLimitZoneModule參數(shù)去限制請求量或者并發(fā)連接數(shù);
4、根據(jù)CPU和負載的大小,來配置worker_processes 和 worker_connections的值,公式是:max_clients = worker_processes * worker_connections。
Apache
建議使用mod_reqtimeout和mod_qos兩個模塊相互配合來防護。
1、mod_reqtimeout用于控制每個連接上請求發(fā)送的速率。配置例如:
#請求頭部分,設(shè)置超時時間初始為10秒,并在收到客戶端發(fā)送的數(shù)據(jù)后,每接收到500字節(jié)數(shù)據(jù)就將超時時間延長1秒,但最長不超過40秒??梢苑雷oslowloris型的慢速攻擊。
RequestReadTimeout header=10-40,minrate=500
#請求正文部分,設(shè)置超時時間初始為10秒,并在收到客戶端發(fā)送的數(shù)據(jù)后,每接收到500字節(jié)數(shù)據(jù)就將超時時間延長1秒,但最長不超過40秒。可以防護slow message body型的慢速攻擊。
RequestReadTimeout body=10-40,minrate=500
需注意,對于HTTPS站點,需要把初始超時時間上調(diào),比如調(diào)整到20秒。
示例:
LoadModule reqtimeout_module modules/mod_reqtimeout.so
<IfModule reqtimeout_module>
? ? ? ?RequestReadTimeout header=10-40,minrate=500 body=10-40,minrate=500
</IfModule>
2、mod_qos用于控制并發(fā)連接數(shù)。配置例如:
當服務(wù)器并發(fā)連接數(shù)超過600時,關(guān)閉keepalive
QS_SrvMaxConnClose 600
限制每個源IP最大并發(fā)連接數(shù)為50
QS_SrvMaxConnPerIP 50
這兩個數(shù)值可以根據(jù)服務(wù)器的性能調(diào)整。
更多關(guān)于qos_module配置參考:
http://mod-qos.sourceforge.net/dos.html
示例:
LoadModule qos_module modules/mod_qos.so
<IfModule qos_module>
QS_SrvMaxConnClose 600
QS_SrvMaxConnPerIP 50
</IfModule>
IHS服務(wù)器
請您先安裝最新補丁包,然后啟用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
對于HTTPS站點,建議header=20-40,MinRate=500。
參見:
http://www-01.ibm.com/support/docview.wss?uid=swg21652165
F5負載均衡
F5負載均衡設(shè)備有相應(yīng)的防護模塊,如無購買可參考附件中的詳細配置過程。
關(guān)于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
IIS服務(wù)器
IIS可配置相關(guān)網(wǎng)站的Web.config如下:
1、WebLimits設(shè)置:
<configuration>
? ?<system.applicationHost>
? ? ? ?<webLimits connectionTimeout="00:00:30"
? ? ? ?headerWaitTimeout="00:00:10"
? ? ? ?dynamicIdleThreshold="150"
? ? ? ?minBytesPerSecond="512"
? ?/>
? ?</system.applicationHost>
</configuration>
參考以下鏈接:
https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/weblimits#configuration
2、headerLimits設(shè)置:
<configuration>
<system.webServer>
?<security>
? <requestFiltering>
? ?<requestLimits>
? ? <headerLimits>
? ? <add header="Content-type" sizeLimit="100" />
? ? </headerLimits>
? ?</requestLimits>
? </requestFiltering>
?</security>
</system.webServer>
</configuration>