Apache Shiro 基础与 RememberMe 机制
Apache Shiro 基础与 RememberMe 机制写在前面前面反序列化系列我们讲了 CC 链执行体和 RMI投递通道。这篇开个新坑–Apache Shiro。Shiro 是 Java 里和 Spring Security 并列的安全框架在国内项目里铺得很广。它有两个特别经典的漏洞方向RememberMe 反序列化Shiro-550 / Shiro-721Shiro 的记住我功能把用户身份序列化后塞进 Cookie反序列化时就是readObject入口–和 RMI 一样是反序列化的投递通道。权限绕过CVE-2020-1957 等一连串Shiro 和 Spring 对 URL 路径的解析不一致导致鉴权被绕过。这篇是 Shiro 专栏的地基讲清 Shiro 框架、RememberMe 机制、以及为什么它会成为反序列化和权限绕过的温床。后面 550/721/权限绕过各篇都在这个基础上展开。前置Java 反序列化漏洞基础、CC 链系列。一、Shiro 是什么Apache Shiro 是一个 Java 安全框架提供四大功能Authentication认证验证你是谁登录。Authorization授权验证你能做什么权限。Cryptography加密提供加解密工具。Session Management会话管理自带会话机制不依赖 HttpSession可用于非 Web 环境。和 Spring Security 比Shiro 更轻量、API 更友好所以在国内中小项目里很常见。核心概念Subject当前操作者的抽象可以是用户、第三方服务等。所有安全操作都通过 Subject 发起比如subject.login(token)、subject.checkPermission(user:create)。SecurityManager核心调度器管理所有 Subject、Realm、Session。Shiro 的所有组件都由 SecurityManager 协调。Realm数据源桥梁。Shiro 自己不知道用户密码存在哪Realm 负责从 DB/配置/LDAP 读用户、角色、权限并完成实际的认证授权校验。应用通常自定义一个 Realm 继承AuthorizingRealm。SessionShiro 自带的会话Subject.getSession()不依赖 Servlet 容器的 HttpSession。二、Shiro 的认证流程一次典型的登录// 1. 封装用户名密码勾选 RememberMeUsernamePasswordTokentokennewUsernamePasswordToken(admin,123456);token.setRememberMe(true);// 2. Subject 登录SubjectcurrentUserSecurityUtils.getSubject();try{currentUser.login(token);// - SecurityManager - Realm 验证// 登录成功}catch(AuthenticationExceptione){// 登录失败}subject.login(token)背后SecurityManager 把 token 交给配置的 RealmRealm 的doGetAuthenticationInfo从数据源查用户、比对密码返回AuthenticationInfo含 Principal 用户身份。成功则 Subject 认证通过。三、RememberMe 机制重点用户勾选记住我登录成功后Shiro 把用户身份记住在 Cookie 里下次访问不用重新登录。这是 Shiro-550 和 Shiro-721 的共同根源。3.1 登录时身份写进 Cookie登录成功token.isRememberMe() true │ ▼ 1. 取 Principal用户身份对象 2. 序列化 Principal // Java 序列化 - byte[] 3. AES 加密 // 默认 CBC 模式 4. Base64 编码 // 转成 Cookie 安全的文本 5. 写入 rememberMe Cookie3.2 下次请求从 Cookie 恢复身份请求带 rememberMe Cookie │ ▼ 1. 读 Cookie 值 2. Base64 解码 3. AES 解密 4. ★ 反序列化恢复 Principal // ObjectInputStream.readObject() - 攻击点 5. 用 Principal 恢复身份免登录第 4 步反序列化恢复 Principal就是readObject入口。Cookie 内容攻击者可控只要能控制 Cookie 里的密文就能让 Shiro 反序列化任意对象。四、RememberMe 的反序列化攻击面把 RememberMe 流程和反序列化两步法对一下入口类Shiro 的CookieRememberMeManager读 Cookie 后readObject还原 Principal。执行体CC 链或其他 gadget 链。攻击者把 gadget payload 加密塞进 CookieShiro 解密后readObject触发。Shiro 在这里只是投递通道和 RMI 同类角色真正干活的还是 gadget 链。两个漏洞的差别在怎么控制 Cookie 密文Shiro-550CVE-2016-4437密钥泄露影响Shiro ≤ 1.2.4根因AES 密钥硬编码在源码里默认kPHbIxk5D2deZiIxcaaaA。利用攻击者知道密钥直接用它加密 CC 链 payload放进 Cookie。Shiro 解密成功 - 反序列化 - RCE。门槛低密钥是公开的加密一段 payload 就行。Shiro-721CVE-2019-12422Padding Oracle影响Shiro 1.2.5 ~ 1.4.1根因1.2.5 起密钥随机化了但 RememberMe 仍用AES-CBC模式CBC 存在 Padding Oracle 漏洞。利用攻击者先登录一个合法账号拿到一个合法rememberMeCookie再用 Padding Oracle 攻击逐字节篡改密文构造出含反序列化 payload 的任意密文–全程不需要密钥。门槛高需要有效账号 Padding Oracle 攻击慢通常数千次请求。两者最终都落在反序列化 Principal这一步区别只是密文怎么来。一个 Shiro 特有的坑gadget 链选择Shiro 反序列化有几个和 RMI 不同的地方Shiro 默认 classpath 不一定有 commons-collections但自带 commons-beanutils。所以实战中 Shiro-550 常用CommonsBeanutils1CB1链而非 CC 链–CB1 用BeanComparatorTemplatesImpl依赖 Shiro 自带的 commons-beanutils更通用。Shiro 用自己的ClassResolvingObjectInputStream对类加载较严格某些 CC 链可能跑不通。Cookie 有长度限制。CB1 等链的 payload 较大可能超 Cookie 限制被截断需要想办法缩短 payload或分块。这些细节在 Shiro-550 篇展开。五、Shiro 权限校验与路径绕过预告RememberMe 是反序列化方向另一大方向是权限绕过。Shiro 在 Web 环境里通过ShiroFilterFactoryBean配置URL 过滤器链把 URL 模式映射到过滤器anon匿名可访问、authc需登录、perms需某权限等filterChainDefinitionMap.put(/login,anon);filterChainDefinitionMap.put(/admin/**,authc, perms[admin:*]);filterChainDefinitionMap.put(/**,authc);// 其他都需登录请求进来时Shiro 拿请求 URL 去匹配过滤器链做鉴权。问题在于Shiro 对 URL 路径的解析和 Spring MVC / Servlet 容器不一致。比如Shiro 可能不处理;Spring 的矩阵变量分隔符导致/admin/..;/login在 Shiro 看是/loginanon在 Spring 看是/admin/..受保护。URL 编码、双重编码、/规范化的处理差异也能让 Shiro 和 Spring 对同一个 URL 产生不同理解。攻击者利用这种不一致构造一个 Shiro 以为无需鉴权、但 Spring 实际路由到受保护资源的 URL从而绕过权限。这是 CVE-2020-1957 等一连串漏洞的共同根。综述篇会统一讲透。六、小结这篇是 Shiro 专栏的地基几个核心认知Shiro 是 Java 安全框架核心是 Subject / SecurityManager / Realm提供认证、授权、加密、会话。RememberMe 是反序列化的根身份序列化 AES Base64 存 Cookie恢复时readObject还原 Principal 反序列化入口。Shiro-550 vs Shiro-721都是 RememberMe 反序列化区别在密文来源–550 密钥泄露直接加密721 Padding Oracle合法 Cookie 篡改。权限绕过的根Shiro 与 Spring 的 URL 路径解析不一致。Shiro 是通道gadget 链是执行体和 RMI 一样的定位但 Shiro 默认带 commons-beanutils常用 CB1 链。接下来三篇Shiro-550 复现、Shiro-721 复现、权限绕过综述。参考Apache Shiro 官方文档https://shiro.apache.org/

相关新闻

格拉辛纸热封胶初粘力和持粘力指标

格拉辛纸热封胶初粘力和持粘力指标

在探讨格拉辛纸热封胶的应用时、我们需要全面了解初粘力和持粘力这两个核心指标。初粘力涉及胶水在初次接触材料时的粘附能力粘附强度,直接影响到产品最终的耐用性。因此、通过有效评估这两个指标热封胶,也能改善产品质量,进而提高生产效率与…

2026/8/30 13:10:21 阅读更多 →
OBS Studio直播画面调色指南:从普通到专业的3个色彩魔法

OBS Studio直播画面调色指南:从普通到专业的3个色彩魔法

OBS Studio直播画面调色指南:从普通到专业的3个色彩魔法 【免费下载链接】obs-studio OBS Studio - Free and open source software for live streaming and screen recording 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 想让你的直播画面…

2026/9/3 7:02:06 阅读更多 →
ESPHome扩展reTerminal E:RTC、SD卡与麦克风集成实战

ESPHome扩展reTerminal E:RTC、SD卡与麦克风集成实战

1. 项目概述:为reTerminal E系列注入“感官”与“记忆”如果你手头有一块Seeed Studio的reTerminal E系列开发板,并且正在使用ESPHome来构建你的智能家居或物联网项目,那么你很可能已经体验到了它作为显示和交互终端的便捷。这块板子集成了屏…

2026/9/1 20:20:26 阅读更多 →

最新新闻

打字赶不上说话?Handy 免费离线语音转文字,1 分钟安装上手

打字赶不上说话?Handy 免费离线语音转文字,1 分钟安装上手

打字赶不上说话?Handy 免费离线语音转文字,1 分钟安装上手 【免费下载链接】Handy A free, open source, and extensible speech-to-text application that works completely offline. 项目地址: https://gitcode.com/GitHub_Trending/handy11/Handy …

2026/9/3 9:18:47 阅读更多 →
QtScrcpy完整指南:5分钟接通手机,用键鼠操控任意手游

QtScrcpy完整指南:5分钟接通手机,用键鼠操控任意手游

QtScrcpy完整指南:5分钟接通手机,用键鼠操控任意手游 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 深夜排位,敌人已经贴脸,你的拇指…

2026/9/3 9:18:47 阅读更多 →
免费开源 Mac 菜单栏管理神器 Ice 终极指南

免费开源 Mac 菜单栏管理神器 Ice 终极指南

免费开源 Mac 菜单栏管理神器 Ice 终极指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice Mac 菜单栏图标越堆越多,Wi-Fi、电池、时间被挤到角落,甚至直接消失?开…

2026/9/3 9:18:47 阅读更多 →
微信小程序蓝牙控制硬件实战:HC-05模块连接与继电器控制

微信小程序蓝牙控制硬件实战:HC-05模块连接与继电器控制

简介:本资源是一套完整的微信小程序蓝牙控制继电器及串口调试实战项目源码,面向嵌入式开发初学者、物联网爱好者与微信小程序进阶开发者,解决硬件远程控制与双向通信调试的实际问题,适用于智能家居、实验室自动化等场景。压缩包共…

2026/9/3 9:18:47 阅读更多 →
Claude Code Templates 实操:GitHub、PostgreSQL 与云服务 MCPs 的配置与监控

Claude Code Templates 实操:GitHub、PostgreSQL 与云服务 MCPs 的配置与监控

Claude Code Templates 实操:GitHub、PostgreSQL 与云服务 MCPs 的配置与监控 【免费下载链接】claude-code-templates CLI tool for configuring and monitoring Claude Code 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-templates 当项…

2026/9/3 9:18:47 阅读更多 →
《无畏契约》霓虹町A区A1包位战术解析与阵容站位指南

《无畏契约》霓虹町A区A1包位战术解析与阵容站位指南

如果你玩过《无畏契约》的霓虹町地图,可能已经对A点的防守感到头疼——特别是那个被很多攻略推荐的"A点安全包"。但今天我要说一个可能颠覆你认知的观点:那个所谓的安全包位,其实是霓虹町最垃圾的包位选择。为什么这么说&#xff1…

2026/9/3 9:17:45 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开,这不是劝退文,而是想讲清楚一件事:用 AI 做逆向值不值得学?如果要用,怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词,很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →