Shiro 550 721 区别
Shiro 550 漏洞发生在 Apache Shiro 1.2.4 版本及以下
这个漏洞的根本原因在于 Shiro 框架在处理 rememberMe
功能时,使用了硬编码的默认密钥。这个密钥是公开的,并且在 Shiro 的代码中可以轻易找到
攻击者利用 Shiro 550 的完整攻击链如下:
- 获取硬编码密钥:攻击者无需任何特殊权限,可以直接从 Shiro 1.2.4 版本的源码中找到默认的硬编码密钥,即著名的
"kPH+bIxk5D2deGgHxtzionw=="
- 构造 Padding Oracle 攻击:由于密钥已知,攻击者可以利用 Padding Oracle 攻击技术。这种攻击方式允许攻击者在不知道加密算法和具体内容的情况下,通过观察服务器对密文解密失败时的响应,来逐字节地解密
rememberMe
Cookie 中的内容,并构造恶意的加密数据 - 恶意反序列化数据:攻击者利用 Padding Oracle 攻击成功后,可以构造一个恶意的反序列化数据(例如利用
CommonsCollections
或ysoserial
生成的 payload),并使用硬编码的密钥对其进行加密 - 命令执行:当服务器收到并解密这个恶意的
rememberMe
Cookie 后,会触发 Java 反序列化机制,从而执行攻击者构造的命令
Shiro 721 漏洞出现在 Apache Shiro 1.2.5 到 1.4.1 版本之间
在这些版本中,Shiro 官方已经意识到了硬编码密钥的风险,并将其移除,改为随机生成密钥。因此,Shiro 550 的利用方式在这里不再有效
攻击者利用 Shiro 721 的完整攻击链如下:
- 构造恶意数据:攻击者无需知道密钥,也无需进行 Padding Oracle 攻击。他们可以直接构造一个恶意的
rememberMe
Cookie,其中包含一个完整的、恶意的反序列化 payload(例如一个远程加载代码的 payload,利用URLDNS
或JdbcRowSetImpl
等) - 利用链绕过:这个漏洞的精髓在于,攻击者可以利用一些特定的 Java 反序列化链,即使没有密钥也可以触发代码执行。例如,攻击者可以利用
URLDNS
或JdbcRowSetImpl
等利用链,这些利用链无需解密,可以直接让服务器去请求攻击者指定的外部资源(如 LDAP 或 RMI 服务) - 命令执行:服务器在处理
rememberMe
Cookie 时,会尝试反序列化恶意数据,从而触发远程加载,最终执行攻击者构造的命令
特性 | Shiro 550 | Shiro 721 |
---|---|---|
漏洞版本 | 1.2.4 及以下 | 1.2.5 到 1.4.1 |
核心漏洞 | 硬编码密钥 + 反序列化 | 反序列化 |
攻击前置条件 | 需要 Padding Oracle 攻击 来解密和伪造 rememberMe 值 | 无需 Padding Oracle 攻击,直接发送恶意序列化数据 |
利用复杂性 | 相对复杂,需要先利用 Padding Oracle 攻击来获取或伪造数据 | 相对简单,直接构造反序列化数据即可 |
利用链 | 硬编码密钥 -> Padding Oracle -> 反序列化 -> 命令执行 | 恶意反序列化数据 -> 命令执行 |
根本原因 | 密钥硬编码和反序列化处理不当 | 反序列化处理不当 |