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 拦截器生效:

访问 /admin/ 被拦截

2. 构造绕过请求

利用路径解析差异,在路径中插入 ..;

/xxx/..;/admin/

将上述路径直接填入浏览器地址栏访问。

3. 绕过成功

服务器返回管理页面内容,认证被成功绕过:

绕过认证,访问到后台

请求处理全流程

步骤处理者处理内容结果
1客户端请求/xxx/..;/admin/发出 HTTP 请求
2Shiro取路径/xxx/.. 匹配拦截器规则无匹配 → 放行
3Tomcat剥离路径参数;/admin//xxx/..路径归一化
4Spring处理归一化后的/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),修复思路始终围绕统一路径解析逻辑展开。
投币支持一下吧
END