【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。
在vulhub打开环境


ip:port打开web服务界面
抓包,出现rememberMe=deleteMe字段猜测是Shiro漏洞特征

用ShiroExploit.V2.51工具填进URL来扫出正确的Shiro key,key:
kPH+bIxk5D2deZiIxcaaaA==



使用shiro_attack-5.0.0-zulu-8-jfx工具爆破出CommonsCollectionsK1构造链
[++] 发现构造链:CommonsCollectionsK1 回显方式: AllEcho
拿到webshell,命令执行成功



使用中国蚁剑连接成功
下面是shiro CVE-2016-4437漏洞详细分析解释:
一、漏洞背景
- 漏洞编号:CVE-2016-4437
- 漏洞类型:Java 反序列化漏洞
- 危害等级:高危(CVSS 评分 9.8)
- 影响范围:Apache Shiro 1.2.4 及以下版本
- 核心成因 :Shiro 框架在 1.2.4 及以下版本中硬编码了默认 AES 加密密钥 ,攻击者可利用该密钥加密恶意反序列化数据,通过
rememberMeCookie 传递给服务端,触发反序列化执行任意恶意代码。
二、环境搭建
本文使用 Vulhub 一键化漏洞测试环境,确保复现过程稳定可复现。
2.1 环境前提
- 已安装 Docker 和 Docker-Compose(Kali Linux 默认已预装)
- 攻击机与靶机在同一局域网内,网络互通
2.2 启动漏洞环境
-
进入 Vulhub 对应漏洞目录:
bashcd vulhub/shiro/CVE-2016-4437 -
启动 Docker 容器:
bashdocker-compose up -d -
验证环境启动:浏览器访问
http://靶机IP:8080,出现 Shiro 默认登录页面即环境搭建成功。
三、漏洞复现全流程
3.1 步骤 1:漏洞特征识别
Shiro 框架最典型的特征是rememberMe Cookie,这是漏洞利用的入口。
-
打开 Burp Suite,配置浏览器代理,拦截访问
http://靶机IP:8080的请求; -
发送任意请求,观察响应头中的
Set-Cookie字段; -
若出现
rememberMe=deleteMe,即可判定目标使用了 Shiro 框架。
术语解释 :rememberMe是 Shiro 的 "记住我" 功能,用户登录时勾选该选项后,Shiro 会将用户信息加密存储在 Cookie 中,下次访问时无需重新登录。
3.2 步骤 2:获取 Shiro 默认密钥
漏洞利用的核心前提是获取 AES 加密密钥,Shiro 1.2.4 及以下版本的默认密钥是硬编码在源码中的。
-
下载并打开 Shiro 漏洞利用工具
ShiroExploit.V2.51; -
在 "目标地址" 栏输入
http://靶机IP:8080; -
点击 "开始扫描",工具会自动枚举 Shiro 的默认密钥;
-
扫描结果显示目标使用的密钥为:
kPH+bIxk5D2deZiIxcaaaA==
关键说明:这个密钥是 Shiro 官方在源码中写死的,未修改默认配置的 Shiro 应用都会使用该密钥,这也是该漏洞被称为 "永恒之钥" 的原因。
3.3 步骤 3:爆破可用反序列化构造链
Java 反序列化漏洞无法直接执行代码,需要借助第三方库中的 "构造链" 来触发命令执行。
-
打开
shiro_attack-5.0.0-zulu-8-jfx工具; -
输入目标地址
http://靶机IP:8080和已获取的密钥kPH+bIxk5D2deZiIxcaaaA==; -
选择 "构造链扫描",点击 "开始";
-
扫描结果显示可用构造链为
CommonsCollectionsK1,回显方式为AllEcho。
术语解释 :构造链是第三方库中一系列方法的调用链,攻击者可以构造恶意对象,让反序列化过程自动执行这个调用链,最终触发系统命令执行。CommonsCollections是 Java 生态中最常用的工具库,也是反序列化构造链最多的库之一。
3.4 步骤 4:漏洞利用与验证
3.4.1 执行系统命令
-
在 shiro_attack 工具中,选择已爆破出的
CommonsCollectionsK1构造链; -
在 "命令执行" 栏输入
whoami,点击 "执行"; -
工具返回命令执行结果
root,证明命令执行成功。
3.4.2 写入 WebShell
-
在命令执行栏输入写入 WebShell 的命令:
bashecho '<?php eval($_POST["123"]); ?>' > /var/www/html/123.php -
点击 "执行",无报错即写入成功。
3.4.3 蚁剑连接 WebShell
-
打开中国蚁剑,右键点击 "添加数据";
-
配置连接信息:
- URL 地址:
http://靶机IP:8080/123.php - 连接密码:
123 - 脚本类型:PHP
- URL 地址:
-
点击 "测试连接",显示 "连接成功" 后点击 "添加";
-
双击连接,即可获得目标服务器的文件管理和虚拟终端权限。
四、漏洞原理深度分析
4.1 核心逻辑拆解
Shiro CVE-2016-4437 的本质是硬编码密钥 + 不安全反序列化的组合漏洞,完整的攻击流程如下:
-
正常 rememberMe 流程:
- 用户登录时勾选 "记住我";
- Shiro 将用户信息序列化为字节流;
- 使用硬编码的 AES 密钥加密字节流;
- 将加密后的数据存入
rememberMeCookie 返回给浏览器。
-
恶意攻击流程:
- 攻击者构造包含恶意代码的序列化对象;
- 使用 Shiro 默认密钥加密该对象;
- 将加密后的数据放入
rememberMeCookie,发送给服务端; - 服务端接收 Cookie 后,使用默认密钥解密;
- 对解密后的字节流进行反序列化,执行恶意代码。
4.2 关键漏洞节点
4.2.1 硬编码密钥
Shiro 1.2.4 及以下版本的AbstractRememberMeManager类中,硬编码了默认的 AES 密钥:
java
private byte[] cipherKey = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");
未手动修改该配置的应用,都会使用这个公开的密钥,攻击者可以轻松加密任意恶意数据。
4.2.2 不安全的反序列化
Shiro 在反序列化rememberMe Cookie 中的数据时,未对反序列化的类做任何白名单校验,只要是 Java 中存在的类都可以被反序列化。这就给了攻击者可乘之机,他们可以利用第三方库中的构造链,让反序列化过程执行任意系统命令。
通俗解释:反序列化可以理解为 "将字节流恢复成可执行的 Java 对象"。正常情况下,服务端只会反序列化自己生成的合法对象,但 Shiro 没有校验对象的来源和合法性,导致攻击者构造的恶意对象也能被恢复并执行。
五、防御方案
5.1 短期紧急修复
立即升级 Apache Shiro 至 1.2.5 及以上版本。官方在 1.2.5 版本中修复了硬编码密钥问题,改为每次启动时自动生成随机密钥,从根本上解决了密钥泄露的问题。
5.2 中期安全加固
-
自定义高强度随机密钥:即使升级了版本,也建议手动配置随机 AES 密钥,避免因其他漏洞导致密钥泄露:
javacookieRememberMeManager.setCipherKey(Base64.decode("自定义的16位随机Base64字符串")); -
增加 Cookie 签名校验:对
rememberMeCookie 增加数字签名,防止数据被篡改。 -
限制反序列化类范围:配置 Shiro 的反序列化白名单,只允许反序列化业务必需的类,禁用
CommonsCollections等危险库的反序列化。
5.3 长期防护体系
- 定期漏洞扫描:使用 Nessus、AWVS 等工具定期扫描系统,及时发现并修复老旧框架漏洞。
- 部署 WAF 防护 :在 Web 应用前部署 Web 应用防火墙,拦截包含恶意
rememberMeCookie 的请求。 - 加强代码审计:在开发阶段对反序列化相关代码进行严格审计,避免引入新的反序列化漏洞。
- 最小权限运行:Web 服务以普通用户权限运行,即使漏洞被利用,也能降低攻击者的危害范围。
六、总结
本文完整复现了 Apache Shiro CVE-2016-4437 反序列化漏洞,核心步骤可总结为:特征识别→密钥获取→构造链爆破→命令执行→WebShell 连接。
该漏洞是 Java 反序列化漏洞的经典案例,其核心危害源于两个低级错误:硬编码敏感密钥 和未校验反序列化数据。这也反映出 Java 生态中反序列化漏洞的共性风险 ------ 只要存在未校验的反序列化入口,且目标服务器存在可利用的构造链,就可能被攻击者远程控制。
对于安全从业者而言,掌握反序列化漏洞的原理和利用方法是必备技能;对于企业而言,及时升级框架版本、加强密钥管理和输入校验,是防御反序列化漏洞的核心手段。只有从开发、运维、防护多个层面构建完整的安全体系,才能有效抵御此类高危漏洞的攻击。
本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。