Java反序列化漏洞Apache CommonsCollections分析
cc链,既为Commons-Collections利用链。此篇文章为cc链的第一条链CC1。而CC1目前用的比较多的有两条链,LazyMap和TransformedMap。在ysoserial工具中,利用的是LazyMap链,而我们此篇分析的则是TransformedMap链。
1.本文所需前置知识
java反序列化基础
java反射基础
2.实验环境
JDK1.7.0_80
commons-collections-3.2.1
3.分析
3.1 Transformer接口
打开org.apache.commons.collections.Transformer类,可以看到源码中对该类的解释是从一个对象变为另一个对象(Transforms the input object (leaving it unchanged) into some output object.),如下图所示:

下面我们使用一个例子来解释这个类的作用:

当输入Runtime.class时输出了类的类型

我们要进行对象的转变时候,对应的操作应该在transform方法中。
Ctrl+H 查找实现了Transformer接口的类,重点关注以下几个类ConstantTransformer,invokerTransformer,ChainedTransformer。我们通过分析这几个类来构造payload。
3.2 ConstantTransformer
该类使用了Transformer的接口,重写了transformer的方法

transformer返回了iConstant变量,而这个变量在ConstantTransformer方法中被赋值。我们使用这个方法看下作用。

在return iConstant;处设置断点,运行程序查看返回值,发现这里返回的是Runtime.class

3.3 InvokerTransformer
查看源码说是通过反射创建一个新的对象(Transformer implementation that creates a new object instance by reflection.)
来到InvokerTransformer的transform方法:

可以明显看到这里使用了反射的方式来调用对象的方法,还有有几个变量iMethodName,iParamTypes,iArgs
这几个变量是通过public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args)这个构造函数传入。

利用构造函数传入值,调用transform方法
查看InvokerTransformer源码找到
iParamTypes为Class[]集合
iArgs为Obeject[]集合

再查看getMethod源码得知getMethod要传入二个参数,类型为String,Class[]

同理invoke也要传入两个参数Object,Object[]

构造出方法并执行:

可以看到这里反射出了Runtime.getRuntime()的方法,而我们要构造出Runtime.getRuntime().exec();怎么办呢,这里再介绍一个类ChainedTransformer
3.4 ChainedTransformer
查看源码transf