亿笑笑XML DoS攻击如何工作?

<!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攻击。

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


Billion Laughs攻击是针对XML解析器的拒绝服务攻击。 亿笑攻击也被称为XML炸弹,或者更为深奥的是指数实体扩展攻击。 即使使用格式良好的XML,也可能发生十亿个笑的攻击,并且还可以通过XML模式验证。

以下所示的XML文件说明了香草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一个实例的lol9 。 然而,当DOM或SAX解析器解析这个时,遇到lol9时,它会扩展为10个lol8 ,每个扩展为10个lol7 ,等等。 当所有事情都扩展到文本lol ,就有100,000,000个字符串"lol"实例。 如果还有一个实体,或者lol被定义为10个“lol”字符串,那么会有一个十亿个“大声笑”,因此就是攻击的名字。 毋庸置疑,这样的扩展消耗了大量的资源和时间,导致了DOS。

我的博客上有更广泛的解释。


其中一种XML炸弹 - http://msdn.microsoft.com/zh-cn/magazine/ee335713.aspx

攻击者现在可以利用XML的这三个属性(替换实体,嵌套实体和内联DTD)来制作恶意XML炸弹。 攻击者使用嵌套实体编写一个XML文档,就像前面的示例一样,但不是嵌套深度一层,而是将他的实体嵌套深度很深。

还有一些代码可以保护这些“炸弹”(在.NET世界中):

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

<!ENTITY ha "Ha !">定义了一个实体, &ha; 扩大到"Ha !" 。 下一行定义了另一个实体&ha2; 扩展到"&ha; &ha;" 最终, "Ha ! Ha !"

&ha3; 变成Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! 等等,每次增加一倍。 如果你遵循这个模式, &haN;"Ha !" ,2N-1次,所以&ha128 ,扩大到2127 "Ha !" 这对于任何电脑来说都太大了。

链接地址: http://www.djcxy.com/p/88913.html

上一篇: How does the billion laughs XML DoS attack work?

下一篇: Is it necessary to write HEAD, BODY and HTML tags?