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获取漏洞环境