前言
CommonCollections系列的gadgets之CommonsCollections2
实验环境:jdk1.8.0_211 、org.apache.commons:commons-collections4:4.0
关键调用链如下
1 | at org.apache.commons.collections4.functors.InvokerTransformer.transform |
先放ysoserial的关于CommonCollections2的exp
1 | package ysoserial.payloads; |
我们只关注getObject方法中的代码
1 | final Object templates = Gadgets.createTemplatesImpl(command); //创建一个org.apache.xalan.xsltc.trax.TemplatesImpl方法,该方法可以通过填充其_bytecode和_name属性后调用其newTransformer方法后初始化一个_bytecode指定的任意类 |
Gadgets.createTemplatesImpl
1 | public static <T> T createTemplatesImpl ( final String command, Class<T> tplClass, Class<?> abstTranslet, Class<?> transFactory ) |
想要理解Gadgets.createTemplatesImpl为何要像上面这样构造就需要了解com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer是怎么把任意类初始化的
进入getTransletInstance()
首先校验_name是否为空,为空返回null,如果_class为空调用defineTransletClasses()
截取defineTransletClasses关键部分,可以看到调用defineClass加载_bytecodes二元字节组中的字节并将返回的class保存到_class数组中,然后校验class的父类是否为ABSTRACT_TRANSLET也就是com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet。如果是则把_class数组下标赋给_transletIndex。如果整个defineTransletClasses()运行到最终时_transletIndex<0会抛出错误。