ysoserial-payloads-CommonsCollections2调试分析
字数 1646 2025-08-25 22:59:09

Java反序列化漏洞分析:CommonsCollections2 Payload详解

1. 环境准备与工具介绍

测试环境

  • commons-collections-4.0
  • Java版本: 1.8.0_112

关键工具

  • Ysoserial: 用于生成反序列化payload的工具
  • Javassist: 动态操作Java字节码的类库

Javassist核心类

  • ClassPool: 基于Hashtable实现的CtClass对象容器
  • CtClass: 表示类对象,可处理class文件
  • CtMethods: 表示类中的方法
  • CtFields: 表示类中的字段

2. Javassist基础操作

创建ClassPool对象

ClassPool pool = ClassPool.getDefault();

添加类搜索路径

pool.insertClassPath(new ClassClassPath(this.getClass()));
// 或添加目录路径
// pool.insertClassPath("/usr/local/javalib");

获取并修改CtClass对象

CtClass ctClass = pool.get("XXXXX");
ctClass.setSuperclass(pool.get("XXXXXX"));
byte[] b = ctClass.toBytecode(); // 获取修改后的字节码
Class clazz = ctClass.toClass(); // 转换为Class对象

3. PriorityQueue分析

PriorityQueue是一个基于优先级的无界队列,关键特性:

  • 元素必须实现Comparable接口,或构造时提供Comparator
  • 排序决定出队优先级

关键构造函数

public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) {
    if (initialCapacity < 1)
        throw new IllegalArgumentException();
    this.queue = new Object[initialCapacity];
    this.comparator = comparator;
}

4. CommonsCollections2 Payload生成流程

4.1 入口点

ysoserial.GeneratePayload#mainUtils.getPayloadClass → 加载ysoserial.payloads.CommonsCollections2

4.2 getObject方法核心流程

  1. 创建TemplatesImpl对象:

    TemplatesImpl templates = Gadgets.createTemplatesImpl(command);
    
  2. 使用Javassist生成恶意类:

    • 创建ClassPool并添加类搜索路径
    • 获取StubTransletPayload类字节码
    • 构造恶意命令执行代码字符串
    • 修改构造函数字节码插入恶意代码
    • 设置父类为AbstractTranslet
    • 获取最终字节码并通过反射放入TemplatesImpl的_bytecodes成员
  3. 构造Transformer链:

    InvokerTransformer invokerTransformer = new InvokerTransformer("toString", new Class[0], new Object[0]);
    TransformingComparator transformingComparator = new TransformingComparator(invokerTransformer);
    
  4. 创建PriorityQueue:

    PriorityQueue<Object> queue = new PriorityQueue<Object>(2, transformingComparator);
    
  5. 反射修改关键字段:

    • 修改InvokerTransformeriMethodNamenewTransformer
    • TemplatesImpl实例放入PriorityQueuequeue数组

5. Gadget调用链分析

完整调用链:

ObjectInputStream.readObject()
PriorityQueue.readObject()
...
TransformingComparator.compare()
InvokerTransformer.transform()
Method.invoke()
Runtime.exec()

详细执行流程

  1. 反序列化触发点:

    • PriorityQueue.readObject()执行默认反序列化
    • 自定义反序列化queue成员数组
  2. 排序触发恶意代码:

    • heapify()siftDown()siftDownUsingComparator()
    • TransformingComparator.compare()调用InvokerTransformer.transform()
  3. 反射执行:

    • 通过反射调用TemplatesImpl.newTransformer()
    • newTransformer()getTransletInstance()defineTransletClasses()
    • 使用loader.defineClass加载恶意字节码
    • 实例化恶意类触发命令执行

6. 关键类与方法

TemplatesImpl关键方法

  • newTransformer(): 入口方法
  • getTransletInstance(): 获取转换器实例
  • defineTransletClasses(): 定义转换器类

反序列化关键点

  • PriorityQueuereadObject方法重写
  • TransformingComparator的比较操作触发transform

7. 防御建议

  1. 升级commons-collections到安全版本
  2. 使用Java反序列化过滤器
  3. 避免反序列化不可信数据
  4. 使用白名单机制控制可反序列化的类

8. 参考资源

Java反序列化漏洞分析:CommonsCollections2 Payload详解 1. 环境准备与工具介绍 测试环境 commons-collections-4.0 Java版本: 1.8.0_ 112 关键工具 Ysoserial : 用于生成反序列化payload的工具 Javassist : 动态操作Java字节码的类库 Javassist核心类 ClassPool : 基于Hashtable实现的CtClass对象容器 CtClass : 表示类对象,可处理class文件 CtMethods : 表示类中的方法 CtFields : 表示类中的字段 2. Javassist基础操作 创建ClassPool对象 添加类搜索路径 获取并修改CtClass对象 3. PriorityQueue分析 PriorityQueue是一个基于优先级的无界队列,关键特性: 元素必须实现Comparable接口,或构造时提供Comparator 排序决定出队优先级 关键构造函数 4. CommonsCollections2 Payload生成流程 4.1 入口点 ysoserial.GeneratePayload#main → Utils.getPayloadClass → 加载 ysoserial.payloads.CommonsCollections2 4.2 getObject方法核心流程 创建TemplatesImpl对象 : 使用Javassist生成恶意类 : 创建 ClassPool 并添加类搜索路径 获取 StubTransletPayload 类字节码 构造恶意命令执行代码字符串 修改构造函数字节码插入恶意代码 设置父类为 AbstractTranslet 获取最终字节码并通过反射放入TemplatesImpl的 _bytecodes 成员 构造Transformer链 : 创建PriorityQueue : 反射修改关键字段 : 修改 InvokerTransformer 的 iMethodName 为 newTransformer 将 TemplatesImpl 实例放入 PriorityQueue 的 queue 数组 5. Gadget调用链分析 完整调用链: 详细执行流程 反序列化触发点 : PriorityQueue.readObject() 执行默认反序列化 自定义反序列化 queue 成员数组 排序触发恶意代码 : heapify() → siftDown() → siftDownUsingComparator() TransformingComparator.compare() 调用 InvokerTransformer.transform() 反射执行 : 通过反射调用 TemplatesImpl.newTransformer() newTransformer() → getTransletInstance() → defineTransletClasses() 使用 loader.defineClass 加载恶意字节码 实例化恶意类触发命令执行 6. 关键类与方法 TemplatesImpl关键方法 newTransformer() : 入口方法 getTransletInstance() : 获取转换器实例 defineTransletClasses() : 定义转换器类 反序列化关键点 PriorityQueue 的 readObject 方法重写 TransformingComparator 的比较操作触发transform 7. 防御建议 升级commons-collections到安全版本 使用Java反序列化过滤器 避免反序列化不可信数据 使用白名单机制控制可反序列化的类 8. 参考资源 Java反序列化安全指南 Ysoserial项目 Javassist官方文档