shiro权限绕过漏洞分析-CVE_2020_1957/CVE-2020-13933
前情提要:
说起shiro来,在攻防中最常见的就是两种漏洞,一种就是固定密钥爆破导致shiro反序列化漏洞rce,另一种就是shiro的权限绕过漏洞,通过构造特定的url链接来导致未授权访问
漏洞成因:
shiro和spring对同一个url的不同解析方式导致了漏洞的产生
Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,/*可以匹配/hello,但是匹配不到/hello/,因为*通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。
漏洞复现:
咱们这里就拿vulfocus直接搭建环境复现就好
cve_2020_1957
shiro1.4.2版本绕过权限
我们访问/hello/1.发现会跳转到登陆页面

但是当我们访问/hello/1/的时候,去发现可以直接访问

漏洞分析
主要原因就是在这个函数里shiro.util.AntPathMatcher#doMatch

当Shiro 的Ant格式的pathPattern 中的的*通配符是不支持匹配路径的,所以/hello/* 不能成功匹配/hello/1/ ,也就不会触发authc拦截器进行权限拦截。从而成功绕过了Shiro拦截器,而后再进入到spring拦截器中,/hello/1/与/hello/1能获取到相同的资源。
Shiro≤1.5.1版本绕过
xxxx/..;/hello/1,成功绕过
或者/fdsf;/../hello/1都可以

- 客户端请求URL: /xxxx/..;/hello/1
- shrio 内部处理得到校验URL为 /xxxx/..,校验通过
- springboot 处理 /xxxx/..;/hello/1 , 最终请求 /hello, 成功访问了后台请求.
漏洞分析:
可以定位到getChain函数

从代码中我们可以看到getPathWithinApplication(request)获取的requestURI为/fdsf ,而不是/fdsf;/../hello/1,从而导致后面的URI路径模式匹配返回False,从而再次绕过了shiro拦截器
如果URI中存在;号的话,则会删除其后面的所有字符。/fdsf;/../hello/1/最终也就变成了/fdsf
漏洞修复
shiro1.4.2版本出现漏洞后为删除requestURI后面的/号进行URL路径匹配,算是简单的修复了添加/号绕过的方式,而后在1.5.2版本中通过requestURI自主拼接的方式修复了/fdsf;/../hello/1/等使用了;号方式的绕过
CVE-2020-13933
访问/admin就会跳转,但是使用上面的方法都已经失效了
payload:
http://xxxxx/admin/%3b
注意这里必须要url编码;,不然是没法绕过的

- 客户端请求URL:
/admin/; - Shrio 内部处理得到校验URL为
/admin/,校验通过 - SpringBoot最终请求
/admin/;, 成功访问了后台请求

浙公网安备 33010602011771号