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方法中,trimTokens为true时调用了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获取漏洞环境
