Apache Shiro 认证绕过分析(CVE-2020-17523)
字数 1369 2025-08-10 08:28:35
Apache Shiro 认证绕过漏洞分析(CVE-2020-17523)教学文档
0x01 漏洞描述
Apache Shiro是一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。当Shiro与Spring框架结合使用时,在特定权限匹配规则下,攻击者可通过构造特殊的HTTP请求包完成身份认证绕过。
影响范围:Apache Shiro < 1.7.1
0x02 漏洞环境搭建
- 使用Shiro 1.7.0版本进行复现
- 参考漏洞环境:https://github.com/jweny/shiro-cve-2020-17523
0x03 PoC测试
漏洞利用方式:
- 访问URL:
http://127.0.0.1:8080/admin/%20 - 使用空格等空字符可绕过Shiro身份验证
0x04 漏洞详细分析
漏洞原理
-
权限匹配机制:
/admin/*所匹配的URL都应在Shiro的鉴权范围内- Shiro校验path的函数为
pathMatches() - 当
pathMatches()返回true时,匹配命中的URL才会进入后续的鉴权逻辑
-
关键问题:
- 调用
tokenizeToStringArray方法时,trimTokens参数默认为true - 导致空格等空白字符被删除
- 无法与pattern
*匹配 - 该路径因此无法经过鉴权
- 但Spring接受到的访问路径为
/admin/%20,按正常逻辑返回响应
- 调用
-
调试分析:
pathMatches("/admin/*","/admin/ ")返回falsetokenizeToStringArray返回的pathDirs已经没有空格- 导致
/admin/*和/admin/不匹配 matchStrings()在匹配*时,只要要匹配的字符串不是空,均返回匹配成功
-
根本原因:
tokenizeToStringArray方法在trimTokens参数为true时,会经过trim()处理- 导致空格等空白字符被清除
0x05 官方修复方案
- 修复方法:将
trimTokens设置为false - 修复版本:Apache Shiro 1.7.1及以上
0x06 关于trim的深入分析
trim()会清空字符串前后所有的whitespace- 测试发现:
- 空格(%20)可以成功利用
- 其他whitespace如
%08、%09、%0a等,Spring处理时会返回400错误 - 因此除空格外,尚未发现其他好用的payload
0x07 漏洞利用限制
- 需要特定URL模式配置(使用
*通配符) - 需要Shiro与Spring结合使用
- 实际利用场景相对有限
0x08 防御建议
- 升级到Apache Shiro 1.7.1或更高版本
- 检查URL权限配置,避免过于宽松的通配符使用
- 实施多层防御机制,不单纯依赖Shiro的URL过滤
0x09 参考链接
- 原文链接:https://www.anquanke.com/post/id/230935
- 漏洞环境:https://github.com/jweny/shiro-cve-2020-17523
- Apache Shiro官网:https://shiro.apache.org/