diff --git a/Chapter6/6-4.md b/Chapter6/6-4.md index 4d6cf15..aad29da 100644 --- a/Chapter6/6-4.md +++ b/Chapter6/6-4.md @@ -1,31 +1,45 @@ ### Shiro 550 721 区别 -**Shiro 550 漏洞发生在 Apache Shiro 1.2.4 版本及以下** +**Shiro-550(CVE-2016-4437)** -这个漏洞的根本原因在于 Shiro 框架在处理 `rememberMe` 功能时,使用了**硬编码的默认密钥**。这个密钥是公开的,并且在 Shiro 的代码中可以轻易找到 +**Shiro-550** 是利用了 Shiro **硬编码的默认密钥** -**攻击者利用 Shiro 550 的完整攻击链如下:** +- **漏洞原理**: + 1. Apache Shiro 在 `RememberMe` 功能中,会将用户的身份信息进行序列化,然后使用一个**硬编码的默认密钥**进行 AES 加密,最后将加密后的数据作为 Cookie 发送给客户端 + 2. 在 **Shiro 1.2.4 及以前的版本**中,这个密钥是固定的、公开的 + 3. 攻击者可以利用这个已知的密钥,构造一个恶意的序列化 Payload(即 Gadget Chain,如 `CommonsCollections`) + 4. 攻击者用这个密钥对 Payload 进行加密,然后将加密后的数据作为 `RememberMe` Cookie 发送给服务器 + 5. 服务器收到这个 Cookie 后,会使用**相同的默认密钥**对数据进行解密,然后对解密后的数据进行**反序列化** + 6. 在反序列化过程中,恶意的 Gadget Chain 被触发,导致远程代码执行(RCE) +- **攻击流程**: + 1. **获取密钥**:攻击者知道 Shiro 默认的硬编码密钥 + 2. **构造 Payload**:利用 `ysoserial` 等工具生成一个反序列化 Payload + 3. **加密 Payload**:用默认密钥对 Payload 进行 AES 加密 + 4. **发送 Cookie**:将加密后的数据作为 `RememberMe` Cookie 发送给服务器 + 5. **触发反序列化**:服务器解密并反序列化,导致 RCE +- **影响范围**:Shiro <= 1.2.4 版本 -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(CVE-2019-12422)** -**Shiro 721 漏洞出现在 Apache Shiro 1.2.5 到 1.4.1 版本之间** +**Shiro-721** 绕过了默认密钥的问题,它利用的是 **AES-CBC 模式的漏洞** -在这些版本中,Shiro 官方已经意识到了硬编码密钥的风险,并将其移除,改为**随机生成密钥**。因此,Shiro 550 的利用方式在这里不再有效 +- **漏洞原理**: + 1. 在 Shiro 1.2.5 到 1.4.1 版本中,虽然移除了硬编码密钥,但攻击者发现,当应用程序使用**一个可猜测或已知的密钥**时,仍然可以利用 AES-CBC 模式的**填充 oracle 攻击** + 2. AES-CBC 模式在解密时,如果数据填充(Padding)不正确,会返回一个特定的错误。攻击者可以利用这个错误来猜测加密数据中的每个字节 + 3. 通过这种方式,攻击者可以**逐字节地解密 `RememberMe` Cookie 中的数据**,从而获取加密密钥 + 4. 一旦密钥被破解,攻击者就可以像 Shiro-550 一样,构造恶意的 Payload 并进行加密,从而触发 RCE +- **攻击流程**: + 1. **获取密钥**:攻击者利用 AES-CBC 的填充 oracle 漏洞,通过发送大量畸形请求,并根据服务器的响应,逐字节地破解加密密钥 + 2. **构造 Payload**:利用 `ysoserial` 生成 Payload + 3. **加密 Payload**:用刚刚破解的密钥对 Payload 进行加密 + 4. **发送 Cookie**:将加密后的数据作为 `RememberMe` Cookie 发送给服务器 + 5. **触发反序列化**:服务器解密并反序列化,导致 RCE +- **影响范围**:Shiro 1.2.5 - 1.4.1 版本 -**攻击者利用 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 -> 反序列化 -> 命令执行 | 恶意反序列化数据 -> 命令执行 | -| 根本原因 | 密钥硬编码和反序列化处理不当 | 反序列化处理不当 | \ No newline at end of file +| 特性 | Shiro-550 | Shiro-721 | +| -------- | -------------------------- | -------------------------------------------- | +| 漏洞类型 | 硬编码密钥导致的反序列化 | AES-CBC 模式的填充 oracle 漏洞 | +| 攻击目标 | 已知密钥 | 未知密钥 | +| 攻击方式 | 直接利用已知的密钥进行加密 | 通过填充 oracle 攻击来破解密钥,然后利用密钥 | +| 利用难度 | 简单,直接利用 | 复杂,需要多次请求进行破解 | +| 影响版本 | Shiro <= 1.2.4 | Shiro 1.2.5 - 1.4.1 | \ No newline at end of file