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.pswp.cn/web/93860.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发者自学鸿蒙开发3持久化/数据与UI绑定

AppStorage,PersistentStorage与StorageLink AppStorage是应用全局状态管理器,数据存储于内存中,常见的如全局的黑暗模式,StorageLink是用来绑定AppStorage的键到ui上的工具,省去了用户手写代码的无聊过程,PersistentStorage可以绑定AppStorage的键,自动持久化到磁盘,同时支持多…

GitHub宕机生存指南:从应急协作到高可用架构设计

GitHub宕机生存指南&#xff1a;从应急协作到高可用架构设计 摘要&#xff1a; GitHub作为全球开发者的协作中心&#xff0c;其服务稳定性至关重要。然而&#xff0c;任何在线服务都无法保证100%的可用性。本文深入探讨了当GitHub意外宕机时&#xff0c;开发团队应如何应对。我…

机器学习算法篇(十三)------词向量转化的算法思想详解与基于词向量转换的文本数据处理的好评差评分类实战(NPL基础实战)

目录 一、词向量原理介绍 (1). 词向量的核心概念 (2). 传统文本表示的局限性 1. 独热编码&#xff08;One-Hot Encoding&#xff09; 2. 词袋模型&#xff08;Bag of Words&#xff09; 3. TF-IDF (3). 词向量的核心原理 (4). 主流词向量模型 1. Word2Vec&#xff08;20…

JS自定义函数(2)

1. 变量的作用域全局变量定义&#xff1a;在函数外声明的变量作用范围&#xff1a;在整个JS文档中生效生命周期&#xff1a;页面关闭时销毁局部变量定义&#xff1a;在函数内用 var 声明的变量作用范围&#xff1a;只能在函数内部使用生命周期&#xff1a;函数执行完毕时销毁作…

【数据集】Argoverse 数据集:自动驾驶研究的强大基石

Argoverse数据集&#xff1a;自动驾驶研究的强大基石 在自动驾驶技术蓬勃发展的当下&#xff0c;高质量的数据集对于推动相关算法研究和模型训练起着举足轻重的作用。Argoverse 数据集便是其中的佼佼者&#xff0c;它为自动驾驶领域的众多任务提供了丰富且优质的数据资源。 一、…

--- 哈希表和哈希冲突 ---

哈希&#xff08;散列&#xff09;方法是对插入的数据通过哈希函数计算出一个哈希地值&#xff0c;并将这个哈希地址作为储存改数据的地址&#xff0c;这样下次再查找这个数据时&#xff0c;只需要通过哈希函数再获取到该地址然后直接去拿就好这样就做到了不经过任何比较&#…

数学建模-评价类问题-优劣解距离法(TOPSIS)

1-AI带你认识TOPSIS&#x1f4d8; 一、TOPSIS 方法简介1. ​​基本定义&#xff1a;​​​​TOPSIS&#xff08;Technique for Order Preference by Similarity to an Ideal Solution&#xff09;​​&#xff0c;中文通常称为&#xff1a;•​​优劣解距离法​​•​​逼近理想…

Go协程:从汇编视角揭秘实现奥秘

&#x1f680; Go协程&#xff1a;从汇编视角揭秘实现奥秘 #Go语言 #协程原理 #并发编程 #底层实现 引用&#xff1a; 关于 Go 协同程序&#xff08;Coroutines 协程&#xff09;、Go 汇编及一些注意事项。 &#x1f31f; 前言&#xff1a;重新定义并发编程范式 在当今高并发…

MySQL 事务(重点)

MySQL 这个东西注定是可能会被多个用户/客户端来同时访问的&#xff0c;这是肯定的&#xff0c;MySQL 中存放的都是数据&#xff0c;数据可能有一个上层线程在用&#xff0c;也有可能另一个线程也要用...数据是被所有人共享的&#xff0c;所以就注定了 MySQL 这样的服务在一个时…

uniapp:h5链接拉起支付宝支付

场景&#xff1a;APP内点击支付宝支付&#xff0c;后台返回类似链接https://qr.alipay.com/bax***********c3050 通常做法是&#xff0c;使用plus.runtime.openURL(deeplink);先打开浏览器&#xff0c;浏览器会提示打开支付宝&#xff0c;之后是支付流程。现在可以省略跳转h5的…

吴恩达 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是无监督学习中聚类算法的一种&#xff0c;核心在于更新聚类质心&#xff1b;首先将每个点分配给几个聚类质心&#xff0c;取决于那些点离哪个质心更近&#xff1b;然后将几个聚类质心移动到分配给他的所有点的平均值&#xff0c;不…

MyBatis 动态查询语句详解:让 SQL 更灵活可控

MyBatis 动态查询语句详解&#xff1a;让 SQL 更灵活可控 在日常的数据库操作中&#xff0c;我们经常会遇到需要根据不同条件拼接 SQL 语句的场景。比如查询用户时&#xff0c;可能需要根据姓名、年龄、性别等多个条件进行筛选&#xff0c;而这些条件往往是动态变化的 —— 有时…

Java基础语法three

一、一维数组一维数组初始化数据类型[] 数组名new 数据类型[数组长度]//动态初始化数据类型[] 数组名new 数据类型[]{值}//静态初始化数据类型[] 数组名{值}数组长度一旦确定&#xff0c;就不可更改。数组是序排序&#xff1b;数组属于引用数据类型的变量&#xff0c;数组的元素…

【数据结构】排序算法全解析:概念与接口

1.排序的概念及其运用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

在 CentOS 7 上使用 LAMP 架构部署 WordPress

CentOS 7 LAMP 架构部署 WordPress全步骤本文将详细介绍如何在 CentOS 7 系统上通过 LAMP&#xff08;Linux Apache MariaDB PHP&#xff09;架构部署 WordPress 博客平台。 在CentOS 7上基于LAMP架构部署WordPress 一、系统基础配置 1. 修改主机名&#xff08;本机IP&#…

Node.js导入MongoDB具体操作

在Node.js应用程序中&#xff0c;导入MongoDB是一项常见任务。本文将详细介绍如何在Node.js中连接和操作MongoDB数据库&#xff0c;包括安装必要的包、配置连接、执行基本的CRUD操作等步骤。1. 安装必要的包首先&#xff0c;确保你已经安装了Node.js和npm。然后&#xff0c;通过…

HTML--pre标签的作用

原文网址&#xff1a;HTML--pre标签的作用-CSDN博客 简介 本文介绍HTML里pre标签的作用。 <pre> 元素表示预定义格式文本。里边的文本会保留原格式&#xff0c;以等宽字体的形式展现出来&#xff0c;文本中的空白符&#xff08;比如空格和换行符&#xff09;都会显示出…

机器学习--数据预处理

目录 一、数据清洗&#xff1a;让数据纯净如新 1、缺失值处理&#xff1a; 2、异常值处理 3、重复值处理 二、数据变换&#xff1a;重塑数据的 “形状” 1、归一化 2、标准化 三、总结与展望 机器学习小白必看&#xff1a;数据预处理实战笔记 最近投身于机器学习的学习…

Python 数据可视化:Matplotlib 与 Seaborn 实战

Python 数据可视化&#xff1a;Matplotlib 与 Seaborn 实战​​​​在当今数据驱动的时代&#xff0c;数据可视化成为了理解和传达数据信息的关键手段。Python 作为一门强大的编程语言&#xff0c;拥有丰富的数据可视化库&#xff0c;其中 Matplotlib 和 Seaborn 尤为突出。本文…

计算机网络技术学习-day4《路由器配置》

目录 一、路由器基础认知 1. 路由器的核心功能 2. 路由器与交换机的区别 二、路由器配置基础操作 1. CLI&#xff08;命令行界面&#xff09;模式体系 2. 基础配置命令示例 &#xff08;1&#xff09;基础信息配置 &#xff08;2&#xff09;接口IP地址配置&#xff08;…