XML注入漏洞是什么 如何防御XXE外部实体注入攻击

2次阅读

xxe漏洞防御关键在于解析器初始化时禁用外部实体:java需同时关闭doctype声明和外部通用实体;php 8.0+应弃用libxml_disable_entity_loader,改用libxml_set_external_entity_loader(NULL);python须用defusedxml替代原生elementtree;waf和正则过滤无法替代解析器配置。

XML注入漏洞是什么 如何防御XXE外部实体注入攻击

XXE漏洞不是“有没有”,而是“解析器是否默认放行外部实体”——绝大多数风险,源于没关掉DOCTYPESYSTEM实体加载。

Java里DocumentBuilder怎么禁用外部实体

Java老项目常直接用DocumentBuilderFactory + DocumentBuilder,但默认不阻止DTD,一解析恶意XML就中招。

  • 必须显式关闭两个关键特性:http://apache.org/xml/features/disallow-doctype-decl(禁止DOCTYPE声明)和http://xml.org/sax/features/external-general-entities(禁用通用外部实体)
  • 别只设一个,漏掉external-parameter-entities可能被参数实体绕过
  • 示例代码中常见错误:只调setFeature("disallow-doctype-decl", true),却没关external-general-entities,攻击者仍可用%xxe;触发

PHP的libxml_disable_entity_loader为什么在8.0+失效了

PHP 8.0起libxml_disable_entity_loader()已被废弃,且默认行为已改为禁用外部实体——但旧代码若还留着这行,反而可能掩盖真实配置问题。

  • 真正该检查的是libxml_set_external_entity_loader(null)或确保没手动启用LIBXML_NOENT等危险选项
  • 使用simplexml_load_string()DOMDocument::loadXML()前,务必确认libxml_disable_entity_loader(true)没被误调(PHP 7.x需用,8.x调了会报Deprecated警告)
  • 注意php.ini里的expect://等协议是否开启——XXE配合expect可直接执行命令,比读文件更致命

Python用xml.etree.ElementTree有风险吗

有,而且非常隐蔽。xml.etree.ElementTree默认不解析DOCTYPE,看似安全,但一旦调用parse()时传入含DOCTYPE的XML,且底层用的是系统libxml2(如某些linux发行版预编译包),就可能回退到不安全行为。

  • 绝对不要用原生xml.etree.ElementTree处理用户输入的XML;改用defusedxml库的DefusedXMLParser
  • defusedxml不仅禁用外部实体,还限制递归深度、实体展开大小,防爆破和DoS
  • 如果必须用标准库,至少加一层校验:正则匹配/code>或<code><!--.*?-->并拒绝,但注意注释绕过(如
text=ZqhQzanResources