一文掌握 Java XXE 漏洞原理、利用与防御姿势
一文掌握 Java XXE 漏洞原理、利用与防御姿势
原创 火力猫 季升安全 2025-04-18 14:13
🧨 Java XXE 漏洞审计大全
一看就懂、二看就能用、三看就能把审计搞定!
🧠 一、什么是 XXE?
XXE(XML External Entity)漏洞
是利用 XML 的“外部实体”功能,让服务器读取本地文件或访问远程地址(如 SSRF)。常见后果:
– 读取文件(/etc/passwd
等)
-
内网打点(SSRF)
-
内存攻击(DoS)
-
数据外带(OOB 数据 exfiltration)
🕵️♀️ 二、审计思路总览
重点审计点 | 说明 |
---|---|
是否解析 XML? | 关键类如:DocumentBuilder , SAXParser , SAXReader , SAXBuilder 等 |
是否接收用户输入? | XML 来源是否用户可控?如从 HTTP 请求中接收 |
是否禁用了 DTD 和实体? | 未配置 setFeature(..., false) 就危险 |
是否使用了第三方 XML 解析框架? | 如 XStream , JAXB , Digester |
🧪 三、漏洞分类+示例详解
① DocumentBuilderFactory(最常见)
📍 审计关注点
:是否使用 DocumentBuilderFactory.newInstance()
并缺少安全配置。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(new InputSource(new StringReader(xml)));
🛠 漏洞利用
:
<?xml version="1.0"?><!DOCTYPE root [<!ENTITY xxeSYSTEM"file:///etc/passwd">]><root>&xxe;</root>
🔍 问题分析:
默认情况下没有禁用外部实体(例如 setFeature(“…external-general-entities”, false)
),会导致解析器去访问本地文件。
② SAXParserFactory
📍 审计关注点
:工厂是否创建了 SAXParser
,是否缺少 feature 设置。
SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();parser.parse(new InputSource(new StringReader(xml)), new DefaultHandler());
🛠 利用方式
:与上面相同,可注入恶意实体。
🔍 问题分析
:SAX 解析器默认也支持 DTD 和实体,攻击者可植入恶意内容。
③ SAXReader(dom4j)
📍 审计关注点
:是否直接使用 SAXReader.read()
,XML 是否用户可控。
SAXReader reader = new SAXReader();Document doc = reader.read(new StringReader(xml));
🛠 利用 XML
:
<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxeSYSTEM"file:///etc/shadow">]><foo>&xxe;</foo>
🔍 问题分析
:SAXReader
默认没有禁用外部实体功能,是 XXE 高危区。
④ SAXBuilder(JDOM)
📍 审计关注
:是否使用 SAXBuilder.build()
方法,尤其是参数是用户输入。
SAXBuilder builder = new SAXBuilder();Document doc = builder.build(new StringReader(xml));
🛠 利用 XML
:同样可读文件。
🔍 问题分析
:JDOM 1.x 默认启用实体支持,攻击者可用 XXE 注入。
⑤ XMLReader
📍 审计关注点
:XMLReaderFactory.createXMLReader()
创建的对象是否设置安全特性?
XMLReader reader = XMLReaderFactory.createXMLReader();reader.parse(new InputSource(new StringReader(xml)));
🛠 利用 XML
:一模一样的恶意 DTD。
🔍 问题分析
:XMLReader
属于 SAX 机制,同样默认支持实体,需手动禁用。
⑥ Digester(Apache Commons)
📍 审计关注点
:调用 digester.parse()
时的 XML 来源是否可控?
Digester digester = new Digester();Object result = digester.parse(new StringReader(xml));
🛠 利用方式
:和上面一样注入恶意实体。
🔍 问题分析
:Digester 使用 SAX 解析器作为底层,继承其危险特性。
⑦ XMLInputFactory(StAX 解析器)
📍 审计关注
:是否设置了 IS_SUPPORTING_EXTERNAL_ENTITIES
、SUPPORT_DTD
XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader xsr = factory.createXMLStreamReader(new StringReader(xml));
🛠 漏洞利用(SSRF)
:
<?xml version="1.0"?><!DOCTYPE data [<!ENTITY xxeSYSTEM"http://internal-service.local:8080/api">]><data>&xxe;</data>
🔍 问题分析:
默认情况下 IS_SUPPORTING_EXTERNAL_ENTITIES = true
。
⑧ XStream
📍 审计关注点
:是否使用 fromXML()
并允许用户提交的 XML。
XStream xstream = new XStream();xstream.fromXML(xml);
🛠 漏洞利用
:
<!DOCTYPE foo [<!ENTITY xxeSYSTEM"file:///etc/hosts">]><foo>&xxe;</foo>
🔍 问题分析
:XStream 本身功能强大,低版本支持实体 + 任意类反序列化,属于超级高危点。
⑨ JAXB(Java 原生 XML 映射)
📍 审计关注
:是否直接使用 unmarshaller.unmarshal()
,是否传入外部 XML。
JAXBContext ctx = JAXBContext.newInstance(Foo.class);Unmarshaller unmarshaller = ctx.createUnmarshaller();unmarshaller.unmarshal(new StringReader(xml));
🛠 利用方式
:仍可注入 DTD。
🔍 问题分析
:JAXB 内部使用 DocumentBuilderFactory
,如果未配置安全特性就有风险。
📌 四、XXE 审计关键词清单
|
|
---|---|
DocumentBuilderFactory |
|
newDocumentBuilder() |
|
parse( |
|
SAXParserFactory
newSAXParser() |
|
SAXReader |
|
SAXBuilder |
|
XMLInputFactory |
|
Digester |
|
XStream
fromXML |
|
Unmarshaller
JAXBContext |
|
setFeature |
|
SUPPORT_DTD
IS_SUPPORTING_EXTERNAL_ENTITIES |
|
✅ 五、总结
🧭 看代码时,重点关注3个问题:
1. 有没有 XML 解析?
(关键词+代码)
-
用户能不能控制 XML 内容?
-
有没有禁用外部实体和 DTD?
-
上面主要类型,在代码中未发现 setFeaturesetProperty
的相关配置大概率就有问题 -
防护常见写法👉Java XXE 防护实战:常见漏洞场景与防御代码全收录