6-4

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 攻击成功后,可以构造一个恶意的反序列化数据(例如利用 CommonsCollectionsysoserial 生成的 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,利用 URLDNSJdbcRowSetImpl 等)
  2. 利用链绕过:这个漏洞的精髓在于,攻击者可以利用一些特定的 Java 反序列化链,即使没有密钥也可以触发代码执行。例如,攻击者可以利用URLDNSJdbcRowSetImpl等利用链,这些利用链无需解密,可以直接让服务器去请求攻击者指定的外部资源(如 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 -> 反序列化 -> 命令执行 恶意反序列化数据 -> 命令执行
根本原因 密钥硬编码和反序列化处理不当 反序列化处理不当