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

  1. 使用Shiro 1.7.0版本进行复现
  2. 参考漏洞环境:https://github.com/jweny/shiro-cve-2020-17523

0x03 PoC测试

漏洞利用方式

  • 访问URL:http://127.0.0.1:8080/admin/%20
  • 使用空格等空字符可绕过Shiro身份验证

0x04 漏洞详细分析

漏洞原理

  1. 权限匹配机制

    • /admin/*所匹配的URL都应在Shiro的鉴权范围内
    • Shiro校验path的函数为pathMatches()
    • pathMatches()返回true时,匹配命中的URL才会进入后续的鉴权逻辑
  2. 关键问题

    • 调用tokenizeToStringArray方法时,trimTokens参数默认为true
    • 导致空格等空白字符被删除
    • 无法与pattern*匹配
    • 该路径因此无法经过鉴权
    • 但Spring接受到的访问路径为/admin/%20,按正常逻辑返回响应
  3. 调试分析

    • pathMatches("/admin/*","/admin/ ")返回false
    • tokenizeToStringArray返回的pathDirs已经没有空格
    • 导致/admin/*/admin/不匹配
    • matchStrings()在匹配*时,只要要匹配的字符串不是空,均返回匹配成功
  4. 根本原因

    • tokenizeToStringArray方法在trimTokens参数为true时,会经过trim()处理
    • 导致空格等空白字符被清除

0x05 官方修复方案

  1. 修复方法:将trimTokens设置为false
  2. 修复版本:Apache Shiro 1.7.1及以上

0x06 关于trim的深入分析

  1. trim()会清空字符串前后所有的whitespace
  2. 测试发现:
    • 空格(%20)可以成功利用
    • 其他whitespace如%08%09%0a等,Spring处理时会返回400错误
    • 因此除空格外,尚未发现其他好用的payload

0x07 漏洞利用限制

  1. 需要特定URL模式配置(使用*通配符)
  2. 需要Shiro与Spring结合使用
  3. 实际利用场景相对有限

0x08 防御建议

  1. 升级到Apache Shiro 1.7.1或更高版本
  2. 检查URL权限配置,避免过于宽松的通配符使用
  3. 实施多层防御机制,不单纯依赖Shiro的URL过滤

0x09 参考链接

  1. 原文链接:https://www.anquanke.com/post/id/230935
  2. 漏洞环境:https://github.com/jweny/shiro-cve-2020-17523
  3. Apache Shiro官网:https://shiro.apache.org/
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/ ") 返回false tokenizeToStringArray 返回的 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/