262 字
1 分钟
CC链总结
一、各条利用链总结
| 链 | Trigger | Gadget | Sink | 核心思想 |
|---|---|---|---|---|
| CC1 | AnnotationInvocationHandler.invoke() | LazyMap | Runtime.exec | 动态代理触发 InvocationHandler |
| CC2 | PriorityQueue.compare() | TransformingComparator | TemplatesImpl | 堆恢复时调用 Comparator |
| CC3 | AnnotationInvocationHandler.invoke() | LazyMap | TemplatesImpl | 使用 TemplatesImpl 完成字节码加载 |
| CC5 | BadAttributeValueExpException.toString() | TiedMapEntry | Runtime.exec | toString 回调触发 LazyMap |
| CC6 | HashMap.hashCode() | TiedMapEntry | Runtime.exec | HashMap 重建哈希时调用 hashCode |
| CC7 | Hashtable.equals() | LazyMap | Runtime.exec | Hashtable 检查哈希冲突时调用 equals |
-
CC5、CC6、CC7 本质上都是围绕 LazyMap + TiedMapEntry 展开的,只是 Trigger 不同。
-
CC2、CC3 的核心在于 TemplatesImpl,最终利用恶意字节码加载实现代码执行。
-
CC1 则利用 AnnotationInvocationHandler 动态代理机制触发整个链条。
二、各条链的 Trigger 对比
这是整个 CC 学习中我认为最重要的一部分。
| 链 | 自动调用的方法 |
|---|---|
| CC1 | invoke() |
| CC2 | compare() |
| CC3 | invoke() |
| CC5 | toString() |
| CC6 | hashCode() |
| CC7 | equals() |
真正值得学习的不是 Gadget,而是 Trigger。
因为 Trigger 来自 JDK 正常恢复对象状态时自动执行的方法。
不同利用链,只是在寻找不同的 Trigger。
三、Sink 对比
CC 系列最终主要有两类 Sink。
| Sink | 对应链 |
|---|---|
| Runtime.exec | CC1、CC5、CC6、CC7 |
| TemplatesImpl | CC2、CC3 |
其中:
Runtime.exec 利用反射逐步调用最终执行命令;
TemplatesImpl 利用恶意字节码,在实例化 Translet 时完成代码执行。