Apache Shiro 是如何产生的?

2003年初,由于缺乏适用于Java应用的全面安全框架,JSecurity项目(后成为Apache Shiro)应运而生。面对JAAS的不足及会话管理和加密方面的挑战,项目旨在提供一个统一的解决方案。

在2008年加入Apache软件基金会之前,Shiro已经5岁了,之前它被称为JSecurity项目,始于2003年初。当时,对于Java 应用开发人员而言,没有太多的通用安全替代方案 - 我们被Java认证/授权服务(或称为JAAS)紧紧套牢了。JAAS有太多的缺点 - 尽管它的认证功能尚可忍受,但授权方面却显得拙劣,用起来令人沮丧。此外,JAAS跟虚拟机层面的安全问题关系非常紧密,如判断JVM中是否允许装入一个 类。作为应用开发者,我更关心应用最终用户能做什么,而不是我的代码在JVM中能做什么。

由于当时正从事应用开发,需要一个干净、容器无关的会话机制。在当时,“这场游戏”中唯一可用的会话是HttpSessions,它需要Web 容器;或是EJB 2.1里的有状态会话Bean,这又要EJB容器。而想要的一个与容器脱钩、可用于任何环境中的会话。

最后就是加密问题。有时,我们需要保证数据安全,但是Java密码架构(JavaCryptography Architecture)让人难以理解,除非你是密码学专家。API里到处都是CheckedException,用起来很麻烦。需要一个干净、开箱即用的解决方案,可以在需要时方便地对数据加密/解密。

于是,纵观2003年初的安全状况,你会很快意识到还没有一个大一统的框架满足所有上述需求。有鉴于此,JSecurity(即之后的Apache 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. **利用链组合**:结合依赖库特性构造无回显攻击链
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peterwanghao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值