Apache Shiro 1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,比如:/*可以匹配/hello,但是匹配不到/hello/,因为*通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。
知识点补充:
Apache Shiro 是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
CVE-2020-1957,Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时,可以精心构造恶意的URL,利用 Apache Shiro 和 Spring Boot 对URL的处理的差异化,可以绕过 Apache Shiro 对 Spring Boot 中的 Servlet 的权限控制,越权并实现未授权访问。
二、环境部署——(本次环境的shiro版本是1.4.2)
在ShiroConfig配置文件中,添加authc拦截器的拦截正则:
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean() {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
...
...
//map.put("/*", "authc");
map.put("/hello/*", "authc");
bean.setFilterChainDefinitionMap(map);
return bean;
}
然后再在路由控制器里面修改:
@GetMapping("/hello/{currentPage}")
public String hello(@PathVariable Integer currentPage) {
return "hello";
}
部署好,查看环境:
三、漏洞复现——(根据之前部署的环境进制绕过)
开始抓包
访问/hello/1接口,可以看到被authc拦截器拦截了,将会跳转到登录接口进行登录。
进行绕过,访问/hello/1/,成功绕过authc拦截器,获取到了资源。
四、漏洞分析
Shiro1.4.2版本绕过漏洞分析
漏洞初始成因可以定位到 PathMatchingFilterChainResolver的getChain函数下,该函数作用根据URL路径匹配中配置的url路径表达式来匹配输入的URL,判断是否匹配拦截器,匹配成功将会返回响应的拦截器执行链,让ShiroFither执行权限操作的。其对于URL路径表达式和输入URL的匹配主要通过pathMathches函数进行匹配。
Shiro≤1.5.1版本绕过其他方式绕过:
复现成功!其中以上处理过程:
客户端请求URL: /xxxx/..;/hello/1shrio 内部处理得到校验URL为 /xxxx/..,校验通过springboot 处理 /xxxx/..;/hello/1 , 最终请求 /hello, 成功访问了后台请求.



