Shiro权限绕过漏洞分析(CVE-2020-1957)
字数 1413 2025-08-15 21:30:26

Apache Shiro 权限绕过漏洞(CVE-2020-1957)深度分析与防护指南

漏洞概述

CVE-2020-1957是Apache Shiro框架中的一个权限绕过漏洞,影响Shiro 1.5.2以下版本。该漏洞允许攻击者通过特定的URL构造方式绕过Shiro的权限控制机制,直接访问受保护的资源。

漏洞背景

2020年3月23日,Shiro开发者Brian Demers在用户社区发布安全更新公告,修复了包括CVE-2020-1957在内的三个安全问题。该漏洞源于Shiro与Spring框架在处理URL时的差异,导致权限拦截器可能被绕过。

技术原理

Shiro拦截机制

Shiro通过拦截器实现访问控制,常见的拦截器包括:

  • anon:匿名拦截器,无需登录即可访问
  • authc:登录拦截器,需要认证才能访问

配置示例:

[urls]
/index.html = anon
/user/** = authc

URL路径匹配机制

Shiro使用Ant风格的路径表达式:

  • ?:匹配单个字符
  • *:匹配零个或多个字符(不包含路径分隔符)
  • **:匹配零个或多个路径

漏洞根源

漏洞源于两个关键因素:

  1. Spring框架中,/resource/menus/resource/menus/被视为等效
  2. Shiro的Ant路径匹配中,*不匹配路径分隔符,导致/hello/*无法匹配/hello/1/

漏洞复现

环境搭建

  1. 使用Shiro 1.4.2版本:
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.4.2</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.2</version>
</dependency>
  1. 配置拦截规则:
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean() {
    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
    Map<String, String> map = new LinkedHashMap<>();
    map.put("/*", "authc");
    map.put("/hello/*", "authc");
    bean.setFilterChainDefinitionMap(map);
    return bean;
}
  1. 创建测试接口:
@GetMapping("/hello/{currentPage}")
public String hello(@PathVariable Integer currentPage) {
    return "hello";
}

攻击方式

  1. 正常访问/hello/1:被authc拦截
  2. 绕过访问/hello/1/:成功绕过权限检查

漏洞分析

关键代码路径

漏洞位于PathMatchingFilterChainResolver.getChain()方法,该方法通过pathMatches()函数匹配URL路径。

pathMatches()最终调用AntPathMatcher.doMatch()进行匹配,其中*通配符不支持匹配路径分隔符。

第一次修复(1.5.0版本)

修复方式:在PathMatchingFilter.pathsMatch()中,如果requestURI以/结尾,则去除尾部/后再进行匹配。

绕过方式(≤1.5.1版本)

使用分号构造payload:/fdsf;/../hello/1

原因:WebUtils.getRequestUri()会截取第一个分号前的部分,导致实际匹配的URI变为/fdsf

最终修复(1.5.2版本)

修复方式:改为通过拼接ContextPathServletPathPathInfo来获取requestURI,确保完整路径匹配。

防护措施

  1. 升级方案

    • 立即升级到Shiro 1.5.2或更高版本
  2. 配置建议

    • 避免使用*通配符作为动态路由的拦截规则
    • 对于需要精确控制的路径,使用完整路径或**通配符
  3. 防御性编程

    • 在关键接口中添加额外的权限验证
    • 实现自定义的URL规范化处理

总结

CVE-2020-1957漏洞展示了Web安全中多层防护机制间差异可能带来的安全隐患。安全开发者应当:

  1. 充分理解各安全组件的实现细节
  2. 关注组件间的交互边界
  3. 及时应用安全更新
  4. 采用深度防御策略,不依赖单一防护机制

参考资源

  1. Shiro官方公告
  2. Shiro GitHub仓库相关commit和PR
  3. JIRA issue SHIRO-682
Apache Shiro 权限绕过漏洞(CVE-2020-1957)深度分析与防护指南 漏洞概述 CVE-2020-1957是Apache Shiro框架中的一个权限绕过漏洞,影响Shiro 1.5.2以下版本。该漏洞允许攻击者通过特定的URL构造方式绕过Shiro的权限控制机制,直接访问受保护的资源。 漏洞背景 2020年3月23日,Shiro开发者Brian Demers在用户社区发布安全更新公告,修复了包括CVE-2020-1957在内的三个安全问题。该漏洞源于Shiro与Spring框架在处理URL时的差异,导致权限拦截器可能被绕过。 技术原理 Shiro拦截机制 Shiro通过拦截器实现访问控制,常见的拦截器包括: anon :匿名拦截器,无需登录即可访问 authc :登录拦截器,需要认证才能访问 配置示例: URL路径匹配机制 Shiro使用Ant风格的路径表达式: ? :匹配单个字符 * :匹配零个或多个字符(不包含路径分隔符) ** :匹配零个或多个路径 漏洞根源 漏洞源于两个关键因素: Spring框架中, /resource/menus 和 /resource/menus/ 被视为等效 Shiro的Ant路径匹配中, * 不匹配路径分隔符,导致 /hello/* 无法匹配 /hello/1/ 漏洞复现 环境搭建 使用Shiro 1.4.2版本: 配置拦截规则: 创建测试接口: 攻击方式 正常访问 /hello/1 :被authc拦截 绕过访问 /hello/1/ :成功绕过权限检查 漏洞分析 关键代码路径 漏洞位于 PathMatchingFilterChainResolver.getChain() 方法,该方法通过 pathMatches() 函数匹配URL路径。 pathMatches() 最终调用 AntPathMatcher.doMatch() 进行匹配,其中 * 通配符不支持匹配路径分隔符。 第一次修复(1.5.0版本) 修复方式:在 PathMatchingFilter.pathsMatch() 中,如果requestURI以 / 结尾,则去除尾部 / 后再进行匹配。 绕过方式(≤1.5.1版本) 使用分号构造payload: /fdsf;/../hello/1 原因: WebUtils.getRequestUri() 会截取第一个分号前的部分,导致实际匹配的URI变为 /fdsf 最终修复(1.5.2版本) 修复方式:改为通过拼接 ContextPath 、 ServletPath 和 PathInfo 来获取requestURI,确保完整路径匹配。 防护措施 升级方案 : 立即升级到Shiro 1.5.2或更高版本 配置建议 : 避免使用 * 通配符作为动态路由的拦截规则 对于需要精确控制的路径,使用完整路径或 ** 通配符 防御性编程 : 在关键接口中添加额外的权限验证 实现自定义的URL规范化处理 总结 CVE-2020-1957漏洞展示了Web安全中多层防护机制间差异可能带来的安全隐患。安全开发者应当: 充分理解各安全组件的实现细节 关注组件间的交互边界 及时应用安全更新 采用深度防御策略,不依赖单一防护机制 参考资源 Shiro官方公告 Shiro GitHub仓库相关commit和PR JIRA issue SHIRO-682