0

0

Apache Shiro 1.2.4反序列化漏洞实例分析

王林

王林

发布时间:2023-05-16 19:40:24

|

1285人浏览过

|

来源于亿速云

转载

0x00 apache shiro

这个组件的漏洞很久之前就爆出来了,但是最近工作中又遇到了,刚好最近也在看java反序列化的东西,所以决定拿出来再分析一下,期间也遇到了一些奇怪的问题。

网上的分析文章中大部分都是手动添加了commons-collections4-4.0的依赖,目的是为了使用ysoserial生成的CommonsCollections2这个payload,然而我遇到的情况是使用了CommonsBeanutils1就可以直接打成功,所以这里我们不再重复网上对CommonsCollections2的分析了。

0x01 调试分析

调试环境:

JDK 1.8.0_72Tomcat 8.0.30

首先我们把shiro的源码clone回来,并切到有问题的分支上去。

git clone https://github.com/apache/shiro.git shiro-rootcd shiro-root
git checkout 1.2.0

为了能让shiro自带的sample跑起来,要对samples/web/pom.xml文件做一些修改,需要将jstl的版本改为1.2,并且删掉servlet-api的scope字段。把jstl-1.2.jar放到WEB-INF/lib目录下。然后应该就可以跑起来并且调试了。

我们将断点打到org.apache.shiro.mgt.DefaultSecurityManager中的resolvePrincipals方法,并且发送一个带有rememberMe Cookie的请求,应该就可以断下来了。

Apache Shiro 1.2.4反序列化漏洞实例分析

我们继续跟进这个getRememberedIdentity方法: 

Apache Shiro 1.2.4反序列化漏洞实例分析继续一直跟到getRememberedSerializedIdentity方法: 

Apache Shiro 1.2.4反序列化漏洞实例分析在这个方法中,读出了我们传入的Cookie,并且进行了base64解码: 

Apache Shiro 1.2.4反序列化漏洞实例分析接下来shiro会调用convertBytesToPrincipals并将base64解码后的字节数组作为参数传入:

Apache Shiro 1.2.4反序列化漏洞实例分析

这里通过函数名也能猜出来,进行了两个操作,分别是解密和反序列化,我们先来看解密部分,经过简单的调试后,发现是一个AES解密,并且存在一个预设秘钥Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");,在shiro自带的sample中,并没有通过其他的方式设置这个秘钥,所以这里用的就是这个预设值。

而AES解密中遇到的IV也是从我们传入的Cookie中的前几个字节中获取的,于是我们可以轻易的构造出包含任意内容的Cookie值,解密好的明文就是序列化的内容,调用了deserialize进行反序列化。

VIVA
VIVA

一个免费的AI创意视觉设计平台

下载

最终会调用到org.apache.shiro.io.DefaultSerializer#deserialize方法进行反序列化:    
Apache Shiro 1.2.4反序列化漏洞实例分析

整个流程十分简单,简要概括一下就是:读取cookie -> base64解码 -> AES解密 -> 反序列化

所以我们的payload构造起来也是十分的简单,完整的PoC我会放到我的GitHub上。

0x02 疑点解惑

在调试的过程中,遇到了一些问题,并没有成功的弹出计算器,这里记录一下。

1. 为什么本地搭建环境,使用CommonsBeanutils1打不成功,总是提示ClassNotFound异常?

这个问题我当时调试了好久,一度以为是payload有问题或者shiro的代码因为年代久远有了变化,因为当时遇到的case就是这个payload一发入魂的,表示十分的迷茫。后来发现了关键问题,我们从github上clone到的sample中,commons-beanutils这个依赖的版本是1.8.3,而ysoserial生成的payload的版本是1.9.2,所以在默认的sample中是无法打成功的。于是我修改版本号到1.9.2,一发入魂。

所以遇到的那个案例中,实际的依赖环境版本可能也是这样的吧,所以才能直接打成功。

2. 假如我的依赖中就是没有高版本的commons-beanutils和commons-collections之类的包,怎么利用?

这个项目clone下来之后,可以看到是存在一个commons-collections的包的: 

Apache Shiro 1.2.4反序列化漏洞实例分析

尝试使用ysoserial提供的CommonsCollections1时会抛出异常,无法成功

Apache Shiro 1.2.4反序列化漏洞实例分析调试时发现在这里抛出的异常,为什么无法将byte数组反序列化令人十分困惑

Apache Shiro 1.2.4反序列化漏洞实例分析

查了一下Java中Class.forName()以及ClassLoader.loadClass()的区别,发现forName()总是使用调用者的ClassLoader(),而loadClass()则是可以自己指定一个不同的ClassLoader。那shiro中的ClasssLoader是怎么来的?是通过Thread.currentThread().getContextClassLoader();获取的,也就是WebappClassLoader。但是为啥提示无法加载byte array呢,搜索了一番看到了orange博客下面的讨论,了解到了整个事情的真相:

Shiro resovleClass使用的是ClassLoader.loadClass()而非Class.forName(),而ClassLoader.loadClass不支持装载数组类型的class。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

393

2023.08.08

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

445

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1946

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1168

2024.11.28

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.8万人学习

尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.3万人学习

Linux优化视频教程
Linux优化视频教程

共14课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号