CommonsCollections3


触发POC

需要导入

 

利用ysoserial生成payload:

得到

这条链只能在jdk7下触发,于是在IDEA中将java版本切回1.7

成功弹出计算器

 

分析利用链

利用链差不多算是将CC1CC2结合了,不过也少许不同

Step 0

入口点还是sun.reflect.annotation.AnnotationInvocationHandler

同样还是利用动态代理机制来触发invoke()

触发invoke()后利用链又是

 

 

Step 1

CC1是利用org.apache.commons.collections.functors.InvokerTransformer 其中的 transform()方法进一步来RCE的

CC3这里换成了org.apache.commons.collections.functors.InstantiateTransformertransform()方法

作用是获取input类的构造方法,并将其实例化

现在要找到一个可以利用其构造方法的类

 

Step 2

这里用到了com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter

public的单参数构造方法

且其中第64行的newTransformer()看着很熟悉,就是曾在CC2中用过的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl里的一个public方法,用来调用getTransletInstance()(调用新加载类的newInstance()对其进行实例化)

进一步的触发链为:

看到getTransletInstance(),我们就又能控制_bytecodes来任意代码执行了

 

构造EXP

Step 0

CC2中我们构造了触发_bytecodes的exp,这里可以直接复制来用

但是这次入口点不是从任意public方法调用,而是借助TrAXfilter的构造方法

exp part 1:

 

Step 1

现在要执行到TrAXFilter的构造方法,且传入的参数为templatesimpl就行了

正是要利用org.apache.commons.collections.functors.InstantiateTransformertransform()方法

exp part 2:

 

Step 2

然后要执行transform(),类似于CC1,复制过来稍作修改就行(用到的是InstantiateTransformer)

exp part 3:

 

整合Exp