Shiro反序列化漏洞

Shiro550复现

https://www.cnblogs.com/h0cksr/p/16189761.html

Shiro550-反序列化

Apache Shiro框架提供了RemeberMe功能,用户登录成功后会生成经过加密并编码的cookie。cookie的key为RemeberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。

CVE编号:CVE-2016-4437

漏洞原理:该漏洞允许攻击者利用Shiro框架在处理记住密码功能(RememberMe)时使用的默认或可预测的AES加密密钥,通过构造恶意的序列化数据并将其加密和编码后发送至服务端,导致服务端在解密并反序列化过程中执行攻击者预设的代码,从而可能获取服务器的控制权。

1
2
3
4
5
6
7
检索RemeberMe cookie的值

Base64解码

使用ACE解密(加密密钥硬编码)

进行反序列化操作(未作过滤处理)

打开靶机是一个登录页面

wappalyzer 看一下 也没看出来啥

输入账号 密码 勾选记住我 然后登录抓包

image-20250118184421571

拦截返回包

可以看见 有个Set-Cookie rememberMe=deleteMe

这就是Apache Shiro组件的 特征

Apache Shiro™是一个强大且易用的Java安全框架,能够用于身份验证、授权、加密和会话管理,用于执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。

这里我直接利用工具就连上了

image-20250118184655962

利用工具过程是很简单的,下面我们来看看这个漏洞的触发流程

首先是set-cookie的过程

用户登录–>信息进行序列化–>AES加密–>base64编码–>添加到remember字段

勾选记住密码后,下次登录服务端取出你的cookie进行验证

验证过程

取出remember字段的值–>base64解码–>然后AES解密(漏洞利用的关键是这个密钥key是不变的,shiro版本<=1.2.24的版本中使用了固定的密钥kPH+bIxk5D2deZiIxcaaaA==)–>反序列化–>代码执行

这样攻击者用这个密钥实现加密操作然后在cookie的remember字段构造自己设计的代码就会被执行了

这里偷个大佬的流程图

image-20250118190247718

1
https://blog.csdn.net/Bossfrank/article/details/130173880

image-20250118190456530

登录成功且勾选rememberme才能看到set-cookie:rememberme=xxxxx

唉,java代码实在是看不懂,附上从代码分析流程,大佬讲的很好

1
https://www.bilibili.com/video/BV1iF411b7bD/?vd_source=93147f59d99436a0d4bc043cd0cbb64e

下面来看看shiro721

和shiro550相比,key是系统随即生成的了,不再是固定的,采用的是AES-128-CBC 模式加密

用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

EXP爆破时间很长,建议采用较短的命令来复现

涉及到一些密码学的知识,这篇文章写的很详细,想深入了解的可以看看

1
https://www.freebuf.com/articles/network/221838.html

简单来说就是我们知道了shiro的加密方式,然后利用padding oracle攻击来实现构造,根据服务器会对填充错误进行报错这个关键点,我们构造出一个虚假的IV值来反推中间值,根据异或运算的关系可以进行爆破。