皮皮宋渗透日记17|Shiro反序列化漏洞:原理、利用与防御全解析

admin 2026-04-21 04:19:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析ApacheShiro反序列化漏洞(Shiro-550/721)的原理、利用与防御方案。核心指出RememberMe功能的反序列化流程是漏洞入口,硬编码密钥(Shiro-550)或密钥爆破(Shiro-721)可导致RCE。文章对比了两类漏洞差异,列举CC/CB利用链,并给出升级版本、自定义强密钥、关闭RememberMe等企业级防御措施。同时汇总了未授权访问、权限绕过等Shiro其他高危漏洞及面试常见问题。 综合评分: 88 文章分类: 渗透测试,漏洞分析,WEB安全,红队,安全意识


cover_image

皮皮宋渗透日记17|Shiro 反序列化漏洞:原理、利用与防御全解析

原创

皮皮宋 皮皮宋

皮皮宋渗透笔记

2026年4月1日 10:07 安徽

在小说阅读器读本章

去阅读

大家好,我是皮皮宋✨Shiro 反序列化漏洞是 Java 安全领域的经典高危漏洞,也是面试、渗透测试的高频考点。很多新手对 Shiro-550、Shiro-721 的区别、利用条件、防御方案一知半解,今天一次性讲透:从 RememberMe 原理到漏洞成因,从利用链到实战复现,从版本差异到企业级防御,看完直接拿捏!


一、前置知识:Shiro RememberMe 功能原理

Apache Shiro 是 Java 生态最常用的权限控制框架,RememberMe「记住我」是其核心功能之一,用于实现用户免登录访问,完整流程如下:

正常业务流程

  1. 用户登录:用户勾选「记住我」,输入账号密码完成认证
  2. 序列化用户信息:Shiro 将用户身份信息(如用户名、权限)序列化为字节流
  3. AES 加密:使用预设的 AES 密钥对序列化数据进行加密
  4. Base64 编码:将加密后的字节流做 Base64 编码,生成最终的rememberMeCookie
  5. 写入浏览器:将 Cookie 下发给用户浏览器,下次访问自动携带
  6. 服务端校验:用户再次访问时,Shiro 反向执行:Base64 解码 → AES 解密 → 反序列化,恢复用户对象,实现免登录

核心风险点

整个流程中,反序列化步骤是漏洞的核心入口:只要服务端对rememberMeCookie 执行反序列化,就会触发对象的readObject()方法,为恶意代码执行创造条件。


二、Shiro-550(CVE-2016-4437):经典硬编码密钥漏洞

1. 漏洞核心成因

Shiro 1.2.4 及更早版本中,AES 加密密钥是硬编码在源码中的默认密钥(经典密钥:kPH+bIxk5D2deZiIxcaaaA==),攻击者可直接获取该密钥,伪造恶意 Cookie。

2. 攻击链路(核心流程图)

3. 关键细节拆解

  • 漏洞载体:rememberMeCookie,无需登录、无需权限,只要请求携带该 Cookie 即可触发
  • 利用链依赖:需要 CommonsCollections(CC)、CommonsBeanutils(CB)等 Gadget 链,配合反序列化执行命令
  • 影响版本:Shiro ≤ 1.2.4
  • 核心特征:固定硬编码密钥,攻击者可直接构造加密 Payload,利用门槛极低

三、Shiro-550 vs Shiro-721:核心区别速查表

很多人容易混淆两个漏洞,一张表讲清本质差异:

| 维度 | Shiro-550(CVE-2016-4437) | Shiro-721 | | — | — | — | | 密钥特征 | 固定硬编码默认密钥(24 位经典密钥) | 随机动态密钥(用户自定义) | | 加密方式 | AES-CBC 模式,固定 IV | AES-GCM 模式,随机 IV | | 利用条件 | 已知默认密钥,直接构造 Payload | 需获取 / 爆破密钥,或绕过密钥校验 | | 影响版本 | Shiro ≤ 1.2.4 | Shiro 1.2.5+(修复默认密钥后) | | 利用难度 | 极低,工具一键打 | 较高,需额外获取密钥 | | 核心入口 | rememberMe Cookie 反序列化 | 同左,rememberMe Cookie |

一句话总结:Shiro-550 是「密钥公开白给」,Shiro-721 是「密钥随机但仍有绕过空间」


四、Shiro 其他高频漏洞汇总

除了经典反序列化漏洞,Shiro 还存在多个高危权限 / 认证绕过漏洞,渗透测试中需重点关注:

1. 未授权访问漏洞

  • 影响版本:Shiro 1.2.3
  • 漏洞原理:通过./admin等畸形路径,直接绕过权限校验进入管理后台
  • 补充:1.2.3~1.5.3 版本存在多种路由未授权绕过方式

2. 权限绕过漏洞(CVE-2020-1957)

  • 影响版本:Shiro ≤ 1.5.2
  • 漏洞原理:Shiro 路径匹配逻辑缺陷,攻击者可通过构造特殊 URI(如/xxx/..;/admin)绕过权限拦截

3. 认证绕过漏洞(CVE-2020-13933)

  • 影响版本:Shiro ≤ 1.5.3
  • 漏洞原理:Shiro 对 HTTP 请求方法处理不当,可通过特殊请求方法绕过认证,直接访问受限资源

4. 信息泄露漏洞

  • 影响版本:Shiro 1.2.4
  • 漏洞原理:部分接口未做权限控制,可泄露用户敏感信息、配置文件等

五、Shiro 反序列化漏洞:关键面试问答

1. Shiro 反序列化漏洞的触发入口是什么?

HTTP 请求 Cookie 中的rememberMe字段。攻击者将构造好的恶意序列化数据,经 AES 加密、Base64 编码后,替换目标用户的rememberMeCookie;服务端在处理该 Cookie 时,会自动执行 Base64 解码、AES 解密、反序列化操作,从而触发漏洞。

2. Shiro 常用的利用链有哪些?

  • CC 链(CommonsCollections):最经典、最通用的利用链,依赖 Apache Commons Collections 库,适用于绝大多数 Shiro 环境
  • CB 链(CommonsBeanutils):无 CC 依赖时的替代利用链,部分无 CC 环境可直接使用

3. 密钥是随机密钥,就无法攻击 Shiro 了吗?

不是,仍有多种攻击手段:

  1. SpringBoot 堆内存泄露:通过 Actuator 未授权端点、Heapdump 接口下载服务器堆栈信息,从内存中直接提取 Shiro AES 密钥
  2. 无密钥绕过利用链:部分特殊 Gadget 链可绕过密钥校验,无需知晓密钥直接触发反序列化
  3. 弱密钥爆破:若用户自定义密钥复杂度极低,可通过字典爆破破解
  4. 社会工程 / 权限渗透:通过渗透获取服务器权限,读取配置文件中的密钥

4. Log4j2 与 Shiro 反序列化的底层触发函数有什么区别?

  • Shiro 反序列化:核心触发函数是ObjectInputStream.readObject(),反序列化时自动执行对象的readObject()方法,配合 CC 链执行命令
  • Log4j2 漏洞:核心触发函数是JndiLookup.lookup(),日志解析时触发 JNDI 注入,远程加载恶意类执行代码

六、企业级防御方案(面试必背)

1. 核心修复方案

  • 升级 Shiro 版本:升级至 1.2.5 及以上安全版本,移除硬编码默认密钥
  • 自定义强密钥:使用复杂度极高的随机 AES 密钥,禁止使用默认密钥,定期更换
  • 关闭 RememberMe 功能:非必要场景直接关闭该功能,从根源消除漏洞入口

2. 代码层加固

  • 反序列化数据增加白名单校验,仅允许可信类反序列化
  • 移除项目中危险的 Gadget 依赖(如 CommonsCollections 高危版本)
  • 禁用Runtime.exec()等危险系统调用,限制代码执行权限

3. 网络层防护

  • WAF 拦截rememberMeCookie 恶意特征流量,阻断攻击请求
  • 限制服务器出站端口,禁止服务器主动外联恶意 LDAP/RMI 服务
  • 对 Shiro 管理后台做 IP 白名单限制,仅允许内部访问

4. 应急排查方案

  • 检查 Shiro 版本,确认是否为 ≤1.2.4 高危版本

  • 检查配置文件中的 AES 密钥,是否为默认硬编码密钥

  • 排查服务器异常外联流量、异常进程,排查是否被植入内存马

  • 定期更新安全补丁,修复 Shiro 权限绕过等其他漏洞

    感谢您抽出  · 来阅读此文,觉得不错的话记得点个赞和在看


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:皮皮宋渗透笔记 皮皮宋 皮皮宋《皮皮宋渗透日记17|Shiro 反序列化漏洞:原理、利用与防御全解析》

评论:0   参与:  0