CC3链分析

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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一样去触发漏洞了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值