shrio550和721区别
Apache Shiro 框架中的 SHIRO-550 和 SHIRO-721 是两个影响严重但原理和利用方式完全不同的反序列化漏洞。它们的核心区别如下:
核心对比概览
| 特征 | SHIRO-550 (CVE-2016-4437) | SHIRO-721 (CVE-2019-12422) |
|---|---|---|
| 根本原因 | 硬编码的默认密钥 | 使用已知密钥时的设计缺陷 |
| 漏洞性质 | 身份验证绕过 + 代码执行 | 权限提升 + 代码执行 |
| 利用前提 | 攻击者无需已知任何有效账户凭证 | 攻击者必须先拥有一个有效的账户凭证(能登录获取Cookie) |
| 关键技术 | 利用默认密钥伪造/加密RememberMe Cookie | Padding Oracle攻击,通过旁路爆破出正确的加密密钥,进而伪造Cookie |
| 影响版本 | Shiro <= 1.2.4 | Shiro < 1.4.2 (使用默认AES-CBC模式时) |
| 修复方式 | 1. 升级到1.2.5+ 2. 在配置中设置一个唯一且强壮的密钥 |
1. 升级到1.4.2+ 2. 将加密模式从 AES-CBC改为AES-GCM |
详细解析
1. SHIRO-550 (CVE-2016-4437) - “记住我”漏洞
- 原理:Shiro为了提供“记住我”功能,会将用户的身份信息序列化后,使用AES加密存储在客户端的
rememberMeCookie中。在1.2.4及以前版本中,加密使用的AES密钥是硬编码在框架代码中的。这意味着任何攻击者都可以直接使用这个公开的密钥来加密恶意序列化数据。 - 利用过程:
- 攻击者构造一个包含恶意代码的Java对象(例如利用Commons-Collections库的Gadget链)。
- 使用Shiro默认的公开密钥对这个序列化后的数据进行AES加密。
- 将加密结果作为
rememberMeCookie发送给服务器。 - Shiro服务器收到Cookie后,会用相同的默认密钥解密,然后反序列化数据,导致恶意代码在服务器上执行。
- 特点:利用简单粗暴,是“开箱即用”的漏洞。只要目标系统未更改默认密钥且存在可用的反序列化利用链,攻击者无需任何凭证即可直接获取系统控制权。
2. SHIRO-721 (CVE-2019-12422) - Padding Oracle攻击漏洞
- 原理:这是在Shiro修复了550漏洞(强制用户修改默认密钥)后出现的新问题。即使管理员设置了强密钥,如果Shiro版本较低(<1.4.2),它默认使用的AES-CBC加密模式存在缺陷。
- CBC模式需要“填充”(Padding)来使数据长度符合要求。
- Shiro在解密Cookie时,会验证这个填充是否有效。并根据验证结果返回不同的错误信息(或响应时间差异),这构成了一个 “Padding Oracle”。
- 利用过程:
- 攻击者首先需要一个普通用户账号,正常登录后获得一个合法的、使用未知密钥加密的
rememberMeCookie。 - 攻击者以这个合法Cookie为“密文”,向服务器发起海量精心构造的请求。
- 根据服务器返回的错误信息(Padding有效与否),像“猜谜”一样,逐步爆破推断出加密密钥的字节。
- 一旦密钥被完全破解,攻击者就回到了SHIRO-550的场景:可以用这个密钥加密任意恶意的序列化数据,伪造高权限用户的Cookie,实现远程代码执行。
- 攻击者首先需要一个普通用户账号,正常登录后获得一个合法的、使用未知密钥加密的
- 特点:利用条件苛刻(需要先有一个账户),且攻击过程复杂、耗时(需要发送数万至数十万次请求进行旁路爆破)。但一旦成功,危害与550相同。
总结与关联
- SHIRO-550 是“地基没打好”,使用了谁都知道的钥匙(密钥),大门形同虚设。
- SHIRO-721 是“门锁有缺陷”(CBC模式),虽然换了新钥匙(密钥),但攻击者通过反复试探门锁的声音(Padding Oracle),最终能复制出这把钥匙。
修复建议:
- 立即升级到Shiro的最新安全版本(远高于1.4.2)。
- 检查配置,确保
rememberMe功能的加密密钥是唯一、强壮且保密的。 - 对于721漏洞,确保Shiro使用了
AES-GCM等更安全的加密模式,该模式能同时提供加密和完整性验证,免疫Padding Oracle攻击。
这两个漏洞共同揭示了在安全框架中,密钥管理和加密算法选用的极端重要性。
所有内容均由人工智能模型生成,其生成内容的准确性和完整性无法保证,不代表我们的态度或观点。