shiro CVE-2020-11989&CVE-2020-13933复现分析
字数 1954 2025-08-20 18:17:47

Apache Shiro 身份验证绕过漏洞分析 (CVE-2020-11989 & CVE-2020-13933)

漏洞概述

本文详细分析Apache Shiro框架中的两个重要身份验证绕过漏洞:CVE-2020-11989和CVE-2020-13933。这两个漏洞都涉及Shiro和Spring框架在处理URL时的差异,导致身份验证机制被绕过。

CVE-2020-11989 漏洞分析

漏洞原理

漏洞的根本原因在于Shiro和Spring获取URL的方式不同:

  • Shiro获取的URL经过处理后变为/,认为该路径有访问权限
  • Spring获取的URL保持原样(/admin/page),将用户引导至未授权页面

漏洞复现步骤

  1. 搭建测试环境:

    • 使用IDEA配置Tomcat
    • 构建并运行演示项目
    • 发送payload:/;/srpingboot_shiro_war_exploded/admin/page
  2. 关键调试点:

    • org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain设置断点
    • 观察getPathWithinApplication返回值为/

技术细节分析

  1. Shiro URL处理流程

    • getPathWithinApplication返回/
    • contextPath/;/srpingboot_shiro_war_exploded
    • requestUri返回值为/
    • decodeAndCleanUriString方法根据ASCII 59(;)进行截断
  2. Spring URL处理

    • org.springframework.web.util.UrlPathHelper#getServletPath
    • 获取的是未经处理的/admin/page

漏洞修复

Shiro 1.5.3版本进行了修复,修改了org.apache.shiro.web.util.Webutils#getPathWithinApplication方法:

  • 使用getServletPathgetPathInfo获取URL
  • 但修复不完全,导致了CVE-2020-13933

CVE-2020-13933 漏洞分析

漏洞原理

这是CVE-2020-11989的不完全修复导致的绕过漏洞,主要针对非固定地址路由(如/admin/{name})。

漏洞复现步骤

  1. 修改环境:

    • 将pom.xml中的Shiro版本替换为1.5.3
    • 将后台验证路径从/admin/page改为/admin/{name}
    • 重新构建并运行
  2. 关键调试点:

    • org.apache.shiro.web.util.Webutils#getPathWithinApplication设置断点
    • 观察removeSemicolon处理后的URL

技术细节分析

  1. Shiro处理流程

    • 拼合后URL正确
    • removeSemicolon处理后只保留/admin/
    • 如果控制器有/admin/路由,访问不需要权限验证
  2. Spring处理流程

    • 获取到的是/admin/;page
    • ;page作为整体字符串匹配/admin/{name}路由
    • 导致越权访问
  3. URL处理顺序差异

    • Spring
      1. removeSemicolonContent:去除;及以后部分
      2. decodeRequestString:进行urldecode解码
      3. getSanitizedPath:将//替换为/
    • Shiro
      1. 先进行urldecode
      2. 然后去除分号

最终修复方案

Shiro 1.6.0版本:

  • 增加了InvalidRequestFilter
  • 对分号、反斜杠和非ASCII字符进行过滤

漏洞对比总结

特性 CVE-2020-11989 CVE-2020-13933
针对路由类型 固定路由(/admin/page) 非固定路由(/admin/{name})
Shiro获取结果 / /admin/
Spring获取结果 /admin/page /admin/;page
修复版本 1.5.3 1.6.0

防御建议

  1. 升级到Shiro 1.6.0或更高版本
  2. 检查应用程序中是否存在类似的路由处理差异
  3. 实施严格的URL规范化处理
  4. 对所有敏感路由进行双重验证

参考链接

Apache Shiro 身份验证绕过漏洞 (CVE-2020-11989)

Apache Shiro 身份验证绕过漏洞分析 (CVE-2020-11989 & CVE-2020-13933) 漏洞概述 本文详细分析Apache Shiro框架中的两个重要身份验证绕过漏洞:CVE-2020-11989和CVE-2020-13933。这两个漏洞都涉及Shiro和Spring框架在处理URL时的差异,导致身份验证机制被绕过。 CVE-2020-11989 漏洞分析 漏洞原理 漏洞的根本原因在于Shiro和Spring获取URL的方式不同: Shiro获取的URL经过处理后变为 / ,认为该路径有访问权限 Spring获取的URL保持原样( /admin/page ),将用户引导至未授权页面 漏洞复现步骤 搭建测试环境: 使用IDEA配置Tomcat 构建并运行演示项目 发送payload: /;/srpingboot_shiro_war_exploded/admin/page 关键调试点: 在 org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 设置断点 观察 getPathWithinApplication 返回值为 / 技术细节分析 Shiro URL处理流程 : getPathWithinApplication 返回 / contextPath 为 /;/srpingboot_shiro_war_exploded requestUri 返回值为 / decodeAndCleanUriString 方法根据ASCII 59(;)进行截断 Spring URL处理 : org.springframework.web.util.UrlPathHelper#getServletPath 获取的是未经处理的 /admin/page 漏洞修复 Shiro 1.5.3版本进行了修复,修改了 org.apache.shiro.web.util.Webutils#getPathWithinApplication 方法: 使用 getServletPath 和 getPathInfo 获取URL 但修复不完全,导致了CVE-2020-13933 CVE-2020-13933 漏洞分析 漏洞原理 这是CVE-2020-11989的不完全修复导致的绕过漏洞,主要针对非固定地址路由(如 /admin/{name} )。 漏洞复现步骤 修改环境: 将pom.xml中的Shiro版本替换为1.5.3 将后台验证路径从 /admin/page 改为 /admin/{name} 重新构建并运行 关键调试点: 在 org.apache.shiro.web.util.Webutils#getPathWithinApplication 设置断点 观察 removeSemicolon 处理后的URL 技术细节分析 Shiro处理流程 : 拼合后URL正确 removeSemicolon 处理后只保留 /admin/ 如果控制器有 /admin/ 路由,访问不需要权限验证 Spring处理流程 : 获取到的是 /admin/;page 将 ;page 作为整体字符串匹配 /admin/{name} 路由 导致越权访问 URL处理顺序差异 : Spring : removeSemicolonContent :去除;及以后部分 decodeRequestString :进行urldecode解码 getSanitizedPath :将//替换为/ Shiro : 先进行urldecode 然后去除分号 最终修复方案 Shiro 1.6.0版本: 增加了 InvalidRequestFilter 类 对分号、反斜杠和非ASCII字符进行过滤 漏洞对比总结 | 特性 | CVE-2020-11989 | CVE-2020-13933 | |------|---------------|---------------| | 针对路由类型 | 固定路由( /admin/page ) | 非固定路由( /admin/{name} ) | | Shiro获取结果 | / | /admin/ | | Spring获取结果 | /admin/page | /admin/;page | | 修复版本 | 1.5.3 | 1.6.0 | 防御建议 升级到Shiro 1.6.0或更高版本 检查应用程序中是否存在类似的路由处理差异 实施严格的URL规范化处理 对所有敏感路由进行双重验证 参考链接 Apache Shiro 身份验证绕过漏洞 (CVE-2020-11989)