Apache Shiro身份验证绕过漏洞(CVE-2021-41303)分析
字数 1605 2025-08-09 13:33:42
Apache Shiro身份验证绕过漏洞(CVE-2021-41303)分析报告
0x00 漏洞描述
Apache Shiro是Apache基金会开发的一套用于执行认证、授权、加密和会话管理的Java安全框架。该框架存在一个身份验证绕过漏洞(CVE-2021-41303),攻击者可以通过构造特制的HTTP请求绕过身份验证机制,访问受保护的资源。
0x01 影响版本
- Apache Shiro < 1.8.0
0x02 环境搭建
测试环境准备
- 使用基础环境:https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic
- 将项目导入IDEA后,修改Shiro版本为1.7.1(漏洞版本)
- 配置路径拦截器(FilterChain),服务启动时这些配置会被写入filterChains中
重要配置说明:
- 使用LinkedHashMap配置拦截规则(有序)
- 配置顺序会影响拦截逻辑,建议按以下顺序配置:
/admin/*/page = authc /admin/* = authc
- 配置访问路由后,启动服务并访问测试URL:http://localhost:8080/admin/vv/page/
0x03 漏洞分析
漏洞触发流程
-
初始请求处理:
- 请求URL:
/admin/vv/page/(注意末尾斜杠) - 在
PathMatchingFilterChainResolver.getChain()方法中断点分析
- 请求URL:
-
路径处理:
- 通过
getPathWithinApplication和WebUtils.getPathWithinApplication获取requestURL:/admin/vv/page/ removeTrailingSlash方法移除末尾斜杠,得到:/admin/vv/page
- 通过
-
路径匹配过程:
- 首先尝试匹配第一个拦截规则
/admin/*/page - 进入
AntPathMatcher.doMatch()方法:- 使用
StringUtils.tokenizeToStringArray将路径按"/"拆分成数组 - 对数组中的每个字符进行
*和强对比的循环匹配
- 使用
- 由于URI末尾的斜杠导致
requestURI和pathPattern初始匹配失败
- 首先尝试匹配第一个拦截规则
-
关键绕过逻辑:
- 匹配失败后进入
else分支 - 对路径和pattern都移除末尾斜杠后重新匹配
- 此时
pathPattern和requestURINoTrailingSlash成功匹配
- 匹配失败后进入
-
认证绕过:
- 由于匹配成功(matches=true),进入
AdviceFilter.doFilterInternal方法 - 最终输出指定路由的页面信息,绕过认证
- 由于匹配成功(matches=true),进入
核心问题
-
路径匹配逻辑缺陷:
- 初始匹配失败后,移除斜杠重新匹配的机制存在逻辑问题
- 攻击者可以通过添加/移除斜杠来操纵匹配过程
-
拦截器顺序影响:
- 由于使用LinkedHashMap,拦截器顺序会影响匹配结果
- 特定顺序配置下,斜杠处理会导致绕过
调用栈分析
完整漏洞触发时的函数调用栈:
doMatch:139, AntPathMatcher (org.apache.shiro.util)
match:97, AntPathMatcher (org.apache.shiro.util)
matches:93, AntPathMatcher (org.apache.shiro.util)
pathsMatch:159, PathMatchingFilter (org.apache.shiro.web.filter)
pathsMatch:127, PathMatchingFilter (org.apache.shiro.web.filter)
preHandle:195, PathMatchingFilter (org.apache.shiro.web.filter)
doFilterInternal:131, AdviceFilter (org.apache.shiro.web.servlet)
doFilter:125, OncePerRequestFilter (org.apache.shiro.web.servlet)
[...后续调用栈...]
0x04 修复建议
-
官方升级:
- 升级到Apache Shiro 1.8.0或更高版本
- 官方下载地址:https://shiro.apache.org/index.html
-
临时缓解措施:
- 检查所有URL模式配置,确保正确处理斜杠
- 考虑使用严格路径匹配策略
-
代码审查:
- 检查所有使用
PathMatchingFilter的地方 - 特别注意路径匹配逻辑和斜杠处理
- 检查所有使用
-
防御措施:
- 实现额外的权限检查层
- 使用注解式权限控制作为补充
技术总结
该漏洞本质上是由于Shiro在路径匹配时对斜杠处理不当导致的认证绕过。攻击者可以通过精心构造包含/不包含末尾斜杠的URL来绕过权限检查。修复方案应重点关注路径匹配逻辑的严谨性,特别是在处理特殊字符和路径分隔符时的行为。