shiro反序列化

ApacheShiro框架的RememberMe功能存在一个安全漏洞,允许攻击者通过构造特定的Payload,利用未修改的默认AES密钥进行反序列化远程代码执行。该漏洞影响Shiro1.2.4及更低版本,涉及的步骤包括命令序列化、AES加密、Base64编码并设置为Cookie值。文章提到了漏洞复现的环境配置以及靶场镜像的获取方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

漏洞原理:

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
那么,Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

影响版本:

Apache Shiro <= 1.2.4

shiro 默认使用了 CookieRememberMeManager,其处理cookie的流程是:

得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化

然而AES的密钥是硬编码的,导致攻击者可以构造任意数据造成反序列化RCE,payload:

恶意命令–>序列化–>AES加密–>base64编码–>发送cookie

漏洞复现

kali ip:192.168.5.128
centos靶机ip:192.168.5.130

拉取靶场镜像

docker pull medicean/vulapps:s_shiro_1
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
原本端口是8080给他换成8081

在这里插入图片描述
后面的步骤就不做具体分析了,可以看看这篇
shiro反序列化漏洞复现

<think>嗯,用户想知道Shiro反序列化漏洞中Payload生成的过程,特别是构造方法和原理。首先,我需要回忆一下Shiro反序列化漏洞的基本知识。Shiro在记住我功能中使用加密的序列化数据,而攻击者可能利用弱密钥或已知密钥来构造恶意对象。 首先,Payload生成的关键步骤应该包括反序列化利用链、加密和编码。我记得Shiro550和721的区别,550是已知密钥,而721需要Padding Oracle攻击。用户的问题可能更关注Shiro550的情况,因为这是比较常见的。 接下来,构造Payload的过程大概分为几个阶段:生成恶意对象、序列化、加密(AES-CBC)、Base64编码。需要确保每一步都正确,比如选择正确的利用链,比如CommonsBeanutils或者JRMPClient,然后进行序列化。加密时要注意密钥是否正确,因为如果密钥不正确,Shiro解密会失败,无法触发反序列化。 可能还需要提到加密模式,比如AES-CBC和填充方式,这里可能会有Padding Oracle的问题,特别是在Shiro721中。不过用户的问题可能更侧重于生成Payload的构造方法,所以需要详细说明每一步的具体操作,比如如何用ysoserial生成Gadget,然后使用密钥加密,再进行Base64编码,最后设置到Cookie中。 同时,要引用提供的参考资料,比如引用[2]中的解密过程,以及引用[4]中的密钥碰撞问题。还要注意漏洞的影响版本,比如引用[1]提到的CVE-2022-32532,但用户的问题主要关于反序列化,所以可能需要区分不同的CVE。 最后,要确保回答结构清晰,分步骤解释,并生成相关问题。可能需要检查是否有遗漏的步骤,比如密钥获取的方式,或者不同利用链的选择。另外,要提醒用户实际测试需要合法授权,避免法律问题。</think>### Apache Shiro 反序列化漏洞 Payload 构造方法及原理 #### 一、漏洞背景 Apache Shiro反序列化漏洞(如 CVE-2016-4437/Shiro550)源于其“记住我”(RememberMe)功能的加密流程缺陷。攻击者通过构造恶意序列化数据,结合已知密钥或加密模式漏洞,可实现远程代码执行[^1][^2]。 #### 二、Payload 构造核心步骤 1. **利用链选择** 使用反序列化利用链(Gadget Chain)生成恶意对象,例如: - `CommonsBeanutils1`(依赖特定版本库) - `JRMPClient`(利用远程类加载) ```python # 示例:通过ysoserial工具生成Payload java -jar ysoserial.jar CommonsBeanutils1 "命令" > payload.bin ``` 2. **序列化与加密** Shiro 使用 AES-128-CBC 模式对序列化数据加密,需以下步骤: - **序列化**:将恶意对象转换为字节流 - **填充**:按 PKCS5/PKCS7 标准填充至块大小整数倍 - **加密**:使用硬编码或泄露的密钥加密 ```python # 伪代码:AES-CBC加密流程 iv = random(16 bytes) cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(padded_data) ``` 3. **编码与传输** 加密后的数据通过 Base64 编码后植入 Cookie: ```python rememberMe = base64.b64encode(iv + ciphertext) ``` #### 三、关键原理分析 1. **密钥硬编码问题** Shiro 默认密钥 `kPH+bIxk5D2deZiIxcaaaA==` 公开,攻击者可碰撞其他弱密钥[^4]。 2. **加密模式缺陷** AES-CBC 模式若未正确校验填充,可能被用于 Padding Oracle 攻击(如 Shiro721)[^3]。 3. **反序列化触发点** Shiro反序列化前会解密数据并调用 `ObjectInputStream.readObject()`,导致恶意代码执行。 #### 四、防御规避技术 1. **密钥混淆**:利用多个密钥生成 Payload 尝试绕过 2. **流量伪装**:通过合法 Cookie 结构隐藏恶意 Payload 3. **利用链组合**:结合依赖库特性构造无回显攻击链
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值