Apache shiro-550反序列化漏洞分析

很重要,经典

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

https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.76/

image-20230722144653168

配置调试端口

image-20230722144930349

但是运行时报错

image-20230722230806143

搜索查找发现是少了两个jar

【直接官网找或者搜索网盘啥的,小心🐎就行】

jstl.jar

standard.jar

先将这两个导入依赖

image-20230722231157385

然后放在tomcat服务器文件目录底下的lib目录下

image-20230722232037189

成功加载

image-20230722232130625

登录页面也成功显示

image-20230722233339743

搭建完毕!

漏洞原理

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框架**,导致了该问题

image-20230726093857880

1
private static final byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");

代码分析

漏洞利用&poc分析