
原 文:http://blog.fortify.com/blog/2012/01/04/Web-Server-DoS-by-Hash-Collision
翻譯整理:叡揚資訊 資訊安全事業處
大多數的網頁伺服器為了效能考量,都使用雜湊表(Hash Table)儲存來自瀏覽器的要求(Request)參數。當這些要求內含許多個參數,假設10,000個參數,且參數名稱的雜湊值都是相同的,此時,網頁伺服器將會耗費許多時間來剖析這些要求。於此狀況下,因為雜湊碰撞,將導致新增雜湊的動作,變得十分緩慢,進而造成網頁伺服器效能明顯下降,並可能導致阻斷服務(DoS)攻擊的情況發生。
如果程式語言不提供隨機雜湊函式,或是網頁伺服器無法辨識使用多重碰撞的攻擊,攻擊者便可藉由傳送眾多的碰撞鍵(Colliding Key),來讓雜湊表「變質」,以達到攻擊的目的。此時,插入n個項目到雜湊表的演算法複雜度會變成O(n**2);因此,使用單一個 HTTP 要求可能會耗用CPU數小時的時間,達到阻斷服務攻擊之目的。
以前就有人撰文提及雜湊表會造成阻斷服務,但是從沒有人真正知道要如何去產生大量的多重碰撞字串,直到2011年12月28日在德國柏林所舉辦的第28屆Chaos Communication Congress(簡稱 28C3)之後,才有實際的攻擊示範出現。
Alexander Klink與Julian Wälde在該會場演講《Efficient Denial of Service Attacks on Web Application Platforms》指出,大部分的字串雜湊函式不是以 DJBX33A (Dan Bernstein's times 33, addition)演算法、就是DJBX33X(Dan Bernstein's times 33, XOR)演算法為基礎,這2個演算法分別存在「等價子字串」(Equivalent substrings)與「中途相遇」(Meet-in-the-middle)攻擊的弱點。
DJBX33A有個特性,如果兩個字串碰撞,例如:
hash('GSS') = hash('655')
雜湊之後,在相同位置也有這樣的子字串,例如:
hash('prefixGSSpostfix') = hash('prefix655postfix')
因此,我們可以輕易地產生碰撞字串的初始字串,比方說:GSSGSS、GSS655、655GSS …等。
至於DJBX33X演算法不會有「等價子字串」弱點,但是會有「中途相遇」的弱點。藉由「中途相遇」手法,攻擊者大約有1/2^16的機會可以取得碰撞字串,以便輕鬆地進行搜尋。Alexander Klink與Julian Wälde使用這些技術,成功地在下列伺服器進行 DoS 攻擊:
|
伺服器 |
結果 |
|---|---|
|
PHP |
|
|
ASP.NET |
|
|
Java Tomcat6 |
|
|
Python(僅32 位元) |
|
|
Ruby |
|

1. 《Efficient Denial of Service Attacks on Web Application Platforms》報告原文:
http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf
2. n.runs-SA-2011.004 Advisory:
http://www.nruns.com/_downloads/advisory28122011.pdf