Shiro组件漏洞与攻击链分析
字数 2590 2025-08-15 21:32:20

Apache Shiro组件漏洞与攻击链分析教学文档

一、组件介绍

Apache Shiro是一个功能强大且易于使用的Java安全框架,提供以下核心功能:

  • 认证(Authentication): 用户身份验证(登录)
  • 授权(Authorization): 访问控制
  • 加密(Cryptography): 数据保护
  • 会话管理(Session Management): 用户会话状态管理

核心架构概念

  1. Subject: 当前用户或交互实体
  2. SecurityManager: 安全管理核心,协调所有安全操作
  3. 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==
  • 利用流程:
    1. 使用ysoserial生成恶意序列化payload
    2. 使用默认AES密钥加密payload
    3. 将加密结果放入Cookie的rememberMe字段
    4. 发送HTTP请求触发漏洞

3.2 普通权限→GetShell

利用链: CVE-2019-12422单独利用

  • 前提条件: 获取一个有效用户Cookie
  • 利用流程:
    1. 获取普通用户Cookie
    2. 通过Padding Oracle Attack爆破构造恶意密文
    3. 替换rememberMe字段值
    4. 发送请求触发反序列化

四、关键漏洞深度分析

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

攻击流程:

  1. 请求到达Shiro拦截器(OncePerRequestFilter#doFilter)
  2. 创建Subject并获取rememberMe序列化数据
  3. 使用硬编码AES密钥解密
  4. 反序列化执行恶意代码

补丁分析:
1.2.5版本改用generateNewKey()生成随机密钥

4.1.2 CVE-2019-12422分析

漏洞细节:

  • 影响版本: Shiro <1.4.2
  • 利用条件: AES CBC模式 + 可控密文 + 有效Cookie
  • 关键技术: Padding Oracle Attack

攻击原理:

  1. 利用AES CBC解密时的padding校验机制
  2. 根据错误响应差异逐字节爆破
  3. 构造公式: 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处理差异

两种攻击方式:

  1. Shiro <1.5.0: 路径末尾添加/

    • Shiro: 表达式不以/结尾且URI以/结尾→匹配失败
    • Spring: 自动补全/→匹配成功
  2. Shiro 1.5.0-1.5.1: 路径中添加;

    • Shiro的decodeAndCleanUriString会截断分号后内容
    • Spring会将/a/b;/c处理为/a/b/c

补丁分析:

  • 1.5.0: 清除URI结尾的/
  • 1.5.2: 改用getServletPath()+getPathInfo()拼接URI

4.2.2 CVE-2020-11989分析

两种攻击方式:

  1. 双重URL编码: %252f(编码为/)

    • Shiro解码两次,Spring解码一次
  2. 根目录分号绕过: ;/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字符
  • 匹配/**路径应用过滤

五、防御建议

  1. 升级策略:

    • 使用Shiro最新版本(>=1.6.0)
    • 下载地址: https://shiro.apache.org/download.html
  2. 配置加固:

    • 禁用rememberMe功能(如非必需)
    • 自定义AES加密密钥
    • 启用InvalidRequestFilter
  3. 架构设计:

    • 实现多层安全防护
    • 定期安全审计和渗透测试

六、参考资源

  1. Shiro官方文档
  2. Java反序列化漏洞原理
  3. Padding Oracle Attack详解
  4. Shiro架构解析
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 1.5.0-1.5.1 : 路径中添加 ; Shiro的 decodeAndCleanUriString 会截断分号后内容 Spring会将 /a/b;/c 处理为 /a/b/c 补丁分析 : 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 架构设计 : 实现多层安全防护 定期安全审计和渗透测试 六、参考资源 Shiro官方文档 Java反序列化漏洞原理 Padding Oracle Attack详解 Shiro架构解析