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

    密钥(避免使用默认密钥),从根本上切断攻击者构造恶意数据的可能性。