Shiro组件漏洞与攻击链分析
字数 2590 2025-08-15 21:32:20
Apache Shiro组件漏洞与攻击链分析教学文档
一、组件介绍
Apache Shiro是一个功能强大且易于使用的Java安全框架,提供以下核心功能:
- 认证(Authentication): 用户身份验证(登录)
- 授权(Authorization): 访问控制
- 加密(Cryptography): 数据保护
- 会话管理(Session Management): 用户会话状态管理
核心架构概念
- Subject: 当前用户或交互实体
- SecurityManager: 安全管理核心,协调所有安全操作
- Realm: 安全数据源连接器,实现认证和授权逻辑
二、高危漏洞分类
1. Java反序列化远程代码执行漏洞
- CVE-2016-4437/SHIRO-550: Shiro <=1.2.4默认AES密钥硬编码问题
- CVE-2019-12422/SHIRO-721: Shiro <1.4.2的Padding Oracle攻击
2. 身份验证绕过漏洞
- CVE-2020-1957/SHIRO-682: Shiro <1.5.2的URI路径匹配问题
- CVE-2020-11989/SHIRO-782: Shiro <1.5.3的双重URL编码绕过
- CVE-2020-13933: Shiro <1.6.0的分号处理差异问题
- SHIRO-760: AJP协议绕过
- CVE-2014-0074/SHIRO-460: Shiro <1.2.3的早期绕过漏洞
三、漏洞利用链分析
3.1 无权限→GetShell
利用链: CVE-2016-4437单独利用
- 前提条件: 获取AES加密密钥(默认
kPH+bIxk5D2deZiIxcaaaA==) - 利用流程:
- 使用ysoserial生成恶意序列化payload
- 使用默认AES密钥加密payload
- 将加密结果放入Cookie的rememberMe字段
- 发送HTTP请求触发漏洞
3.2 普通权限→GetShell
利用链: CVE-2019-12422单独利用
- 前提条件: 获取一个有效用户Cookie
- 利用流程:
- 获取普通用户Cookie
- 通过Padding Oracle Attack爆破构造恶意密文
- 替换rememberMe字段值
- 发送请求触发反序列化
四、关键漏洞深度分析
4.1 Java反序列化漏洞
4.1.1 CVE-2016-4437分析
技术背景:
- Java反序列化机制允许对象↔字节序列转换
- AES CBC模式加密流程:
- 字节替代(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 轮密钥加(AddRoundKey)
漏洞细节:
- 影响版本: Shiro <=1.2.4
- 漏洞位置:
org.apache.shiro.mgt.AbstractRememberMeManager - 利用限制: 无法使用含
Transformer[]的CommonCollections gadget
攻击流程:
- 请求到达Shiro拦截器(
OncePerRequestFilter#doFilter) - 创建Subject并获取rememberMe序列化数据
- 使用硬编码AES密钥解密
- 反序列化执行恶意代码
补丁分析:
1.2.5版本改用generateNewKey()生成随机密钥
4.1.2 CVE-2019-12422分析
漏洞细节:
- 影响版本: Shiro <1.4.2
- 利用条件: AES CBC模式 + 可控密文 + 有效Cookie
- 关键技术: Padding Oracle Attack
攻击原理:
- 利用AES CBC解密时的padding校验机制
- 根据错误响应差异逐字节爆破
- 构造公式:
IV' = 构造gadget密文块 ^ 16*\x10 ^IV
补丁分析:
1.4.2版本将AES模式从CBC改为GCM
4.2 身份验证绕过漏洞
4.2.1 CVE-2020-1957分析
漏洞细节:
- 影响版本: Shiro <1.5.2
- 根本原因: Shiro与Spring的URI处理差异
两种攻击方式:
-
Shiro <1.5.0: 路径末尾添加
/- Shiro: 表达式不以
/结尾且URI以/结尾→匹配失败 - Spring: 自动补全
/→匹配成功
- Shiro: 表达式不以
-
Shiro 1.5.0-1.5.1: 路径中添加
;- Shiro的
decodeAndCleanUriString会截断分号后内容 - Spring会将
/a/b;/c处理为/a/b/c
- Shiro的
补丁分析:
- 1.5.0: 清除URI结尾的
/ - 1.5.2: 改用
getServletPath()+getPathInfo()拼接URI
4.2.2 CVE-2020-11989分析
两种攻击方式:
-
双重URL编码:
%252f(编码为/)- Shiro解码两次,Spring解码一次
-
根目录分号绕过:
;/xxx/前缀- 利用
getContextPath()处理差异
- 利用
补丁分析:
1.5.3版本:
- 统一URL解码次数
- 优化
getPathWithinApplication方法
4.2.3 CVE-2020-13933分析
漏洞细节:
- 影响版本: Shiro <1.6.0
- 利用方式: 路径中添加
%3b(编码分号) - 根本原因:
- Shiro: 先URL解码→再分号分割
- Spring: 先分号分割→再URL解码
补丁分析:
1.6.0版本新增InvalidRequestFilter:
- 检测
;、\和非ASCII字符 - 匹配
/**路径应用过滤
五、防御建议
-
升级策略:
- 使用Shiro最新版本(>=1.6.0)
- 下载地址: https://shiro.apache.org/download.html
-
配置加固:
- 禁用rememberMe功能(如非必需)
- 自定义AES加密密钥
- 启用
InvalidRequestFilter
-
架构设计:
- 实现多层安全防护
- 定期安全审计和渗透测试