文章总结: 本文深入解析Shiro550漏洞中不依赖CC链的CB利用链,介绍了反序列化利用链的三要素模型,详细阐述了CB链的原理、构造方法和执行流程,为Java反序列化漏洞利用提供了新的思路和方法。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,安全开发,漏洞POC
第107天-Shiro 550 漏洞深度解析:无 CC 依赖?CB 链一招制敌!
原创
Сяо Яо Сяо Яо
AlphaNet
2026年3月25日 21:04 韩国
🤔 引言:Shiro 的“新”弱点?
嗨,各位未来的白帽黑客和安全开发者!👋
当我们谈论 Java 反序列化漏洞时,Apache Shiro 和 Commons Collections(CC) 几乎是绑定的经典组合。但问题来了:
👉 如果目标环境没有 CC 依赖怎么办?
很多人会下意识认为“无解”。但真正的答案是:
❗ 依然可以打,而且更隐蔽。
今天我们要讲的,就是一条实战价值极高的利用链:
🚀 Commons Beanutils(CB)链
它不依赖 CC,却依然可以实现 RCE(远程代码执行),是进阶 Java 安全必须掌握的一条链。
1️⃣ 是什么:反序列化利用链三要素
在深入 CB 链之前,先建立一个核心模型👇
任何反序列化利用链,本质都由三部分组成:
➡️ 1. Source(入口点)
-
触发点
-
一般是
readObject()方法 -
反序列化时自动执行
👉 本链入口:
PriorityQueue
🔗 2. Gadget(调用链)
-
一系列“合法类”的组合
-
利用方法调用串联执行路径
👉 本链核心:
BeanComparator
🎯 3. Sink(执行点)
-
最终危险操作发生的位置
-
通常是:
-
反射
-
类加载
-
命令执行
👉 本链终点:
TemplatesImpl
📌 一句话总结:
PriorityQueue → BeanComparator → TemplatesImpl → RCE
2️⃣ 为什么:CB 链的核心原理
这条链之所以成立,依赖两个关键机制👇
🧠 关键点 ①:PropertyUtils 的“隐式调用”
Commons Beanutils 提供:
PropertyUtils.getProperty(obj, "name")
本质做的事情是:
自动调用 → obj.getName()
👉 攻击思路:
我们控制:
-
obj = TemplatesImpl
-
property = “outputProperties”
那么就变成:
TemplatesImpl.getOutputProperties()
✔️ 成功进入危险类
💣 关键点 ②:TemplatesImpl = 内置 RCE 引擎
这是整条链的“核弹级组件”。
调用路径:
getOutputProperties()
→ newTransformer()
→ getTransletInstance()
→ defineTransletClasses()
→ defineClass()
最终结果:
✅ 加载我们注入的恶意字节码
✅ 执行任意代码
💻 恶意 TemplatesImpl 构造(可滚动代码)
// 获取恶意类字节码
ClassPool pool = ClassPool.getDefault();
CtClass evilClass = pool.get("com.govuln.shiroattack.Evil");
// 创建 TemplatesImpl
TemplatesImpl obj = new TemplatesImpl();
// 写入恶意字节码
setFieldValue(obj, "_bytecodes", new byte[][]{
evilClass.toBytecode()
});
// 必须字段(否则不会触发)
setFieldValue(obj, "_name", "pwn");
setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
📱 说明:
-
在公众号中,该代码块会自动支持左右滑动
-
不会换行,不会溢出页面
3️⃣ 怎么做:完整利用链执行流程
现在把链路拼起来👇
🔥 Step 1:入口触发
PriorityQueue.readObject()
反序列化触发
🔗 Step 2:堆重建触发 compare
heapify()
→ siftDown()
→ siftDownUsingComparator()
→ comparator.compare()
⚙️ Step 3:BeanComparator 执行
PropertyUtils.getProperty(o1, property)
👉 实际效果:
TemplatesImpl.getOutputProperties()
💥 Step 4:触发 RCE
getOutputProperties()
→ newTransformer()
→ defineClass()
→ 执行恶意字节码
🚀 完整调用链
PriorityQueue.readObject()
→ heapify()
→ siftDown()
→ siftDownUsingComparator()
→ BeanComparator.compare()
→ PropertyUtils.getProperty()
→ TemplatesImpl.getOutputProperties()
→ newTransformer()
→ defineClass()
→ 💥 RCE
✨ 核心总结
✅ 1. 利用链本质
| 组件 | 作用 | | — | — | | PriorityQueue | 入口 | | BeanComparator | 调用桥 | | TemplatesImpl | 执行 |
✅ 2. CB 链核心优势
-
❌ 不依赖 Commons Collections
-
✅ 更隐蔽
-
✅ 绕过部分防御
✅ 3. 攻击本质
利用“合法 API + 反射机制”构造非法执行路径
🧠 进阶思考
给你一个真正拉开差距的问题:
❓ 除了 PriorityQueue,还有哪些类可以作为 Source?
思考方向:
-
是否实现
Serializable -
是否存在
readObject -
是否能触发方法调用链
🎯 结尾
如果你能真正理解这条链,你已经进入了:
🧩 Java 反序列化利用的中级阶段
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet Сяо Яо Сяо Яо《第107天-Shiro 550 漏洞深度解析:无 CC 依赖?CB 链一招制敌!》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论