Shiro漏洞复现(CVE-2016-4437)
字数 1343 2025-08-10 12:18:03

Apache Shiro漏洞复现教学文档 (CVE-2016-4437)

1. 漏洞概述

漏洞名称: Apache Shiro Java反序列化漏洞 (CVE-2016-4437)
影响版本: Apache Shiro 1.2.4及以前版本
漏洞类型: 反序列化漏洞
CVSS评分: 9.8 (严重)
漏洞本质: 硬编码加密密钥导致远程代码执行

2. 漏洞原理分析

2.1 Shiro认证机制

Apache Shiro在用户认证过程中会使用"remember me"功能,该功能将用户信息序列化后:

  1. 使用AES加密
  2. 进行Base64编码
  3. 存储在名为remember-me的Cookie中

2.2 漏洞成因

  • 硬编码密钥: Shiro默认使用硬编码的AES加密密钥
  • 反序列化风险: 攻击者可伪造Cookie,Shiro会对其进行解密并反序列化
  • 执行流程:
    恶意对象 → 序列化 → AES加密 → Base64编码 → 作为Cookie发送 → Shiro解密并反序列化 → 代码执行
    

2.3 Shiro-550与Shiro-721区别

特性 Shiro-550 (CVE-2016-4437) Shiro-721 (CVE-2019-12422)
密钥特性 固定密钥 随机生成密钥
利用难度 较简单 更复杂
利用方式 可爆破密钥 需要Padding Oracle攻击

3. 环境搭建

3.1 系统要求

  • CentOS 7虚拟机
  • Docker环境
  • Docker-compose工具

3.2 安装步骤

# 安装Docker
curl -s https://get.docker.com/ | sh

# 安装Docker-compose
curl -s https://bootstrap.pypa.io/get-pip.py | python3
pip install docker-compose

# 验证安装
docker-compose -v

# 部署Vulhub靶场
git clone https://github.com/vulhub/vulhub.git
cd vulhub/shiro/CVE-2016-4437
docker-compose up -d

4. 漏洞验证

4.1 访问靶场

  • 浏览器访问: http://[靶机IP]:8080
  • 默认凭证: admin/vulhub

4.2 特征识别

  1. 使用错误凭证登录并抓包

    • 请求中观察是否存在remember-me字段
    • 响应中检查是否有rememberMe=deleteMe
  2. 使用正确凭证登录

    • 观察响应中是否返回set-cookie

5. 漏洞利用

5.1 使用工具

推荐工具: ShiroExploit v2.51

5.2 利用步骤

  1. 使用工具爆破默认密钥
  2. 构造恶意序列化对象
  3. 生成恶意remember-me Cookie
  4. 发送包含恶意Cookie的请求
  5. 验证命令执行结果

5.3 示例截图

(此处应插入工具使用截图和命令执行结果截图)

6. 防护措施

6.1 官方修复方案

  • 升级到Shiro 1.2.5及以上版本
  • 官方已移除硬编码密钥,改为随机生成

6.2 临时缓解方案

  1. 在shiro.ini中配置自定义密钥:
    securityManager.rememberMeManager.cipherKey = your_random_base64_encoded_key
    
  2. 禁用remember-me功能

7. 靶场清理

# 在vulhub/shiro/CVE-2016-4437目录下执行
docker-compose down

8. 总结

  1. 该漏洞利用条件简单,危害严重
  2. 关键在于Shiro的硬编码加密密钥
  3. 对于Shiro-550可利用公开工具快速验证
  4. 及时升级是根本解决方案

附录

相关资源

Apache Shiro漏洞复现教学文档 (CVE-2016-4437) 1. 漏洞概述 漏洞名称 : Apache Shiro Java反序列化漏洞 (CVE-2016-4437) 影响版本 : Apache Shiro 1.2.4及以前版本 漏洞类型 : 反序列化漏洞 CVSS评分 : 9.8 (严重) 漏洞本质 : 硬编码加密密钥导致远程代码执行 2. 漏洞原理分析 2.1 Shiro认证机制 Apache Shiro在用户认证过程中会使用"remember me"功能,该功能将用户信息序列化后: 使用AES加密 进行Base64编码 存储在名为 remember-me 的Cookie中 2.2 漏洞成因 硬编码密钥 : Shiro默认使用硬编码的AES加密密钥 反序列化风险 : 攻击者可伪造Cookie,Shiro会对其进行解密并反序列化 执行流程 : 2.3 Shiro-550与Shiro-721区别 | 特性 | Shiro-550 (CVE-2016-4437) | Shiro-721 (CVE-2019-12422) | |------------|--------------------------|--------------------------| | 密钥特性 | 固定密钥 | 随机生成密钥 | | 利用难度 | 较简单 | 更复杂 | | 利用方式 | 可爆破密钥 | 需要Padding Oracle攻击 | 3. 环境搭建 3.1 系统要求 CentOS 7虚拟机 Docker环境 Docker-compose工具 3.2 安装步骤 4. 漏洞验证 4.1 访问靶场 浏览器访问: http://[靶机IP]:8080 默认凭证: admin/vulhub 4.2 特征识别 使用错误凭证登录并抓包 请求中观察是否存在 remember-me 字段 响应中检查是否有 rememberMe=deleteMe 使用正确凭证登录 观察响应中是否返回 set-cookie 头 5. 漏洞利用 5.1 使用工具 推荐工具: ShiroExploit v2.51 5.2 利用步骤 使用工具爆破默认密钥 构造恶意序列化对象 生成恶意remember-me Cookie 发送包含恶意Cookie的请求 验证命令执行结果 5.3 示例截图 (此处应插入工具使用截图和命令执行结果截图) 6. 防护措施 6.1 官方修复方案 升级到Shiro 1.2.5及以上版本 官方已移除硬编码密钥,改为随机生成 6.2 临时缓解方案 在shiro.ini中配置自定义密钥: 禁用remember-me功能 7. 靶场清理 8. 总结 该漏洞利用条件简单,危害严重 关键在于Shiro的硬编码加密密钥 对于Shiro-550可利用公开工具快速验证 及时升级是根本解决方案 附录 相关资源 Shiro官方文档 CVE-2016-4437详情 Vulhub项目