Skip to content

Commit ad8a792

Browse files
committed
cc
1 parent b44f5d8 commit ad8a792

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
## 分类
2020

21-
当前问题总数:67
21+
当前问题总数:75
2222

2323
[Java本身的安全问题 - 16个](https://github.com/4ra1n/JavaSecInterview/tree/master/java)
2424

@@ -32,6 +32,8 @@
3232

3333
[内存马专题 - 8个](https://github.com/4ra1n/JavaSecInterview/tree/master/memshell)
3434

35+
[反序列化CC链专题 - 8个](https://github.com/4ra1n/JavaSecInterview/tree/master/cc)
36+
3537
## 参考
3638

3739
https://github.com/LandGrey/SpringBootVulExploit

cc/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
## CC
2+
3+
- 谈下CC链中三个重要的`Transformer`(★★★)
4+
5+
`ConstantTransformer`类的`transform`方法直接返回传入的类对象
6+
7+
`ChainedTransformer`类中的`transform`方法会链式调用其中的其他`Transformer.transform`方法
8+
9+
`InvokerTransformer`类根据传入参数可以反射调用对应的方法
10+
11+
`InstantiateTransformer`类可以直接实例化对象
12+
13+
14+
15+
- 谈谈CC1(★★★)
16+
17+
原理是`LazyMap.get`可以触发构造的`Transformer`链的`transform`方法导致`RCE`
18+
19+
基于动态代理触发的`LazyMap.get`,在`AnnotationInvocationHanlder`中的`invoke`方法中存在`Map.get`操作
20+
21+
22+
23+
- 谈谈CC2(★★★)
24+
25+
该链用到`TemplatesImpl`类,生成恶意的字节码实例化
26+
27+
不过触发点是`PriorityQueue`类,反射设置属性`TransformingComparator`
28+
29+
`PriorityQueue`类是优先队列,其中包含了排序功能,该功能可以设置比较器`comparator`,而`TransformingComparator``compare`方法会调用对象的`transform`方法
30+
31+
于是通过`InvokerTransformer`类的`transform`方法调用`TemplatesImpl.newTransformer`方法导致`RCE`
32+
33+
34+
35+
- 谈谈CC3(★★★)
36+
37+
该链用到`TemplatesImpl`类,生成恶意的字节码实例化
38+
39+
仍然是基于动态代理和`LazyMap.get`触发`InstantiateTransformer``transform`方法导致`RCE`
40+
41+
42+
43+
- 谈谈CC4(★★★)
44+
45+
和CC2链一致,不过触发时候不是`InvokerTransformer`而是`InstantiateTransformer`类直接实例化`TrAXFilter`子类执行`<init>/<clinit>`导致`RCE`
46+
47+
48+
49+
- 谈谈CC5(★★★)
50+
51+
还是基于`LazyMap.get`触发的,不过没有动态代理,是通过`BadAttributeValueExpException.readObject()`调用`TiedMapEntry.toString()`
52+
53+
`TiedMapEntry.getValue()`中存在`Map.get`导致`LazyMap.get`触发`transform`
54+
55+
56+
57+
- 谈谈CC6(★★★)
58+
59+
还是基于`LazyMap.get`触发的,通过`HashMap.readObject()`到达`HashMap.hash()`方法,由于key是`TiedMapEntry`所以调用`TiedMapEntry.hashCode()`
60+
61+
`hashCode`方法会调用到`TiedMapEntry.getValue()`方法,由于`Map.get`导致`LazyMap.get`触发`transform`
62+
63+
64+
65+
- 谈谈CC7(★★★)
66+
67+
还是基于`LazyMap.get`触发的,通过`Hashtable.readObject()`触发了key的`equals`方法,跟入`AbstractMap.equals`方法
68+
69+
其中包含了`Map.get`导致`LazyMap.get`触发`transform`
70+
71+
但该链有一个坑:哈希碰撞

0 commit comments

Comments
 (0)