当前位置: 首页 > news >正文

Apache Shiro550 漏洞(CVE-2016-4437):原理剖析与实战 SOP

在 Web 安全领域,反序列化漏洞一直是威胁等级极高的存在,而 Apache Shiro 框架中的 Shiro550 漏洞(CVE-2016-4437),更是因利用门槛低、影响范围广,成为渗透测试中频繁遇到的经典漏洞。本文将从 “原理拆解” 和 “实战 SOP” 两个维度,带你彻底搞懂 Shiro550 漏洞,同时提供可直接落地的标准化操作流程。​

一、基本信息与原理​

Shiro550 漏洞,它并非框架功能的缺陷,而是“加密逻辑”与“反序列化”机制结合产生漏洞。​

1. 漏洞基本信息​

CVE 编号:CVE-2016-4437​影响范围:Apache Shiro 1.2.4 及以下版本​漏洞类型:反序列化远程代码执行(RCE)​核心触发点:Shiro 框架的 “RememberMe”(记住我)功能​

2. 漏洞原理: “记住我” 功能的加密解密逻辑​

Shiro 的 “RememberMe” 功能本是为了提升用户体验 —— 用户登录时勾选 “记住我”,下次访问系统无需重新输入账号密码,直接通过 Cookie 中的身份信息完成验证。但正是这个功能的加密解密流程,埋下了漏洞的隐患。​
(1)正常流程:用户身份信息的 “加密存储”​
当用户勾选 “RememberMe” 登录时,Shiro 会按以下步骤处理用户身份信息,最终生成 Cookie:​
用户身份信息(如用户名、权限)→ 序列化(将Java对象转为字节流)→ AES加密(需使用框架内置的固定密钥Key)→ Base64编码(转为可读字符串)→ 写入RememberMe Cookie​
(2)危险流程:服务端的 “解密反序列化”​
下次用户访问时,服务端会按 “反向流程” 验证 RememberMe Cookie,而漏洞就出在这一步:​

  • 读取请求中RememberMe Cookie的值 → Base64解码(还原为AES加密后的字节流)→
    AES解密(用相同的固定Key,还原为序列化后的字节流)→ 反序列化(将字节流还原为Java对象)​
  • 这里的关键问题的是:Shiro 框架在 1.2.4 及以下版本中,使用了 “硬编码的固定 AES
    密钥”!开发者如果没有手动修改默认密钥,攻击者就能利用这个已知的 Key,构造恶意的序列化数据 —— 先将 “恶意代码(如执行命令)”
    封装成 Java 对象,按正常流程进行序列化、AES 加密(用默认 Key)、Base64 编码,然后将构造好的字符串放入RememberMe Cookie 中发送给服务端。​
  • 服务端接收到 Cookie 后,会毫无防备地执行 “解密→反序列化” 操作,此时恶意 Java 对象被还原,其中的恶意代码也就被执行了
    —— 这就是 Shiro550 漏洞的核心原理:利用已知的固定密钥,构造恶意序列化数据,触发服务端反序列化 RCE。​

(3)抓包验证:从数据包看 “RememberMe” 的痕迹​
理解原理后,我们可以通过抓包直观看到 “RememberMe” 的交互过程:​

请求包:用户勾选 “RememberMe” 登录时,POST 请求的 Cookie 字段会新增rememberMe=on(此时还未生成加密后的身份信息);​响应包:服务端验证通过后,会在 Set-Cookie 中先返回rememberMe=deleteMe(这是 Shiro 的常规清理操作),随后生成真正的加密身份信息,返回rememberMe=xxxxx(长串密文)—— 这串密文就是经过 “序列化→AES 加密→Base64 编码” 后的结果。​

如果看到这样的 Cookie 交互,就可以初步判断目标系统可能使用了 Shiro 框架,为后续漏洞验证提供了线索。​

二、Shiro550 漏洞实战 SOP:4 步搞定漏洞验证与利用​

在实际生产或渗透测试中,我们需要一套标准化的操作流程(SOP),既能高效验证漏洞,又能避免遗漏关键步骤。以下流程可直接复制粘贴到工作文档中,按步骤执行即可。​

第一步:识别 “RememberMe” 功能是否存在​

漏洞的前提是目标系统启用了 “RememberMe” 功能,因此第一步要确认该功能是否存在:​

访问目标系统的登录页面(如http://xxx.com/login);​观察登录表单中是否有 “记住我”“自动登录” 等选项(文字可能不同,但核心是 “记住登录状态” 的功能);​若有该选项,直接勾选并尝试登录(无需知道正确账号密码,后续验证不依赖登录成功);​用 Burp Suite 等工具抓包,查看请求包的 Cookie 字段中是否有rememberMe=on(登录请求),或响应包的 Set-Cookie 中是否有rememberMe=deleteMe/ 长串密文 —— 存在则说明 “RememberMe” 功能已启用。​

第二步:验证目标是否使用 Apache Shiro 框架​

“RememberMe” 功能并非 Shiro 独有,因此需要进一步确认框架是否为 Shiro:​
方法 1:从响应头识别(最直接)​
查看登录请求的响应头(Response Headers),若存在以下字段,则大概率是 Shiro:​

Set-Cookie: JSESSIONID=xxxx; Path=/; HttpOnly(常规 Session,但需结合其他特征);​部分版本会在响应头中直接暴露 Shiro 相关标识(如X-Shiro-Version,但并非所有版本都有)。​

方法 2:从 Cookie 特征识别​
若响应包中出现rememberMe=deleteMe,这是 Shiro 框架的 “标志性特征”—— 其他框架几乎不会用 “deleteMe” 作为 RememberMe Cookie 的临时值,因此看到该字段,可 90% 确定是 Shiro。​
方法 3:主动探测(辅助验证)​
若上述方法无法确认,可构造一个无效的 RememberMe Cookie(如rememberMe=test)发送给服务端:​

若响应包中返回rememberMe=deleteMe,则说明服务端在处理 Shiro 的 RememberMe Cookie,进一步确认是 Shiro 框架;​若无任何响应,则可能不是 Shiro,或 “RememberMe” 功能未正常启用。​

第三步:验证 Shiro 版本是否 <=1.2.4​

Shiro550 漏洞仅影响 1.2.4 及以下版本,因此版本验证是关键(若版本高于 1.2.4,直接排除该漏洞):​
方法 1:从框架文件暴露识别​
访问目标系统可能存在的 Shiro 相关静态文件,如:​

http://xxx.com/shiro.css(部分系统会暴露框架默认样式文件);​http://xxx.com/WEB-INF/lib/shiro-core-1.2.4.jar(若存在文件泄露,可直接看到版本号);​

若文件中包含1.2.x(x<=4),则确定版本符合漏洞条件。​
方法 2:从漏洞响应特征识别(无版本泄露时用)​
由于 Shiro 1.2.4 及以下版本使用固定 AES 密钥,而 1.2.5 及以上版本修复了该问题(允许自定义密钥,但默认仍有风险,不过 550 漏洞特指 1.2.4 及以下),因此可通过 “密钥验证” 间接判断版本:​

使用 Shiro 漏洞验证工具(如 ShiroExploit),尝试用默认密钥(Shiro 1.2.4 及以下的固定密钥)发送测试请求;​若工具返回 “密钥匹配” 或 “可能存在漏洞”,则说明版本 <=1.2.4;若返回 “密钥不匹配”,则版本可能高于 1.2.4,或开发者修改了默认密钥。​

方法 3:从官方更新日志反推(辅助)​

  • 若目标系统是公开项目,可查询其使用的 Shiro 版本(如 GitHub 仓库的 pom.xml、package.json),对照
    Shiro 官方更新日志:Shiro 1.2.5 版本于 2016 年 5 月发布,明确修复了 “RememberMe”
    功能的反序列化漏洞,因此版本在 1.2.5 之前的均存在风险。​

第四步:使用自动化工具获取 Key 并执行攻击​

当确认 “存在 RememberMe 功能 + 是 Shiro 框架 + 版本 <=1.2.4” 后,即可通过工具自动化获取密钥并执行攻击(手动构造数据效率低,工具可大幅提升成功率)。​
常用工具:ShiroExploit、ysoserial(需配合使用)​
操作步骤:​

准备工具:下载 ShiroExploit(如 v2.5 版本,支持自动爆破密钥和执行命令),确保本地 Java 环境正常(工具依赖 Java 运行);​配置目标信息:打开工具,输入目标 URL(如http://xxx.com/login),选择 “RememberMe” Cookie 的位置(工具会自动识别,无需手动填写);​爆破密钥:工具内置 Shiro 1.2.4 及以下版本的默认密钥列表,点击 “爆破密钥”—— 若成功匹配到密钥(如kPH+bIxk5D2deZiIxcaaaA==),则说明漏洞可利用;​执行命令:选择 “命令执行” 模块,输入要执行的命令(如whoami、ping xxx.xxx.xxx.xxx,建议先执行 ping 测试连通性),点击 “执行”;​验证结果:若命令执行成功(如 ping 测试在本地 Wireshark 中捕获到数据包,或whoami返回服务器用户名),则漏洞验证完成;若执行失败,可尝试更换密钥或检查目标是否有防火墙拦截。​

注意事项:​

若目标系统修改了 Shiro 默认密钥,工具爆破失败,则无法利用 Shiro550 漏洞,需考虑其他漏洞;​生产环境中测试需获得授权,禁止未授权渗透测试,避免触犯法律。​

实战平台:

1.vulhub靶场:需要配置,具体请参考其他文章
2.vulfocus在线靶场:https://vulfocus.cn(在线靶场,注册账号可直接开启环境)

工具推荐:

1.ShiroExploit
2.shiro_attack-4.7.0-SNAPSHOT-all (一体化工具,非常好用)(GitHub上有很多,我整理了一个版本比较新,并且可正常运行的放在“资源”里面,需要自取~)

三、总结:从原理到实战的核心逻辑​

  • Shiro550 漏洞的本质,是 “固定密钥 + 反序列化” 的双重风险 —— 框架硬编码的 AES
    密钥让攻击者可构造恶意数据,而服务端未对反序列化数据进行校验,直接执行还原操作,最终导致 RCE。​

  • 而实战 SOP 的核心逻辑,是 “层层筛选”:先确认功能存在,再验证框架类型,接着锁定版本范围,最后通过工具高效利用。这套流程不仅适用于

  • Shiro550 漏洞,也可迁移到其他 Web 漏洞的验证中 —— 先明确漏洞触发条件,再逐步排除非目标,最终精准定位可利用漏洞。​

  • 对于开发者而言,防范 Shiro550 漏洞的方法也很明确:升级 Shiro 到 1.2.5 及以上版本,同时手动修改 AES
    密钥(避免使用默认密钥),从根本上切断攻击者构造恶意数据的可能性。

http://www.dtcms.com/a/337381.html

相关文章:

  • 【Linux开发】错误更改bash.sh导致PATH环境变量被破坏所有命令不可用的解决方法
  • 【Axure高保真原型】时间轴缩放面积图
  • CMIP6 气候模式核心特性解析
  • 学习游戏制作记录(各种独特物品效果)8.18
  • 代码随想录-数组练习
  • 矿物识别案例(数据处理:六种填充方法)
  • 深度剖析PyTorch分布式训练:从原理到工程实践
  • Centos7使用lamp架构部署wordpress
  • 安全基础DAY6-服务器安全检测和防御技术
  • 网站服务器使用免费SSL证书安全吗?
  • 计算机网络技术学习-day3《交换机配置》
  • ⭐CVPR2025 RigGS:从 2D 视频到可编辑 3D 关节物体的建模新范式
  • 一个基于前端开发的经典飞机大战游戏,具有现代化的UI设计和流畅的游戏体验。
  • OpenAL技术详解:跨平台3D音频API的设计与实践
  • 飞机起落架轮轴深孔中间段电解扩孔内轮廓检测 - 激光频率梳 3D 轮廓检测
  • 【verge3d】如何在项目里调用接口
  • Gateway中Forward配置+源码观赏
  • Pandas 核心数据结构详解(精简版)
  • Drawnix:一款免费开源的白板工具,支持思维导图、流程图、类图和手绘图
  • mybatisplus oracle 数据库OracleKeyGenerator使用序列生成主键原理
  • Redis-缓存-穿透-布隆过滤器
  • Linux 系统(如 Ubuntu / CentOS)阿里云虚拟机(ECS)上部署 Bitnami LAMP
  • 用随机森林填补缺失值:原理、实现与实战
  • 大型语言模型(LLM)存在演示位置偏差:相同示例在提示中位置不同会导致模型预测结果和准确率显著变化
  • 基于NLP的文本生成系统设计与实现(LW+源码+讲解+部署)
  • 牛津大学xDeepMind 自然语言处理(1)
  • 【论文阅读69】-DeepHGNN复杂分层结构下的预测
  • 力扣 hot100 Day77
  • 深入浅出讲透IPD:三层逻辑实例详解 —— 卫朋
  • Mysql实战案例 | 利用Mycat实现MYSQL的读写分离