1.漏洞原理
在Apache Shiro 1.5.2以前的版本中,在使用Spring动态控制器时,攻击者通过构造”..;”这样的跳转,可以绕过Shiro中对目录的权限限制。
我们需要分析我们请求的URL在整个项目的传入传递过程。在使用了shiro的项目中,是我们请求的URL(URL1),进过shiro权限检验(URL2), 最后到springboot项目找到路由来处理(URL3)。
漏洞的出现就在URL1,URL2和URL3有可能不是同一个URL,这就导致我们能绕过shiro的校验,直接访问后端需要首选的URL。本例中的漏洞就是因为这个原因产生的。
以http://localhost:8080/xxxx/..;/admin/index为例,一步步分析整个流程中的请求过程。
此时的URL还是我们传入的原始URL:/xxxx/..;/admin/index
接着,程序会进入到decodeAndCleanUriString(),得到:
decodeAndCleanUriString以“;”截断后面的请求,所以此时返回的就是/xxxx/...然后程序调用normalize()对decodeAndCleanUriString()处理得到的路径进行标准化处理。标准话的处理包括:
替换反斜线
替换 // 为 /
替换 /./ 为 /
替换 /../ 为 /
都是一些很常见的标准化方法。
经过getPathWithinApplication()函数的处理,最终shiro 需要校验的URL就是/xxxx/..,最终会进入到org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver中的 getChain()方法会URL校验。关键的校验方法如下:
由于/xxxx/..并不会匹配到/admin/**,所以shiro权限校验就会通过。
2.漏洞复现
开启靶场
进入靶场web界面,发现登录功能点。
根据漏洞原理,使用kali中的ffuf对url进行模糊测试
修改接口为admin,响应为302
根据vulhub漏洞文档对请求包进行构造,发包后获取响应
打开浏览器中,由Logout按钮可见当前是已登录状态,成功进入后台。
原文始发于微信公众号(智检安全):CVE-2020-1957-Apache Shiro认证绕过漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论