内容提要
本文介绍Java代码审计中的XXE(XML外部实体注入)漏洞。首先解释漏洞原理,即允许引用外部实体时可导致文件读取、命令执行等危害。然后通过代码示例分析有回显和无回显两种场景的利用方法,并介绍XInclude、Poi ooxml等变种攻击方式。最后提供代码审计时查找关键类和防御措施,如禁用DOCTYPE声明和外部实体。
延伸解读
审计定位:从解析器工厂到危险调用链
文章给出的关键字列表覆盖了Java中常见的XML解析入口,如DocumentBuilderFactory、SAXParser、TransformerFactory等。审计时,可优先搜索这些类,再追踪其parse或transform方法的调用点,确认是否直接处理了外部可控的XML输入。同时,注意检查是否显式开启了XInclude或外部实体支持,这往往是漏洞触发的前提。
变种攻击面:不止于XML解析器
除了常规的DocumentBuilder和SAXParser,文章还展示了XInclude、POI的OOXML解析以及xlsx-streamer等场景。这些变种说明,任何处理XML的组件都可能成为XXE入口,尤其是办公文档解析和配置文件读取。审计时,应扩大搜索范围,关注依赖库的版本和已知CVE,如CVE-2014-3529和CVE-2017-5644,及时升级修复。
防御要点:禁用外部实体与DOCTYPE
文章给出的防御代码核心是设置三个关键特性:禁用DOCTYPE声明、禁用外部通用实体和外部参数实体。对于XInclude场景,还需在启用XInclude的同时保持这些限制。实际开发中,应将这些设置封装为公共方法,避免遗漏。同时,建议使用安全的XML解析库或配置白名单,从源头降低风险。
Q&A
什么是XXE漏洞?
XXE是XML外部实体注入漏洞,当XML解析器允许引用外部实体时,攻击者可以构造恶意XML内容,导致任意文件读取、系统命令执行、内网端口探测等危害。
Java中如何审计XXE漏洞?
在Java代码审计中,可以查找解析XML的关键类,如DocumentBuilderFactory、SAXParser、TransformerFactory等,并检查是否禁用了外部实体。如果未禁用,则可能存在XXE漏洞。
XXE漏洞有哪些利用方式?
XXE漏洞的利用方式包括有回显读取文件、无回显通过外部平台(如ceye.io)验证、使用XInclude包含文件、以及通过Apache POI处理xlsx文件时触发XXE等。
如何防御XXE漏洞?
防御XXE漏洞的关键是禁用DOCTYPE声明和外部实体。在DocumentBuilderFactory中设置以下特性:disallow-doctype-decl为true,external-general-entities和external-parameter-entities为false。
XXE漏洞有哪些变种攻击方式?
XXE漏洞的变种攻击方式包括XInclude攻击、Apache POI处理xlsx文件时的XXE(如CVE-2014-3529和CVE-2017-5644)、以及xlsx-streamer XXE等。
无回显XXE如何验证?
无回显XXE可以通过使用外部平台(如ceye.io)进行验证。构造XML外部实体指向ceye.io的地址,如果收到请求则说明存在XXE漏洞。
Apache POI处理xlsx文件时如何触发XXE?
Apache POI处理xlsx文件时,如果解析XML时未禁用外部实体,攻击者可以构造恶意的xlsx文件,在[Content-Types].xml或xl/workbook.xml中注入外部实体,从而触发XXE。