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"功能,该功能将用户信息序列化后:
- 使用AES加密
- 进行Base64编码
- 存储在名为
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 特征识别
-
使用错误凭证登录并抓包
- 请求中观察是否存在
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中配置自定义密钥:
securityManager.rememberMeManager.cipherKey = your_random_base64_encoded_key - 禁用remember-me功能
7. 靶场清理
# 在vulhub/shiro/CVE-2016-4437目录下执行
docker-compose down
8. 总结
- 该漏洞利用条件简单,危害严重
- 关键在于Shiro的硬编码加密密钥
- 对于Shiro-550可利用公开工具快速验证
- 及时升级是根本解决方案