前言
摘要:本文记录了一次基于 Shiro 框架的靶场实战过程。通过阅读靶场介绍,了解到攻击者可构造特殊 HTTP 请求绕过 Shiro 认证,实现未授权访问敏感路径;随后启动靶场并利用已知 POC 直接访问目标 URL,最终成功获取管理员目录下的 flag,完成靶场攻克。
Shiro 反序列化漏洞原理
在开始实战之前,先花几分钟把 Shiro 反序列化漏洞的原理讲清楚。这个漏洞的根源,出在 Shiro 的「记住我」(RememberMe)功能上。
1. 漏洞成因:RememberMe 的 AES 密钥泄露
Shiro 在用户勾选「记住我」登录后,会把用户身份信息序列化,再用一个 AES 密钥加密,最后写入浏览器的 Cookie 里。问题在于:很多开发者部署时没有修改 Shiro 默认的 AES 密钥,而是直接使用框架自带的硬编码密钥。一旦攻击者拿到这个公开的默认密钥,就能自己伪造任意 Cookie 内容。
2. 攻击者如何构造恶意序列化数据
攻击者拿到密钥后,会构造一段恶意的 Java 序列化数据(比如包含 Commons-Collections gadget 链的 payload),用同一个 AES 密钥加密后写入 Cookie。当服务器收到这个 Cookie 并尝试解密、反序列化时,恶意代码就会在服务器上执行,从而绕过认证。
3. 未授权访问敏感路径的机制
利用上述反序列化执行链,攻击者可以在服务器上执行任意命令,比如直接读取管理员目录下的文件,或者向目标 URL 发起请求获取 flag。整个过程不需要真实登录,就实现了未授权访问敏感路径。
下面用一张简单的流程图梳理攻击链路:
flowchart TD
A[攻击者获取默认 AES 密钥] --> B[构造恶意序列化 payload]
B --> C[用密钥加密写入 RememberMe Cookie]
C --> D[服务器解密并反序列化 Cookie]
D --> E[恶意代码在服务器执行]
E --> F[绕过认证,未授权访问敏感路径]
简单来说,整个攻击链条就是:密钥泄露 → 伪造 Cookie → 反序列化执行 → 未授权访问。理解了这条链路,再看下面的靶场实战就会清晰很多。
漏洞复现
1.阅读靶场介绍

这里我们可以得到的有用信息是
攻击者构造一个特殊的http请求,可以绕过Shiro的认证,未授权访问敏感路径
2.启动靶场

这里我们可以得到如上的画面
一般我们常说的shiro漏洞就是那种记住我的那种登入方式,就是通过密钥爆破提权的
3.poc
直接访问如下url
https://eci-2zedb6yh3jja05jfdwin.cloudeci1.ichunqiu.com:8080/admin/flag/

到此各位博主又攻克一个靶场了
期待博主攻克任何靶场的欢迎留言
感谢你们宝贵的时间
修复建议
针对 Shiro 反序列化漏洞,可以从升级版本、修改密钥、禁用 RememberMe 以及启用序列化过滤等几个方向进行加固。下面逐一说明每种措施的原理和操作步骤。
1. 升级 Shiro 到最新版本
原理:Shiro 官方在后续版本中修复了多个反序列化相关的安全漏洞,并增强了默认配置的安全性。升级到最新稳定版,可以避免使用存在已知漏洞的旧版本。
操作步骤:在项目的依赖管理文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中,将 Shiro 的版本号更新为最新稳定版,然后重新构建并部署应用。升级前建议先在测试环境验证兼容性。
2. 修改默认 AES 密钥
原理:Shiro 的 RememberMe 功能使用 AES 密钥对序列化数据进行加密。如果使用框架自带的硬编码默认密钥,攻击者可以直接伪造合法的 RememberMe Cookie。更换为自定义的随机密钥后,攻击者无法预知密钥,也就无法构造有效的恶意 Cookie。
操作步骤:在 Shiro 配置中,为 RememberMe 管理器设置一个自定义的 AES 密钥。密钥应使用足够长的随机字符串,并通过安全的方式(如环境变量或配置中心)注入,避免硬编码在代码或配置文件中。
3. 禁用 RememberMe 功能
原理:RememberMe 功能是反序列化漏洞的主要入口。如果业务上不需要「记住我」登录,直接关闭该功能,可以从根源上消除这一攻击面。
操作步骤:在 Shiro 的配置中,将 RememberMe 管理器禁用,或设置 Cookie 的有效期为 0,使 RememberMe 功能不再生效。同时检查前端登录页面,移除「记住我」相关的勾选项。
4. 使用安全的序列化过滤
原理:即使无法完全禁用反序列化,也可以通过白名单或黑名单机制,限制反序列化时允许加载的类,阻止恶意 gadget 链的执行。
操作步骤:在 Shiro 的反序列化入口处,配置安全的 ObjectInputStream 或使用支持类过滤的序列化工具,仅允许反序列化业务所需的合法类,拒绝其他未知类的加载。
综合来看,最稳妥的做法是:升级到最新版本 + 修改默认密钥 + 按需禁用 RememberMe + 启用序列化过滤。多一层防护,就多一分安全。
3105



被折叠的 条评论
为什么被折叠?



