本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!
欢迎各位添加微信号:asj-jacky
加入安世加 交流群 和大佬们一起交流安全技术
背景
在Shiro与Spring进行组合应用时,两者在对URI的处理中存在差异,常常导致Shiro认证绕过问题。
CVE-2020-17523复现
> curl -v "http://host/admin/%20"
> curl -v "http://host/admin/%20/"
复现配置
(部分内容取自https://github.com/xhycccc/Shiro-Vuln-Demo/blob/main/shiro_cve-2020-13933)
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean(){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager());
Map<String, String> map = new LinkedHashMap<>();
map.put("/admin/*", "authc");
bean.setFilterChainDefinitionMap(map);
return bean;
}
@GetMapping("/admin/{name}")
public String admin(@PathVariable String name) {
return "admin page";
}
漏洞分析
diff: https://github.com/apache/shiro/compare/shiro-root-1.7.0...shiro-root-1.7.1
web/src/test/java/org/apache/shiro/web/filter/PathMatchingFilterParameterizedTest.java
90-93行。该部分增加了很多有关空格的测试内容。猜测本次补丁与空格或%20有关。
core/src/main/java/org/apache/shiro/util/AntPathMatcher.java
这个文件是补丁的关键所在,后面再说。org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver.getChain
开始。因为payload中无分号,反斜线,非ASCII码等字符,所以requestURI
会原样保留一直到进行AntMatch模式匹配。requestURI
并没能与/admin/*
匹配成功,那它匹配上了哪个规则呢?/**
这个规则。在ShiroFilter中,/**
是没有配置认证的,因此绕过了认证过程。org.springframework.web.servlet.DispatcherServlet.getHandler
过程中获取对应的处理handler。这里给出调用栈。/admin/{name}
所对应的Controller,从而访问到admin page。core/src/main/java/org/apache/shiro/util/AntPathMatcher.java#L121
这里。Shiro中
StringUtils.tokenizeToStringArray
的第三个参数控制了是否会对解析出的token进行trim操作。在1.7.1之前,空格被trim了,所以第二层路径没有了,就没能匹配到
/admin/*
。/admin/**/*
,就不会有问题了。漏洞影响
修复建议
THANKS FOR WAITCHING
本文始发于微信公众号(安世加):技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论