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#main → Utils.getPayloadClass → 加载ysoserial.payloads.CommonsCollections2
4.2 getObject方法核心流程
-
创建TemplatesImpl对象:
TemplatesImpl templates = Gadgets.createTemplatesImpl(command); -
使用Javassist生成恶意类:
- 创建
ClassPool并添加类搜索路径 - 获取
StubTransletPayload类字节码 - 构造恶意命令执行代码字符串
- 修改构造函数字节码插入恶意代码
- 设置父类为
AbstractTranslet - 获取最终字节码并通过反射放入TemplatesImpl的
_bytecodes成员
- 创建
-
构造Transformer链:
InvokerTransformer invokerTransformer = new InvokerTransformer("toString", new Class[0], new Object[0]); TransformingComparator transformingComparator = new TransformingComparator(invokerTransformer); -
创建PriorityQueue:
PriorityQueue<Object> queue = new PriorityQueue<Object>(2, transformingComparator); -
反射修改关键字段:
- 修改
InvokerTransformer的iMethodName为newTransformer - 将
TemplatesImpl实例放入PriorityQueue的queue数组
- 修改
5. Gadget调用链分析
完整调用链:
ObjectInputStream.readObject()
PriorityQueue.readObject()
...
TransformingComparator.compare()
InvokerTransformer.transform()
Method.invoke()
Runtime.exec()
详细执行流程
-
反序列化触发点:
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反序列化过滤器
- 避免反序列化不可信数据
- 使用白名单机制控制可反序列化的类