shiro反序列化漏洞原理分析以及漏洞复现
字数 1834 2025-08-10 08:28:00

Apache Shiro反序列化漏洞深度分析与复现指南

一、漏洞概述

1.1 Shiro框架简介

Apache Shiro是一个强大易用的Java安全框架,提供认证、授权、加密和会话管理等功能。在身份验证过程中,Shiro提供了"Remember Me"功能,允许用户在关闭浏览器后仍保持登录状态。

1.2 漏洞分类

Shiro反序列化漏洞主要分为两类:

  • Shiro-550 (CVE-2016-4437):硬编码密钥导致的漏洞
  • Shiro-721 (CVE-2019-12422):Padding Oracle攻击漏洞

二、Shiro-550漏洞分析

2.1 漏洞原理

  • 根本原因:Shiro <=1.2.4版本中AES加密使用的密钥硬编码在源码中
  • 攻击流程
    1. 攻击者构造恶意对象并序列化
    2. 使用已知密钥进行AES加密
    3. Base64编码后作为rememberMe cookie发送
    4. 服务器解码、解密并反序列化,执行恶意代码

2.2 漏洞特征

  • Cookie中含有rememberMe字段
  • 返回包中包含rememberMe=deleteMe字样

2.3 加密流程分析

  1. 用户登录并勾选"Remember Me"
  2. Shiro验证通过后序列化用户身份
  3. 序列化内容进行AES加密
  4. Base64编码后放入cookie的rememberMe字段

2.4 解密流程分析

  1. 服务端从cookie获取rememberMe字段
  2. Base64解码
  3. AES解密
  4. 反序列化获取用户身份

三、Shiro-721漏洞分析

3.1 与Shiro-550的区别

特性 Shiro-550 Shiro-721
密钥 硬编码已知 随机生成
前提 无需登录 需要有效用户凭证
攻击方式 直接利用 Padding Oracle攻击

3.2 漏洞原理

  • 使用AES-128-CBC模式加密rememberMe字段
  • 通过Padding Oracle Attack构造恶意rememberMe
  • 利用有效的RememberMe cookie作为攻击前缀

3.3 攻击流程

  1. 登录网站获取合法RememberMe cookie
  2. 使用该cookie作为Padding Oracle Attack前缀
  3. 加密序列化payload构造恶意RememberMe
  4. 发送新cookie执行反序列化攻击

3.4 Padding Oracle Attack原理

  • 利用加密算法填充错误的响应信息
  • 无需知道加密密钥即可解密或加密数据
  • 通过不同填充方式的响应时间推断密钥信息

四、漏洞复现指南

4.1 Shiro-550复现(CVE-2016-4437)

环境准备

  • 操作系统:Kali Linux
  • 靶场环境:vulhub/shiro/CVE-2016-4437

复现步骤

  1. 访问目标URL并抓包
  2. 检查返回包中是否存在rememberMe=deleteMe
  3. 使用工具检测确认:
    • 输入目标URL
    • 根据关键字爆破密钥
    • 爆破利用链及回显方式
  4. 命令执行:
    whoami
    
  5. 反弹shell:
    • 设置监听端口
    • Windows: nc -lvp 4444
    • Linux: nc -lvvp 4444
    • 使用工具生成反弹shell payload

工具推荐

  • ShiroExploit
  • ysoserial (使用JRMP监听模块反弹shell)

4.2 Shiro-721复现(CVE-2019-12422)

环境搭建

git clone https://github.com/3ndz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
docker run -p 8080:8080 -d shiro-721

复现步骤

  1. 访问目标URL
  2. 使用正确账号密码登录(勾选Remember Me)
  3. 抓包获取合法Cookie中的rememberMe值
  4. 将值复制到工具中
  5. 选择Shiro721攻击模式
  6. 输入目标URL和rememberMe值
  7. 等待攻击完成
  8. 执行系统命令

五、修复建议

5.1 Shiro-550修复方案

  1. 升级Shiro到1.2.4以上版本
  2. 不使用默认加密密钥,改为随机生成
  3. 定期更换加密密钥

5.2 Shiro-721修复方案

  1. 升级到最新安全版本
  2. 使用安全的加密算法和密钥管理策略
  3. 禁用不安全的加密模式

六、总结

Shiro反序列化漏洞由于利用简单、危害大,成为Java Web应用的重要安全隐患。理解其原理和复现方法有助于更好地防御此类攻击。管理员应及时更新Shiro版本,开发者应避免使用不安全的安全配置,安全人员可通过复现加深理解漏洞本质。

Apache Shiro反序列化漏洞深度分析与复现指南 一、漏洞概述 1.1 Shiro框架简介 Apache Shiro是一个强大易用的Java安全框架,提供认证、授权、加密和会话管理等功能。在身份验证过程中,Shiro提供了"Remember Me"功能,允许用户在关闭浏览器后仍保持登录状态。 1.2 漏洞分类 Shiro反序列化漏洞主要分为两类: Shiro-550 (CVE-2016-4437) :硬编码密钥导致的漏洞 Shiro-721 (CVE-2019-12422) :Padding Oracle攻击漏洞 二、Shiro-550漏洞分析 2.1 漏洞原理 根本原因 :Shiro <=1.2.4版本中AES加密使用的密钥硬编码在源码中 攻击流程 : 攻击者构造恶意对象并序列化 使用已知密钥进行AES加密 Base64编码后作为rememberMe cookie发送 服务器解码、解密并反序列化,执行恶意代码 2.2 漏洞特征 Cookie中含有rememberMe字段 返回包中包含rememberMe=deleteMe字样 2.3 加密流程分析 用户登录并勾选"Remember Me" Shiro验证通过后序列化用户身份 序列化内容进行AES加密 Base64编码后放入cookie的rememberMe字段 2.4 解密流程分析 服务端从cookie获取rememberMe字段 Base64解码 AES解密 反序列化获取用户身份 三、Shiro-721漏洞分析 3.1 与Shiro-550的区别 | 特性 | Shiro-550 | Shiro-721 | |------|----------|----------| | 密钥 | 硬编码已知 | 随机生成 | | 前提 | 无需登录 | 需要有效用户凭证 | | 攻击方式 | 直接利用 | Padding Oracle攻击 | 3.2 漏洞原理 使用AES-128-CBC模式加密rememberMe字段 通过Padding Oracle Attack构造恶意rememberMe 利用有效的RememberMe cookie作为攻击前缀 3.3 攻击流程 登录网站获取合法RememberMe cookie 使用该cookie作为Padding Oracle Attack前缀 加密序列化payload构造恶意RememberMe 发送新cookie执行反序列化攻击 3.4 Padding Oracle Attack原理 利用加密算法填充错误的响应信息 无需知道加密密钥即可解密或加密数据 通过不同填充方式的响应时间推断密钥信息 四、漏洞复现指南 4.1 Shiro-550复现(CVE-2016-4437) 环境准备 操作系统:Kali Linux 靶场环境:vulhub/shiro/CVE-2016-4437 复现步骤 访问目标URL并抓包 检查返回包中是否存在rememberMe=deleteMe 使用工具检测确认: 输入目标URL 根据关键字爆破密钥 爆破利用链及回显方式 命令执行: 反弹shell: 设置监听端口 Windows: nc -lvp 4444 Linux: nc -lvvp 4444 使用工具生成反弹shell payload 工具推荐 ShiroExploit ysoserial (使用JRMP监听模块反弹shell) 4.2 Shiro-721复现(CVE-2019-12422) 环境搭建 复现步骤 访问目标URL 使用正确账号密码登录(勾选Remember Me) 抓包获取合法Cookie中的rememberMe值 将值复制到工具中 选择Shiro721攻击模式 输入目标URL和rememberMe值 等待攻击完成 执行系统命令 五、修复建议 5.1 Shiro-550修复方案 升级Shiro到1.2.4以上版本 不使用默认加密密钥,改为随机生成 定期更换加密密钥 5.2 Shiro-721修复方案 升级到最新安全版本 使用安全的加密算法和密钥管理策略 禁用不安全的加密模式 六、总结 Shiro反序列化漏洞由于利用简单、危害大,成为Java Web应用的重要安全隐患。理解其原理和复现方法有助于更好地防御此类攻击。管理员应及时更新Shiro版本,开发者应避免使用不安全的安全配置,安全人员可通过复现加深理解漏洞本质。