首页 > 技术文章 > CVE-2020-17523:Apache Shiro身份认证绕过漏洞分析

cHr1s 2021-02-04 17:54 原文

0x01 Apache Shiro

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。

0x02 漏洞简介

2021年2月1日,Apache Shiro官方发布漏洞通告,漏洞编号为:CVE-2020-17523。
当Apache Shiro与Spring框架结合使用时,攻击者可以通过构造特殊的HTTP请求数据包,绕过身份认证匹配规则。

0x03 漏洞复现

环境搭建

使用tomcat部署shiro1.7.0.war包。

公众号回复shiro获取下载链接。

复现过程

访问admin下面的资源/admin/1跳转到登录界面:

使用payload:/admin/%20绕过身份验证,成功访问admin页面:

0x04 漏洞分析

漏洞成因

代码中,Shiro会对请求的uri进行鉴权操作,Shiro的校验uri的函数为PathMatches,当PathMatches返回true时才会进入鉴权。

然而PathMatches("/admin/*","/admin/ ")返回结果为false,因此访问/admin/ 这个uri时Shiro不会进行鉴权操作,
但是Spring接收到的uri则是/admin/%20,会正常返回响应admin page

代码分析

代码执行过程中调用tokenizeToStringArray方法,而当调用此方法时trimTokens参数值为true

而在tokenizeToStringArray方法中,trimTokenstrue时调用了trim()函数,去除了空格字符,导致未进行鉴权操作:

简单总结下,在存在漏洞Shiro版本中,执行tokenizeToStringArray方法时trimTokens值为true,导致uri中的空格字符被清除,因此代码并没有经过鉴权处理,然而Spring接受到的uri:/admin/%20会正常返回响应,最终导致身份验证被绕过。
利用Shiro与Spring处理uri的不同规则绕过身份验证。

0x05 影响版本

Apache Shiro < 1.7.1

0x06 修复方案

官方修复方案中,将tokenizeToStringArray方法中的trimTokens置为false

建议升级到Apache Shiro 1.7.1版本

公众号回复shiro获取漏洞环境

推荐阅读