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),将用户引导至未授权页面
漏洞复现步骤
-
搭建测试环境:
- 使用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_explodedrequestUri返回值为/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
- 然后去除分号
- Spring:
最终修复方案
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规范化处理
- 对所有敏感路由进行双重验证