前言
CC3链是采用类加载的方式进行漏洞利用
环境
JDK:1.8.0_101
Apache Commons Collections:3.2.1
正文
这里主要是通过defineClass方法来加载字节码
defineClass方法是将class二进制内容转换成Class对象


反射调用了defineClass,现在需要找newInstance初始化的代码
TemplatesImpl类是触发CC3链的关键类

这个TemplatesImpl类存在一个内部类TransletClassLoader继承了 ClassLoader并且重写了defineClass 方法,重写的defineClass方法可以被外部类调用

本类中的defineTransletClasses方法调用了defineClass,_bytecodes值不能为空值,才能进入TransletClassLoader类中,_tfactory值也必须复制后才能调用getExternalExtensionsMap方法
继续回溯defineTransletClasses方法
这里有个很关键的newInstance,这个就是我们需要实例化的关键方法,但是这个方法是私有方法,这里想要调用defineTransletClasses方法,需要_name不为空值,_class为空值(这个可以不用管),再往上看newTransformer方法

这个newTransformer方法是一个公有方法,这里直接可以调用getTransletInstance方法

总结一下触发链子的关键点
_name需要赋值,_name是String类型的变量,赋值的可以随意赋一个字符串
_bytecodes是一个二维字节类型的数组,但是传入defineClass中的_bytecodes是一个一维字节数组,赋值的时候需要赋一个一维字节类型数组,这里可以通过读取class文件,当作一个一维数组赋值给_bytecodes
_tfactory 是一个transient类型的变量,它是不能被序列化的,但是只需要它的值不为空值就可以,这里可以把赋值为new TransformerFactoryImpl()

执行后发现报空值异常,调试一下

这里发现需要让该函数不进入else里,if条件里
所以需要加载类的父类为“com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet”

到这里就可以完美执行了

再往上找触发newTransformer方法的地方

这里采用了一个新的类InstantiateTransformer去触发漏洞

判断传入的对象是否为class类型的,如果是,获取这个指定参数类型的构造器 然后调它的构造函数,这样刚好满足TrAXFilter类触发newTransformer

这样找到了transform可空点,就可以像之前CC1和CC6一样去触发漏洞了

文章详细描述了如何利用CC3链在特定环境(JDK1.8.0_101,ApacheCommonsCollections3.2.1)中通过类加载和反射技术进行漏洞利用,涉及TemplatesImpl、TransletClassLoader和defineClass等关键方法。
2910





