262 字
1 分钟
CC链总结

一、各条利用链总结#

链TriggerGadgetSink核心思想
CC1AnnotationInvocationHandler.invoke()LazyMapRuntime.exec动态代理触发 InvocationHandler
CC2PriorityQueue.compare()TransformingComparatorTemplatesImpl堆恢复时调用 Comparator
CC3AnnotationInvocationHandler.invoke()LazyMapTemplatesImpl使用 TemplatesImpl 完成字节码加载
CC5BadAttributeValueExpException.toString()TiedMapEntryRuntime.exectoString 回调触发 LazyMap
CC6HashMap.hashCode()TiedMapEntryRuntime.execHashMap 重建哈希时调用 hashCode
CC7Hashtable.equals()LazyMapRuntime.execHashtable 检查哈希冲突时调用 equals
  • CC5、CC6、CC7 本质上都是围绕 LazyMap + TiedMapEntry 展开的,只是 Trigger 不同。

  • CC2、CC3 的核心在于 TemplatesImpl,最终利用恶意字节码加载实现代码执行。

  • CC1 则利用 AnnotationInvocationHandler 动态代理机制触发整个链条。


二、各条链的 Trigger 对比#

这是整个 CC 学习中我认为最重要的一部分。

链自动调用的方法
CC1invoke()
CC2compare()
CC3invoke()
CC5toString()
CC6hashCode()
CC7equals()

真正值得学习的不是 Gadget,而是 Trigger。

因为 Trigger 来自 JDK 正常恢复对象状态时自动执行的方法。

不同利用链,只是在寻找不同的 Trigger。


三、Sink 对比#

CC 系列最终主要有两类 Sink。

Sink对应链
Runtime.execCC1、CC5、CC6、CC7
TemplatesImplCC2、CC3

其中:

Runtime.exec 利用反射逐步调用最终执行命令;

TemplatesImpl 利用恶意字节码,在实例化 Translet 时完成代码执行。

CC链总结
https://lab404.cn/posts/cc-chain-summary/
作者
见山
发布于
2026-07-19
许可协议
CC BY-NC-SA 4.0