新起点
XML外部实体攻击
2020-12-03 07:18:21

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

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

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

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

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

 <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo ><foo>&xxe;</foo>

远程代码执行

当PHP载入“expect”模块时,攻击者可使用修改过的载荷来执行远程代码(英语:remote code execution)。

 <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo >     <creds>        <user>&xxe;</user>        <pass>mypass</pass>     </creds>

泄露/etc/passwd或其他目标文件

  <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo ><foo>&xxe;</foo>   <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo ><foo>&xxe;</foo>   <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo ><foo>&xxe;</foo>   <?xml version="1.0" encoding="ISO-8859-1"?>  <!DOCTYPE foo ><foo>&xxe;</foo>

缓和方案

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

相关:

网站公告: