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风格的路径表达式:
?:匹配单个字符*:匹配零个或多个字符(不包含路径分隔符)**:匹配零个或多个路径
漏洞根源
漏洞源于两个关键因素:
- Spring框架中,
/resource/menus和/resource/menus/被视为等效 - Shiro的Ant路径匹配中,
*不匹配路径分隔符,导致/hello/*无法匹配/hello/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>
- 配置拦截规则:
@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;
}
- 创建测试接口:
@GetMapping("/hello/{currentPage}")
public String hello(@PathVariable Integer currentPage) {
return "hello";
}
攻击方式
- 正常访问
/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