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