目录
0x01、前言
相信大家总是面试会问到java反序列化,或者会问到标志性的漏洞,比如shiro反序列化,或者weblogic反序列化漏洞。
那我就这篇文章为大家讲解一下,不懂的哥哥直接背一下,理解一下就好了。
至于为什么要选择shiro反序列化呢,不讲weblogic呢?
因为我上次有幸参与金鸡电影节的临时安全负责人,具体我就不细说了。当时是内部涉及到shiro反序列化漏洞。
准确的来说是Shiro<1.2.4-RememberMe反序列化漏洞。
而它也被称为Shiro 550反序列化漏洞。
细品细品...
0x02、环境搭建
下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4
环境:Tomcat 8.5.27 + idea 2020.2 + jdk 1.8 +maven 3.6
下载之后之后直接打开,并open这个web文件夹即可,其他自行百度就行,其中还需要导入一些jstl的jar等等
0x03、漏洞原理
shiro默认使用了CookieRememberMeManager
,其处理cookie的流程是:
得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化
然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
payload 构造的顺序则就是相对的反着来:
恶意命令-->序列化-->AES加密-->base64编码-->发送cookie
在整个漏洞利用过程中,比较重要的是AES加密的密钥,该秘钥默认是默认硬编码的,所以如果没有修改默认的密钥,就自己可以生成恶意构造的cookie了。
shiro特征:
-
未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
-
登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
-
不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
-
勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段
0x04、漏洞复现
复现文章https://blog.csdn.net/weixin_43571641/article/details/108182722
0x05、漏洞分析
简单介绍利用:
-
通过在cookie的rememberMe字段中插入恶意payload,
-
触发shiro框架的rememberMe的反序列化功能,导致任意代码执行。
-
shiro 1.2.24中,提供了硬编码的AES密钥:kPH+bIxk5D2deZiIxcaaaA==
-
由于开发人员未修改AES密钥而直接使用Shiro框架,导致了该问题
5.1、加密
那既然我们要分析,那入口点在哪呢?
Shiro≤1.2.4版本默认使用CookieRememberMeManager
而我们看看这边CookieRememberMeManager
类继承了AbstractRememberMeManager
,我们进去看看是什么梗
我们可以看到这边这个类里面有硬编码。
然后它又继承了RememberMeManager
接口;我们继续进去看看是怎么回事
看名字的话可以知道这些是登陆成功,登陆失败,退出的一些service;既然如此,肯定会调用这个登陆成功的接口,然后再去实现这个接口。
所以我们直接在这个接口下个断点,看看是怎么个流程;