——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。
HTTP Post慢速DOS攻擊第一次在技術社區被正式披露是今年的OWASP大會上,由Wong Onn Chee 和 Tom Brennan共同演示了使用這一技術攻擊的威力。他們的slides在這里:
http://www.darkreading.com/galleries/security/application-security/228400167/slide-show-ddos-with-the-slow-http-post-attack.html
這個攻擊的基本原理如下:
針對任意HTTP Server,建立一個連接,指定一個比較大的content-length,然后以很低的速度發包,比如10-100s發一個字節,hold住這個連接不斷開。如果客戶端持續建立這樣的連接,那么服務器上可用的連接將很快被占滿,從而導致DOS.
這一攻擊引起我注意的原因有這幾點:
1. 它可以針對任意Web服務。HTTP協議在接收到request之前是無法對請求內容作校驗的,所以即使你的Web應用沒有可用form表單,這個攻擊一樣有效。
2. 廉價。在客戶端以單線程方式建立較大數量的無用連接,并保持持續發包的代價非常低廉。實際試驗中一臺普通PC可以建立的Socket連接在3000個以上。這對一臺普通的web server,將是致命的打擊。更不用說結合肉雞群做分布式DOS了。
為演示這個攻擊,我做了一個簡單的POC,C#代碼如下。
這段代碼向目標服務器的示例Web Server發起攻擊,每秒鐘向服務器post一個字節以保證連接不會過期。
這個攻擊對Apache的效果十分明顯,Apache的maxClients幾乎在瞬間被hold住,瀏覽器在攻擊進行期間無法訪問測試頁面。
但是針對IIS的攻擊被證明沒有效果,同時我還測試了公司使用最多的Jetty,有了更多有意思的發現。
在針對Jetty做測試時,我發現針對不同的Jetty Connector配置,攻擊的效果有天壤之別。
我們知道Jetty在配置Connector時,可以有NIO和BIO兩種模式供選擇。當使用BIO模式時,Jetty的max thread被瞬間耗盡,服務停止。但是在使用NIO模式時,即使客戶端的惡意socket連接數已經達到3000個,但是服務依然沒有受到任何影響。這個應該很好理解,由于這兩種模式下的Connector直接影響到服務端處理Socket的模型。IIS的情況我不是很清楚,但是猜測MS在實現時采用了NIO Socket模型。
詳細的配置情況,請參見Jetty的官方文檔。
其它的Web Server,我沒有做進一步測試。如有興趣請自行驗證。
目前針對Apache服務器,官方尚沒有解決方案出臺。建議:
1. 檢查日志,查找類似的錯誤報警:
[error] server reached MaxClients setting, consider raising the MaxClients setting
看看有沒有被這種攻擊盯上。
2. 調整防火墻設置。有條件的,在IPS上做一下規則設置。
注意這些都還只是暫時措施,因為這種攻擊的變化可能很多,事實上使用HTTP GET也可以達到一樣的效果。要知道GET也是可以傳輸數據的。
針對Jetty服務器,強烈建議使用NIO非阻塞模式,對服務器可以起到很好的保護作用。
相關閱讀:
1. New HTTP POST DDoS Attack Tools Released
2. Wong Onn Chee 和Tom Brennan的Paper
3. Using HTTP POST for denial of service
補充1:微軟的IIS實現了完成端口(IOCP),IO效率相當高。這解釋了為何此攻擊對IIS無效。
Powered by: BlogJava Copyright © rogerfan