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 环境搭建

测试环境准备

  1. 使用基础环境:https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic
  2. 将项目导入IDEA后,修改Shiro版本为1.7.1(漏洞版本)
  3. 配置路径拦截器(FilterChain),服务启动时这些配置会被写入filterChains中

重要配置说明

  • 使用LinkedHashMap配置拦截规则(有序)
  • 配置顺序会影响拦截逻辑,建议按以下顺序配置:
    /admin/*/page = authc
    /admin/* = authc
    
  1. 配置访问路由后,启动服务并访问测试URL:http://localhost:8080/admin/vv/page/

0x03 漏洞分析

漏洞触发流程

  1. 初始请求处理

    • 请求URL:/admin/vv/page/(注意末尾斜杠)
    • PathMatchingFilterChainResolver.getChain()方法中断点分析
  2. 路径处理

    • 通过getPathWithinApplicationWebUtils.getPathWithinApplication获取requestURL:/admin/vv/page/
    • removeTrailingSlash方法移除末尾斜杠,得到:/admin/vv/page
  3. 路径匹配过程

    • 首先尝试匹配第一个拦截规则/admin/*/page
    • 进入AntPathMatcher.doMatch()方法:
      • 使用StringUtils.tokenizeToStringArray将路径按"/"拆分成数组
      • 对数组中的每个字符进行*和强对比的循环匹配
    • 由于URI末尾的斜杠导致requestURIpathPattern初始匹配失败
  4. 关键绕过逻辑

    • 匹配失败后进入else分支
    • 对路径和pattern都移除末尾斜杠后重新匹配
    • 此时pathPatternrequestURINoTrailingSlash成功匹配
  5. 认证绕过

    • 由于匹配成功(matches=true),进入AdviceFilter.doFilterInternal方法
    • 最终输出指定路由的页面信息,绕过认证

核心问题

  • 路径匹配逻辑缺陷

    • 初始匹配失败后,移除斜杠重新匹配的机制存在逻辑问题
    • 攻击者可以通过添加/移除斜杠来操纵匹配过程
  • 拦截器顺序影响

    • 由于使用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 修复建议

  1. 官方升级

    • 升级到Apache Shiro 1.8.0或更高版本
    • 官方下载地址:https://shiro.apache.org/index.html
  2. 临时缓解措施

    • 检查所有URL模式配置,确保正确处理斜杠
    • 考虑使用严格路径匹配策略
  3. 代码审查

    • 检查所有使用PathMatchingFilter的地方
    • 特别注意路径匹配逻辑和斜杠处理
  4. 防御措施

    • 实现额外的权限检查层
    • 使用注解式权限控制作为补充

技术总结

该漏洞本质上是由于Shiro在路径匹配时对斜杠处理不当导致的认证绕过。攻击者可以通过精心构造包含/不包含末尾斜杠的URL来绕过权限检查。修复方案应重点关注路径匹配逻辑的严谨性,特别是在处理特殊字符和路径分隔符时的行为。

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配置拦截规则(有序) 配置顺序会影响拦截逻辑,建议按以下顺序配置: 配置访问路由后,启动服务并访问测试URL:http://localhost:8080/admin/vv/page/ 0x03 漏洞分析 漏洞触发流程 初始请求处理 : 请求URL: /admin/vv/page/ (注意末尾斜杠) 在 PathMatchingFilterChainResolver.getChain() 方法中断点分析 路径处理 : 通过 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 方法 最终输出指定路由的页面信息,绕过认证 核心问题 路径匹配逻辑缺陷 : 初始匹配失败后,移除斜杠重新匹配的机制存在逻辑问题 攻击者可以通过添加/移除斜杠来操纵匹配过程 拦截器顺序影响 : 由于使用LinkedHashMap,拦截器顺序会影响匹配结果 特定顺序配置下,斜杠处理会导致绕过 调用栈分析 完整漏洞触发时的函数调用栈: 0x04 修复建议 官方升级 : 升级到Apache Shiro 1.8.0或更高版本 官方下载地址:https://shiro.apache.org/index.html 临时缓解措施 : 检查所有URL模式配置,确保正确处理斜杠 考虑使用严格路径匹配策略 代码审查 : 检查所有使用 PathMatchingFilter 的地方 特别注意路径匹配逻辑和斜杠处理 防御措施 : 实现额外的权限检查层 使用注解式权限控制作为补充 技术总结 该漏洞本质上是由于Shiro在路径匹配时对斜杠处理不当导致的认证绕过。攻击者可以通过精心构造包含/不包含末尾斜杠的URL来绕过权限检查。修复方案应重点关注路径匹配逻辑的严谨性,特别是在处理特殊字符和路径分隔符时的行为。