Shiro 550 721 区别

Shiro-550(CVE-2016-4437)

Shiro-550 是利用了 Shiro 硬编码的默认密钥

  • 漏洞原理

  • Apache Shiro 在 RememberMe 功能中,会将用户的身份信息进行序列化,然后使用一个硬编码的默认密钥进行 AES 加密,最后将加密后的数据作为 Cookie 发送给客户端
  • Shiro 1.2.4 及以前的版本中,这个密钥是固定的、公开的
  • 攻击者可以利用这个已知的密钥,构造一个恶意的序列化 Payload(即 Gadget Chain,如 CommonsCollections
  • 攻击者用这个密钥对 Payload 进行加密,然后将加密后的数据作为 RememberMe Cookie 发送给服务器
  • 服务器收到这个 Cookie 后,会使用相同的默认密钥对数据进行解密,然后对解密后的数据进行反序列化
  • 在反序列化过程中,恶意的 Gadget Chain 被触发,导致远程代码执行(RCE)
  • 攻击流程

  • 获取密钥:攻击者知道 Shiro 默认的硬编码密钥

  • 构造 Payload:利用 ysoserial 等工具生成一个反序列化 Payload

  • 加密 Payload:用默认密钥对 Payload 进行 AES 加密

  • 发送 Cookie:将加密后的数据作为 RememberMe Cookie 发送给服务器

  • 触发反序列化:服务器解密并反序列化,导致 RCE

  • 影响范围:Shiro <= 1.2.4 版本

Shiro-721(CVE-2019-12422)

Shiro-721 绕过了默认密钥的问题,它利用的是 AES-CBC 模式的漏洞

  • 漏洞原理

  • 在 Shiro 1.2.5 到 1.4.1 版本中,虽然移除了硬编码密钥,但攻击者发现,当应用程序使用一个可猜测或已知的密钥时,仍然可以利用 AES-CBC 模式的填充 oracle 攻击
  • AES-CBC 模式在解密时,如果数据填充(Padding)不正确,会返回一个特定的错误。攻击者可以利用这个错误来猜测加密数据中的每个字节
  • 通过这种方式,攻击者可以逐字节地解密 RememberMe Cookie 中的数据,从而获取加密密钥
  • 一旦密钥被破解,攻击者就可以像 Shiro-550 一样,构造恶意的 Payload 并进行加密,从而触发 RCE
  • 攻击流程

  • 获取密钥:攻击者利用 AES-CBC 的填充 oracle 漏洞,通过发送大量畸形请求,并根据服务器的响应,逐字节地破解加密密钥

  • 构造 Payload:利用 ysoserial 生成 Payload

  • 加密 Payload:用刚刚破解的密钥对 Payload 进行加密

  • 发送 Cookie:将加密后的数据作为 RememberMe Cookie 发送给服务器

  • 触发反序列化:服务器解密并反序列化,导致 RCE

  • 影响范围:Shiro 1.2.5 - 1.4.1 版本

特性Shiro-550Shiro-721
漏洞类型硬编码密钥导致的反序列化AES-CBC 模式的填充 oracle 漏洞
攻击目标已知密钥未知密钥
攻击方式直接利用已知的密钥进行加密通过填充 oracle 攻击来破解密钥,然后利用密钥
利用难度简单,直接利用复杂,需要多次请求进行破解
影响版本Shiro <= 1.2.4Shiro 1.2.5 - 1.4.1