Shiro鉴权绕过
环境搭建
了解Ant 风格路径表达式
https://blog.csdn.net/sinat_18619901/article/details/95931601
CVE-2020-11989
影响条件
Apache Shiro < 1.5.3
Spring 框架中只使用 Shiro 鉴权
代码分析
首先在com.shiro.vuln.Shiro.ShiroConfig#shiroFilterFactoryBean中添加如下内容
1 | map.put("/admin/*","authc"); |
![](/2022/02/14/Shiro%E9%89%B4%E6%9D%83%E7%BB%95%E8%BF%87/4a3e22d9-417e-4619-9642-56f8afa4648e.png)
然后在com.shiro.vuln.Controller.UserController添加路由
1 |
|
payload
1 | http://127.0.0.1:8080/admin/a%252Fb |
正常情况下访问/admin/xxx 或 /admin/xxx/xxx 分别会跳转302和404,但是上面那样访问可以直接绕过权限校验并且返回我们想要访问的控制器;下面来分析下可以绕过的原因,首先在org.apache.shiro.web.util.WebUtils#getPathWithinApplication位置下断点,然后使用payload访问
![](/2022/02/14/Shiro%E9%89%B4%E6%9D%83%E7%BB%95%E8%BF%87/321ccca4-c503-497d-b4f7-5f5b542d57bb.png)
首先会经过String requestUri = getRequestUri(request); 跟进该方法
![](/2022/02/14/Shiro%E9%89%B4%E6%9D%83%E7%BB%95%E8%BF%87/77078b04-478b-4200-a517-919d7b52677f.png)
首先会进入到if条件中,对传入的路径进行一次URL解码,此时uri的值为//admin/a%2Fb
然后会运行到
return normalize(decodeAndCleanUriString(request, uri));