技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

admin 2021年11月13日11:46:41评论294 views字数 2167阅读7分13秒阅读模式

本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!


欢迎各位添加微信号:asj-jacky

加入安世加 交流群 和大佬们一起交流安全技术

技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

背景

Apache Shiro是一个Java安全框架,它可以用来执行身份验证、授权、密码和会话管理。
在Shiro与Spring进行组合应用时,两者在对URI的处理中存在差异,常常导致Shiro认证绕过问题。

CVE-2020-17523复现

非漏洞作者,所以只能半猜测地复现该问题。先上payload:
> curl -v "http://host/admin/%20"
> curl -v "http://host/admin/%20/"

复现配置

SpringBoot + Shiro认证
(部分内容取自https://github.com/xhycccc/Shiro-Vuln-Demo/blob/main/shiro_cve-2020-13933)
向Spring中注入Bean
@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";
}
可见,在未经过认证的情况下,可以访问到admin page.
技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

漏洞分析

在Shiro 1.7.1 与 1.7.0 的diff中,有两个文件值得关注。
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 这个文件是补丁的关键所在,后面再说。

先来跟踪一下payload在Shiro 1.7.0下路径规则判断过程。
Shiro的路径判断从org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver.getChain开始。因为payload中无分号,反斜线,非ASCII码等字符,所以requestURI会原样保留一直到进行AntMatch模式匹配。

技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

可见,requestURI并没能与/admin/*匹配成功,那它匹配上了哪个规则呢?

技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

它匹配到了/**这个规则。在ShiroFilter中,/**是没有配置认证的,因此绕过了认证过程。
再看Spring处理环节。Spring的路由匹配在org.springframework.web.servlet.DispatcherServlet.getHandler过程中获取对应的处理handler。这里给出调用栈。
技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)
由于Spring也没对路径中的空格进行特殊的处理,因此能获取到/admin/{name}所对应的Controller,从而访问到admin page。
一边(Shiro)是没能匹配到需要认证的规则路由,一边(Spring)又能够正常匹配到API路由。还是挺有意思的。
Shiro是怎么修复的呢?关键就在core/src/main/java/org/apache/shiro/util/AntPathMatcher.java#L121这里。
Shiro中StringUtils.tokenizeToStringArray的第三个参数控制了是否会对解析出的token进行trim操作。
在1.7.1之前,空格被trim了,所以第二层路径没有了,就没能匹配到/admin/*
技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)
在1.7.1中,正确处理了空格。
技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)
当然,如果认证的路由写作/admin/**/*,就不会有问题了。

漏洞影响

该漏洞影响范围 Apache Shiro <= 1.7.0

修复建议

升级Apache Shiro组件到1.7.1




技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

THANKFOWAITCHING





About us

技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

陌陌安全
致力于以务实的工作保障陌陌旗下所有产品及亿万用户的信息安全
以开放的心态拥抱信息安全机构、团队与个人之间的共赢协作
以自由的氛围和丰富的资源支撑优秀同学的个人发展与职业成长

本文始发于微信公众号(安世加):技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年11月13日11:46:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   技术干货 | Apache Shiro权限绕过漏洞分析(CVE-2020-17523)http://cn-sec.com/archives/518364.html

发表评论

匿名网友 填写信息