CVE-2019-12422

描述

Apache Shiro 1.4.2之前的版本,当使用默认的“记住我”配置时,cookie可能容易受到填充攻击。

影响版本

1.2.4 < Apache Shiro ≤ 1.4.1

复现方法一(假设知道密钥)

通过调试时获取第一次使用generateNewKey获取的密码(总共会调用两次,只取第一次的密码)

并转base64

密码正确

利用成功

 

复现方法二(CBC字节翻转攻击&Padding Oracle Attack攻击)

Shrio所使用的cookie里的rememberMe字段采用了AES-128-CBC的加密模式,这使得该字段可以被padding oracle 攻击利用。攻击者可以使用一个合法有效的rememberMe 的cookie作为前缀来实施POA,然后制造一个特制的rememberMe来执行Java反序列化攻击,比如Shrio 550那样的。

Padding Oracle Attack是比较早的一种漏洞利用方式了,在20111年的Pwnie Rewards中被评为”最具有价值的服务器漏洞“。该漏洞主要是由于设计使用的场景不当,导致可以利用密码算法通过”旁路攻击“被破解,并不是对算法的破解。

利用该漏洞可以破解出密文的明文以及将明文加密成密文,该漏洞存在条件如下:

  1. 攻击者能够获取到密文(基于分组密码模式),以及IV向量(通常附带在密文前面,初始化向量)
  2. 攻击者能够修改密文触发解密过程,解密成功和解密失败存在差异性

Padding Oracle Attack 原理

漏洞复现步骤:

   登录网站并且获取 RememberMe Cookie 值
   使用 RememberMe Cookie 值来作为 Padding Oracle Attack 的前缀
   通过 Padding Oracle Attack 的攻击方式精心构造可利用的反序列化数据
   将构造好的反序列化数据填充到 RememberMe Cookie 字段中并发送,即可在目标服务器上执行任意代码.

shiro-721可以不获取加密密钥key值,通过 Padding Oracle Attack 构造能通过验证的 rememberMe 值,然后触发反序列化,但是需要一个有效的 rememberMe 值才能进行攻击利用,所以利用面不算大

有以下几个点需要知道:

   CBC 加密模式:将明文切分成若干小段,然后每一段分别与上一段的密文进行异或运算,再与密钥进行加密,生成本段明文的密文,这段密文用于下一段明文的加密。第一段明文没有对应的密文 , 为了确保分组的唯一性,CBC 加密模式使用了初始化向量( IV , Initialization Vector )。初始化向量是一个固定长度的随机数,该向量会作为密文第一个块,随密文一同传输
   利用 Padding Oracle Attack 的前提是这里shiro接收的 rememberMe 值如果可以正确解析,就不会返回 deleteMe ,解析失败则返回 deleteMe
   Java原生反序列化是按照指定格式来读取序列化数据的,而ObjectOutputStream是一个对象操作流,其会按格式以队列方式读下去,也就是说在正常的序列化数据后面继续添加一些数据是不会影响反序列化操作的
   AES/CBC/PKCS5Padding: 以完整字节填充 , 每个填充字节的值是用于填充的字节数 . 即要填充 N 个字节 , 每个字节都为 N.

连接

官方修复方案

使用更为复杂的加密算法

客户修复方案

更新Apache Shiro ≥ 1.2.5。