tomcat配置访问路径权限_Apache Shiro权限绕过漏洞分析(CVE202011989)

c75c66cdc4509a3f9efc910a1b5a202e.png

Apache Shiro 作为常用的 Java 安全框架,拥有执行身份验证、授权、密码和会话管理等功能,通常会和 Spring 等框架一起搭配使用来开发 Web 应用。笔者最近捣鼓 Shiro 本来是打算参考最近 Shiro 的一些 issue 然后为 SCTF 出题的,但在测试过程中却发现了一些新的缺陷能导致权限绕过,便报告给 Apache Shiro 官方。在此同时玄武实验室安全研究人员也单独发现了另外一种绕过方式,具体可见参考链接。

影响范围

  • Apache Shiro < 1.5.3

  • Spring 框架中只使用 Shiro 鉴权

漏洞复现

测试 Demo :

https://github.com/l3yx/springboot-shiro

权限配置如下,其中 /admin 下的路由需要登录才能访问

@BeanShiroFilterFactoryBean shiroFilterFactoryBean(){   ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();   bean.setSecurityManager(securityManager());   bean.setLoginUrl("/login");   bean.setSuccessUrl("/index");   bean.setUnauthorizedUrl("/unauthorizedurl");   Mapmap = new LinkedHashMap<>();   map.put("/doLogin", "anon");   map.put("/admin/*", "authc");   bean.setFilterChainDefinitionMap(map);   return  bean;}---@GetMapping("/admin/page")public String admin() {   return "admin page";}

maven 打包项目为 test.war ,部署于 Tomcat 。该漏洞成功利用存在下面两个条件

1.应用不能部署在根目录,也就是需要 context-path , server.servlet.context-path=/test ,如果为根目录则 context-path 为空,就会被 CVE-2020-1957 的 patch 将 URL 格式化,值得注意的是若 Shiro 版本小于 1.5.2 的话那么该条件就不需要。

2. Spring 控制器中没有另外的权限校验代码

如果直接访问 /test/admin/page ,会返回302跳转要求登录

93e25c77e33cb3a0e9adbbf0e1052ff2.png

但是访问/;/test/admin/page , 就能直接绕过 Shiro 权限验证,访问到 /admin 路由中的信息

1463aea8f8b0eb6a9694f26cf49879bb.png

 漏洞分析

由于Shiro的权限校验是通过判断 URL 匹配来做的,如果能找到 Shiro 获取的 URL 与 Web 框架处理 URL 不一致的情况就能造成权限绕过。Shiro 中对于 URL 的获取及匹配在

org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain

以访问 /;/test/admin/page 举例,通过 getPathWithinApplication 函数得到的路径为 / 

5417e9cc10c45ea4fd59fcb44715a90a.png

跟入该函数的处理逻辑org.apache.shiro.web.util.WebUtils#getPathWithinApplication

e227fd542ab2992116508f2ba07ce98c.png

可以看到 org.apache.shiro.web.util.WebUtils#getRequestUri 获取到的是 / 

40a1d8d96746eabde44984f3c46fcc8d.png

这里分别通过 getContextPath() getServletPath() getPathInfo() 获取并拼接得到 /;/test//admin/page ,传入后 decodeAndCleanUriString 变成了 / , org.apache.shiro.web.util.WebUtils#decodeAndCleanUriString

227cb8ad8ba212dfd2e17e3af460a617.png

在 decodeAndCleanUriString ,会根据 Ascii 为 59 的字符也就是 ; 进行 URL 的截断,所以最终返回了 / 

回到最开始的 /;/test/admin/page 请求,该 request 请求会进入 Spring 中, Spring 处理 URL 函数如下org.springframework.web.util.UrlPathHelper#getPathWithinServletMapping

a134e0b31dd744b41c7191379f69afba.png a744c99c8eba62b134dcb5817844fdec.png

在 getPathWithinApplication 处理下是能正确获取到 context-path 与路由,最终经过 getPathWithinServletMapping 函数格式化处理后,得到最终路径为 /admin/page ,所以我们可以正常访问到该页面

1463aea8f8b0eb6a9694f26cf49879bb.png

因此总结来说就是当 URL 进入到 Tomcat 时, Tomcat 判断 /;test/admin/page 为 test 应用下的 /admin/page 路由,进入到 Shiro 时被 ; 截断被认作为 / ,再进入 Spring 时又被正确处理为 test 应用下的 /admin/page 路由,最后导致 Shiro 的权限绕过。

漏洞修复与安全建议

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

fab18bd73dad933207108e3d6b4cd865.png

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

建议组件使用者升级至 Apache Shiro 1.5.3 或更高版本

漏洞处理时间线

  • 2020-6-18 16:30 边界无限安全研究员淚笑向 Apache Shiro 官方报告漏洞

  • 2020-6-19 00:04 Apache Shiro 开始处理漏洞,issue 为 SHIRO-782 

  • 2020-6-22 22:49 Apache Shiro 发布致谢

参考链接

  • https://xlab.tencent.com/cn/2020/06/30/xlab-20-002/ 


4510a6c745d653ed88847adb54d504fa.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值