Shiro反序列化漏洞学习

一、简介

Shiro是apache提供的Java安全框架,提供了认证(subject)、授权(Security Manager)、加密(cryptography)、会话管理(Realm)等功能,Shiro框架直观、易用,同时也能提供健壮的安全性。

二、漏洞类型

  • Shiro550
  • Shiro721

三、漏洞原理

  • Shiro550

Apache Shiro 提供了记住密码功能,用户登录成功会生成加密编码的Cookie,服务端的Remember Me cookie字段经过b64解码,使用密钥AES解密的反序列化造成了命令执行。


Payload构造:命令 -> 序列化 -> AES加密(默认密钥) -> b64加密 -> Remember Me值

影响版本:Apache Shiro < 1.2.4

判断特征:响应包里存在Remember Me值

  • Shiro721

Apache Shiro cookie中Remember Me 中采用AES-128-CBC加密模式,用户通过Padding Oracle加密攻击来构造恶意的字段,通过带着构造好的字段,重新访问网站 导致序列化 执行命令。

影响版本:Apache Shiro < 1.4.2

判断特征:请求包里存在Remember Me值

Padding分析

CBC加密模式:AES/DES加密

Padding oracle attack详细解析

对密码进行分组,AES分组为8字节,DES分组为16字节。

第一组分组通过key加密,第二组明文与第一组密文进行异或得到中间值 进行key加密,以此类推…

Padding oracle attack攻击原理:

验证流程:

  1. 判断最后一组填充值是否相等(返回值)
  2. 正确,继续对比其他值
  3. 正确,登陆成功

攻击过程:

以下为摘抄(并没有太理解,请大神指导):

(1)假设我们捕获到了传输的密文并且我们知道是CBC模式采用的什么加密算法,我们把密文按照加密算法的要求分好组,然后对倒数第二组密文进行构造;

(2)先假定明文只填充了一字节,对倒数第二组密文的最后一字节从0x00到0xff逐个赋值并逐个向服务器提交,直到服务返回值表示构造后的密文可以正常解密,这意味着构造后的密文作为中间值(图中黄色的那一行)解密最后一组明文,明文的最后一位是0x01(如图所示),也就是说构造的倒数第二组密文的最后一字节与最后一组密文对应中间值(绿色的那一行)的最后一位相异或的结果是0x01;

Padding oracle attack详细解析

(3)利用异或运算的性质,我们把我们构造的密文的最后一字节与0x01异或便可得到最后一位密文解密后的中间值是什么,这里我们设为M1,这一过程其实就是对应下图CBC解密过程中红圈圈出来的地方,1就是我们想要得到的中间值,二就是我们构造的密文也就是最后一组密文的IV值,我们已经知道了plaintext的最后一字节是0x01,从图中可以看到它是由我们构造的IV值与中间值的最后一字节异或得到的;

Padding oracle attack详细解析

(4)再假定明文填充了两字节也就是明文最后两字节是0x02,接着构造倒数第二组密文,我们把M1与0x02异或可以得到填充两字节时密文的最后一位应该是什么,这时候我们只需要对倒数第二位进行不断地赋值尝试(也是从0x00到0xff),当服务器返回值表示可以正常解密时,我们把此时的倒数第二位密文的取值与0x02异或便可得到最后一组密文倒数第二字节对应的中间值;

(5)后再构造出倒数第三倒数第四直到得到最后一组密文的中间值,把这个中间值与截获的密文的倒数第二位异或便可得到最后一组分组的明文;

(6)舍弃掉最后一组密文,只提交第一组到倒数第二组密文,通过构造倒数第三组密文得到倒数第二组密文的铭文,最后我们便可以得到全部的明文

四、漏洞复现

鸽了

留下评论