XML 格式广泛用于 Web 应用程序的各种功能,包括身份验证、文件传输和图像上传或者只是将 HTTP 数据从客户端传输到服务器并返回。
XML 文档可以包含 文档类型定义 ( DTD) 它定义了 XML 文档的结构及其包含的数据。
注意:&file; 是实体,而不是外部实体。
这些DTD可以从外部加载或在文件本身的DOCTYPE标签中声明
以下是一个DTD,它定义了一个名为file的XML实体
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
<!ENTITY file "Hello!">
]>
<example>&file;</example> # &file; = Hello!
复制代码
我们可以将XML的实体,理解于类似编程语言中的变量:即,&file; = Hello!
XML 文档还可以使用外部实体通过 URL 访问本地或远程内容。
当语法中使用SYSTEM 关键字时,则该实体是外部实体,其值将从URL加载
URL可以从本地文件系统中加载,也可以从互联网中加载
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
<!ENTITY file SYSTEM "file:///example.txt">
]>
<example>&file;</example>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
<!ENTITY file SYSTEM "http://example.com/index.html">
]>
<example>&file;</example>
复制代码
实体与外部实体我们知道了,XML外部实体的由来,也能够区分它们的一纸之隔(有没有语法SYSTEM 关键字的定义)
不管是什么实体(如果用户可以控制 XML 实体或外部实体的值),则可以基于xml技术后的各种网站业务功能点(比如,实际网站在使用此技术上传文件)或者此技术的解析引擎来产生各种漏洞。
已知的威胁来自于两点
1.攻击者可以控制实体的值。
2.xml解析器错误的配置为从输入的地方读取xml文档时解析和评估 DTD,攻击者可以声明自己的外部实体以实现恶意结果。
此类攻击称为 XML 外部实体攻击,或 XXEs。 防御防止 XXE 就是限制 XML 解析器的功能。因为 XXE 攻击需要 DTD 处理,应该尽可能禁用 XML 解析器上的 DTD 处理。
如果无法完全禁用 DTD,您可以禁用外部实体、参数实体。
为了防止基于 XXE 的 DoS,您可以限制 XML 解析器的解析时间和解析深度。您还可以完全禁用实体的扩展。
禁用 DTD 处理和配置解析器行为的机制因使用的 XML 解析器而异。
比如:PHP XML 解析器,需要设置 libxml_disable_entity_loader 为 TRUE来禁用外部实体。
其他语言的最佳配置与实践请参考owasp备忘单,以及各种官方文档与静态分析软件的官网文档 https://github.com/OWASP/CheatSh ... tion_Cheat_Sheet.md 甲骨文的最佳实践建议 静态代码分析sonarsource的最佳实践建议 https://rules.sonarsource.com/java?search=XXE
另一条防御角度是输入验证,黑白名单等
为了防止盲XXE,可以禁止出站的网络流量。 XXE的特征值在使用bp基于功能点的观察与抓包时,<?xml是最明显的一个提示,告诉您该站点在使用XML技术
还要注意base64编码,LD94bWw,表示<?xml
还可以强制应用程序解析 XML 数据。即,网站明确的表现为在收发json数据,那能不能将此数据交换强制置为xml技术?配置上的失误与一些不安全的默认项,使其变为现实。
修改content-type头,强制输入xml格式的数据
XInclude攻击有时无法控制整个 XML 文档或编辑 XML 文档的 DTD。但是,如果目标应用程序接受用户输入并将其插入到后端的 XML 文档中,仍然可以利用 XXE 漏洞。
XInclude 是一个特殊的 XML 特性,它从名为 xi:include 的单个 XML 标记构建一个单独的 XML 文档。如果可以控制传递到 XML 文档中的单个未经处理的数据,就可以在该值中放置 XInclude 攻击。
输入点payload如下,响应包观察特征值
引用http://www.w3.org/2001/XInclude命名空间,以识别xi:include标签的功能性特殊含义