很重要,经典
Apache shiro-550反序列化漏洞分析
前言
中间件介绍:
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理
漏洞介绍:
ApacheShiro RememberMe 反序列化导致的命令执行漏洞
环境搭建
编辑器:
IDEA 2022
java版本:
jdk1.7.0_80
Server版本 :
Tomcat 8.5.56
shiro版本:
shiro-root-1.2.4
组件:
commons-collections4
下载jdk-7u80
https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html#jdk-7u80-oth-JPR
下载apache shiro 1.2.4
https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4
下载tomcat-8 v8.5.76
配置调试端口
但是运行时报错
搜索查找发现是少了两个jar
包
【直接官网找或者搜索网盘啥的,小心🐎就行】
jstl.jar
standard.jar
先将这两个导入依赖
然后放在tomcat
服务器文件目录底下的lib
目录下
成功加载
登录页面也成功显示
搭建完毕!
漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过
序列化
,AES加密
,然后base64编码
的cookie。在服务端对 rememberMe 的cookie值,先
base64解码
然后AES解密
再反序列化
,就导致了反序列化RCE漏洞。那么,Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是
AES加密的密钥
,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。
漏洞分析
- 过在 cookie 的 rememberMe 字段中插⼊恶意 payload
- 触发 shiro 框架的 rememberMe 的反序列化功能,导致任意代码执⾏。
- shiro 1.2.24 中,提供了硬编码的 AES 密钥:
kPH+bIxk5D2deZiIxcaaaA==
- 由于**开发人员未修改AES密钥而直接使用Shiro框架**,导致了该问题
1 | private static final byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="); |