AI摘要
本文复现CVE-2020-1957 Apache Shiro认证绕过漏洞。利用Shiro与Tomcat对URI解析差异,构造畸形路径绕过权限校验访问后台。文章详细阐述了漏洞原理、环境搭建及复现过程,并提供了升级至1.5.1的修复建议。
使用 vulhub 搭建靶机环境,完整复现 CVE-2020-1957 Apache Shiro 认证绕过漏洞,利用 Shiro 与 Spring 对 URL 路径解析差异,绕过权限校验访问受保护的后台资源。
漏洞原理
根因:URI 解析差异
Apache Shiro 通过拦截器链对 URL 进行访问控制,常见拦截器有:
- anon — 匿名拦截器,无需登录即可访问,通常用于静态资源
- authc — 认证拦截器,需要登录才能访问
用户在 shiro.ini 中配置 URL 匹配规则,Shiro 使用 AntPathMatcher 对请求路径进行模式匹配,以决定应用哪个拦截器。
漏洞的核心在于 Shiro 与底层 Servlet 容器(如 Tomcat / Spring Boot 内嵌 Tomcat)对 URI 的解析方式不一致:
| 组件 | 对; 的处理 |
|---|---|
| Shiro | 将; 及其后续内容视为路径普通字符 |
| Tomcat | 将; 视为路径参数分隔符(Path Parameter),;admin/ 被剥离 |
这一差异导致攻击者可以构造一个 Shiro 认为"安全"而 Spring/Tomcat 认为"需要放行到目标路径"的畸形 URL。
攻击链路
客户端请求: /xxx/..;/admin/
↓
Shiro 校验路径: /xxx/.. ← AntPathMatcher 保留 ".." 未归一化
↓
Shiro 匹配规则: 无匹配拦截器 → 放行(anon 等效)
↓
Spring/Tomcat 处理: /xxx/..;/admin/
↓
Tomcat 剥离路径参数: /xxx/../admin/
↓
路径归一化: /admin/ ← ".." 回退一级
↓
成功访问受保护的后台技术细节
..— 路径遍历符号,在 URL 归一化时回退上一级;— Tomcat 的CoyoteAdapter在处理请求时会将分号后的内容识别为path parameters并剥离,但 Shiro 的AntPathMatcher将其视为路径的普通字符- 最终 Shiro 认为请求的是
/xxx/..(不匹配任何安全规则),而 Spring 实际处理的是/admin/
漏洞信息
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2020-1957 |
| 漏洞类型 | Authentication Bypass(认证绕过) |
| 组件名称 | Apache Shiro |
| 影响范围 | Apache Shiro < 1.5.1 |
| 利用难度 | 容易 — 无需认证,构造特制 URL 即可 |
| 威胁等级 | 高危 |
| 修复版本 | Apache Shiro 1.5.1 |
漏洞环境搭建
使用 vulhub 的预配置 Docker 环境:
cd vulhub/shiro/CVE-2020-1957
docker-compose up -d本例靶机 IP 为 192.168.50.134。环境包含一个配置了 Shiro 权限控制的 Web 应用,/admin/ 路径受 authc 拦截器保护。
漏洞复现
1. 确认权限拦截
直接访问受保护的 /admin/ 目录,返回 302 跳转至登录页面,说明 authc 拦截器生效:
2. 构造绕过请求
利用路径解析差异,在路径中插入 .. 与 ;:
/xxx/..;/admin/将上述路径直接填入浏览器地址栏访问。
3. 绕过成功
服务器返回管理页面内容,认证被成功绕过:
请求处理全流程
| 步骤 | 处理者 | 处理内容 | 结果 |
|---|---|---|---|
| 1 | 客户端 | 请求/xxx/..;/admin/ | 发出 HTTP 请求 |
| 2 | Shiro | 取路径/xxx/.. 匹配拦截器规则 | 无匹配 → 放行 |
| 3 | Tomcat | 剥离路径参数;/admin/ → /xxx/.. | 路径归一化 |
| 4 | Spring | 处理归一化后的/admin/ | 返回后台页面 |
漏洞影响与利用场景
成功绕过认证后,攻击者可以:
- 访问管理后台及敏感功能(如用户管理、配置修改)
- 结合其他漏洞(如 Shiro 反序列化)进一步提升权限
- 在一些场景下,配合
rememberMe功能可进一步利用
修复措施
Apache Shiro 1.5.1 版本通过以下方式修复:
- 在
AntPathMatcher中增加了对 URI 中;的处理逻辑 - 在路径匹配前对
;及后续内容进行剥离(与 Servlet 容器行为对齐) - 增加了对
..路径遍历的规范化校验
升级建议:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.1</version>
</dependency>此漏洞的根本原因在于框架与容器对 URI 规范的理解不一致。类似的绕过漏洞在 Shiro 后续版本中仍偶有出现(如 CVE-2020-11989、CVE-2020-13933),修复思路始终围绕统一路径解析逻辑展开。



