安全矩阵

 找回密码
 立即注册
搜索
查看: 4938|回复: 0

Apache Shiro 身份验证绕过漏洞复现 (CVE-2020-11989)

[复制链接]

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
发表于 2020-8-6 18:47:18 | 显示全部楼层 |阅读模式
本帖最后由 Xor0ne 于 2020-8-6 18:49 编辑

Apache Shiro 身份验证绕过漏洞复现 (CVE-2020-11989)


原创 VllTomFord

来自于公众号: Tide安全团队
参考链接:https://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA==&mid=2247488061&idx=1&sn=1d85c84949b11de0fd6319319929ecc7&chksm=ce5e305cf929b94aa87b94e1c0323b78d9e3782ff66f622ce5a9b01a99bdbd174f9fb92f19fd&mpshare=1&scene=23&srcid=0805vQIgw6kPbsyHFJFqbqky&sharer_sharetime=1596621227588&sharer_shareid=ff83fe2fe7db7fcd8a1fcbc183d841c4#rd



Apache Shiro是一个强大且易用的Java安全框架,它可以用来执行身份验证、授权、密码和会话管理。目前常见集成于各种应用中进行身份验证、授权等。
本文仅对此漏洞进行了复现,关于此漏洞的分析可以参考以下链接:

一、漏洞详情
在Apache Shiro 1.5.3之前的版本,将Apache Shiro与Spring控制器一起使用时,特制请求可能会导致身份验证绕过。

二、风险等级


高风险

三、影响版本
Apache Shiro 1.5.3之前的版本
Spring 框架中只使用 Shiro 鉴权

四、漏洞复现

4.1 环境搭建

4.2 环境部署
将springboot-shiro项目导入IntelliJ IDEA,配置 Maven:
  1. /Users/Tide/Library/apache-maven-3.6.3/conf/settings.xml(本地演示环境:Mac OS)
复制代码



添加本地镜像:
  1. <mirrors>
  2.     <mirror>
  3.       <id>alimaven</id>
  4.         <mirrorOf>central</mirrorOf>
  5.         <name>aliyun maven.</name>
  6.         <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
  7.       </mirror>
  8.     <mirror>
  9.       <id>repo1</id>
  10.       <mirrorOf>central</mirrorOf>
  11.       <name>HHuman Readable Name for this Mirror.</name>
  12.       <url>http://repo1.maven.org/maven2/</url>
  13.     </mirror>

  14.     <mirror>
  15.       <id>repo2</id>
  16.       <mirrorOf>central</mirrorOf>
  17.       <name>Human Readable Name for this Mirror.</name>
  18.       <url>http://repo2.maven.org/maven2/</url>
  19.     </mirror>
  20.   </mirrors>
复制代码



注意:settings.xml的缩进问题,否则生成war包时会报错。
更改 IDEA 中的 Maven home directory 和 User settings file 配置:

生成 war 包:


将打包好的 war 包部署于 Tomcat 。该漏洞成功利用存在下面两个条件
  • 应用不能部署在根目录,也就是需要 context-path , server.servlet.context-path=/shiro,如果为根目录则context-path为空,就会被 CVE-2020-1957 的 patch 将 URL 格式化,值得注意的是若 Shiro 版本小于 1.5.2 的话那么该条件就不需要。
  • Spring 控制器中没有另外的权限校验代码


漏洞环境的权限配置如下,其中 /admin 下的路由需要登录才能访问:
  1. @Bean
  2. ShiroFilterFactoryBean shiroFilterFactoryBean(){
  3.    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
  4.    bean.setSecurityManager(securityManager());
  5.    bean.setLoginUrl("/login");
  6.    bean.setSuccessUrl("/index");
  7.    bean.setUnauthorizedUrl("/unauthorizedurl");
  8.    Map<String, String> map = new LinkedHashMap<>();
  9.    map.put("/doLogin", "anon");
  10.    map.put("/admin/*", "authc");
  11.    bean.setFilterChainDefinitionMap(map);
  12.    return  bean;
  13. }
  14. ---
  15. @GetMapping("/admin/page")
  16. public String admin() {
  17.    return "admin page";
  18. }
复制代码

4.3 漏洞复现

1、直接访问http://192.168.31.68:8080/shiro/admin/page

会返回 302 跳转要求登录。

2、直接访问/;/shiro/admin/page , 就能直接绕过 Shiro 权限验证,访问到/admin路由中的信息。


五、漏洞修复

Shiro 1.5.3修改了URL获取的逻辑,不单独处理context-path,具体代码如下所示:org.apache.shiro.web.util.WebUtils#getPathWithinApplication

因此就无法再通过构造context-path的方式来进行绕过了。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 06:08 , Processed in 0.012693 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表