ApacheShiro⾝份验证绕过漏洞复现(CVE-2020-11989)
0x00 漏洞简述
Apache Shiro 1.5.3之前的版本中,当将Apache Shiro与Spring动态控制器⼀起使⽤时,精⼼编制的请求可能会导致绕过⾝份验证,如果直接访问 /shiro/admin/page ,会返回302跳转要求登录,访问 /;/shiro/admin/page , 就能直接绕过Shiro权限验证,访问到/admin路由中的信息
0x01 漏洞影响
Apache Shiro 1.5.3之前的版本
Spring 框架中只使⽤ Shiro 鉴权
0x02 环境搭建
1.下载项⽬到本地github/l3yx/springboot-shiro
2.通过idea编辑器对其进⾏编译成war包,然后讲放⼊到tomcat下的webapps⽬录中,运⾏即可。
这⾥已编译好war包:
github/backlion/demo/blob/master/shiro.war
0x03 漏洞复现
1.权限配置如下,其中/admin下的路由需要登录才能访问
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean(){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager());
bean.setLoginUrl("/login");
bean.setSuccessUrl("/index");
bean.setUnauthorizedUrl("/unauthorizedurl");
Map<String, String> map = new LinkedHashMap<>();
map.put("/doLogin", "anon");
map.put("/admin/*", "authc");
bean.setFilterChainDefinitionMap(map);
return bean;
}
---
@GetMapping("/admin/page")
public String admin() {
return "admin page";
}
2.maven打包项⽬为shiro.war,部署于Tomcat。该漏洞成功利⽤存在下⾯两个条件
1. 应⽤不能部署根⽬录root⽬录下,也就是需要context-path,t-path=/shiro,如果为根⽬录则context-path为空,就会被CVE-2020-1957的patch将URL格
式化,值得注意的是若Shiro版本⼩于1.5.2的话那么该条件就不需要。
2. Spring控制器中没有另外的权限校验代码
3.如果直接访问 /shiro/admin/page ,会返回302跳转要求登录
4.但是访问 /;/shiro/admin/page , 就能直接绕过Shiro权限验证,访问到/admin路由中的信息
cve漏洞库
0x04 漏洞分析
由于Shiro的权限校验是通过判断url匹配来做的,如果能到Shiro获取的url与Web框架处理url不⼀致的情况就能造成权限绕过。Shiro中对于URL的获取及匹配在
org.apache.shiro.PathMatchingFilterChainResolver#getChain
以访问/;/shiro/admin/page举例,通过getPathWithinApplication函数得到的路径为/
跟⼊该函数的处理逻辑
org.apache.shiro.web.util.WebUtils#getPathWithinApplication
可以看到 org.apache.shiro.web.util.WebUtils#getRequestUri 获取到的是/
这⾥分别通过getContextPath() getServletPath() getPathInfo()获取并拼接得到/;/test//admin/page,传⼊后decodeAndCleanUriString变成了/, org.apache.shiro.web.util.WebUtils#decodeAndCleanUriString
在decodeAndCleanUriString,会根据ascii为59的字符也就是;进⾏URL的截断,所以最终返回了/
回到最开始的/;/shiro/admin/page请求,该request请求会进⼊spring中,spring处理url函数如下
org.springframework.web.util.UrlPathHelper#getPathWithinServletMapping
在getPathWithinApplication处理下是能正确获取到context-path与路由,最终经过getPathWithinServletMapping函数格式化处理后,得到最终路径为/admin/page,所以我们可以正常访问到该页⾯
因此总结来说就是当URL进⼊到Tomcat时,Tomcat判断/;shiro/admin/page ,为shiro应⽤下的/admin/page路由,进⼊到Shiro时被;截断被认作为/,再进⼊Spring时⼜被正确处理为test应⽤下的/admin/page路由,最后导致shiro的权限绕过。
0x05 漏洞修复
升级到最新版,官⽅已在新版本中修复了该漏洞
0x06 参考⽂献
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论