tomcat配置访问路径权限_Apache Shiro权限绕过漏洞

本文介绍了Apache Shiro框架的权限绕过漏洞CVE-2020-11989,详细阐述了Shiro的基本功能和优势,并分析了漏洞成因、复现过程以及修复措施。攻击者利用此漏洞可通过发送特制HTTP请求绕过身份验证,获取未授权访问。建议更新到最新版本以避免风险。
摘要由CSDN通过智能技术生成

相关知识

1、什么是ApacheShiro

Apache Shiro是一种功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理,可用于保护任何应用程序的安全。

Shiro提供了应用程序安全性API来执行以下方面:

1)身份验证:证明用户身份,通常称为用户‘登录’;

2)授权:访问控制;

3)密码术:保护或隐藏数据以防窥视;

4)会话管理:每个用户的时间敏感状态。

上述四个方面也被称为应用程序安全性的四个基石。

Shiro还支持一些辅助功能,例如Web应用程序安全性,单元测试和多线程支持,它们的存在也是为了加强上述四个方面。

2、ApacheShiro功能概述

1)在任何地方最容易理解的Java安全性API,类和接口的名称很直观;

2)支持跨一个或多个可插拔数据源(LDAP、JDBC、ActiveDirectory等)的身份验证;还可以使用可插拔数据源,根据角色或细粒度权限执行授权;

3)一流的缓存支持,增强应用程序性能;

4)内置基于POJO的企业会话管理,可在Web和非Web环境中使用,也可在需要单点登录(SSO)或分布式会话的环境中使用;

5)异构客户端会话访问:无论部署环境如何,FlashApplet、C#、JavaWeb Start和Web应用程序等都可以共享会话状态;

6)简单单点登录支持附带企业会话管理:如果会话是跨多个应用程序联合的,用户的身份验证状态也可以共享;

7)使用可用加密API保护数据安全,这是Java默认情况下提供的用于密码和哈希的功能;

8)一个健壮的Web框架可以保护任何URL或资源,自动处理登录和注销。

3、ApacheShiro的优势

1)易于使用、全面;

2)灵活:ApacheShiro可以在任何应用程序环境中工作;

3)具有Web功能:允许基于应用程序URL和Web协议创建灵活的安全策略,还提供一组JSP库来控制页面输出;

4)可插拔:Shiro干净的API和设计模式使它易于与其他框架和应用程序集成,Shiro可以与Spring、Grails、Wicket、Tapestry、Mule、ApacheCamel、Vaadin等框架无缝集成;

5)受支持:ApacheShiro是Apache Software Foundation(Apache软件基金会)的一部分,如果需要,像Katasoft这样的商业公司也可以提供专业的支持和服务。

4、框架局限性

Apache Shiro并不能解决所有安全问题,如:

1)虚拟机级别的问题:ApacheShiro当前不处理虚拟机级别的安全性,例如基于访问控制策略阻止某些类加载到类加载器中的能力;

2)多阶段身份验证:在这种身份验证中,用户可能通过一种机制登录,只是要求用户使用另一种机制再次登录;

3)领域写入操作:当前所有领域实现均支持读取操作,获取身份验证和授权数据,以执行登录和访问控制;不支持写入操作,如创建用户账户、组和角色,或将用户与角色组和权限相关联,这是因为支持这些操作的数据模型在各个应用程序中差异很大,并且很难在所有Shiro用户上强制执行写入API。

漏洞信息

1、漏洞编号:CVE-2020-11989

2、漏洞描述:在ApacheShiro1.5.3之前的版本,将ApacheShiro与Spring动态控制器一起使用时,由于处理身份验证请求出错存在权限绕过漏洞。攻击者可以通过发送特制的HTTP请求,绕过身份验证,并获得对应用程序的未授权访问。

3、威胁等级:高危

漏洞环境

操作系统:Windows7;工具:Gitfor Windows、IntelliJ IDEA、Tomcat、burpsuite

1、本地安装Gitfor Windows;

2、设置IDEA

打开IDEA—>File—>Settings:efbe76a0fdc6552627d7000e112d93ba.png

e6560257d62471e6e0016965f3f9dfc4.png37b0e93ef4a5c81529eacaee5c4a0676.png

3、导入GitHub项目

db14971a87b8d1531a3aafa12cf28a64.png

填入GitHub中项目的路径:https://github.com/l3yx/springboot-shiro.git

9fc2ea4d0a5d2818b735ffb4a2118606.png

4、审查项目结构

045f880e7d726883545f088dfb48901a.png

1).idea/文件夹:存放项目的配置信息,包括历史记录、版本控制信息等。其中.gitignore是一个git忽略文件,包含不应检入版本控制的后缀和目录。

2)src/:源代码。

3)pom.xml:Maven项目/构建文件,已配置Jetty,可以通过运行mvnjetty:run测试Web应用程序。

4).iml文件:IntelliJIDEA自动创建的模块文件,存储一些模块开发相关信息,还可能会存储一些模块路径信息、依赖信息等其他设置。

5、IDEA打包maven项目

637baab29d5c2dda38582b5c140a5551.png8633e08236b8a568180acdd8484dea58.png

Build Success后会在target文件夹下生成一个war包,将其上传至服务器即可部署:

35dc29ef3b28350981be920df077ff4b.png

6、部署并运行应用

部署在Tomcat中:c6c0bc541478ff8dd7c23d07918e66ae.png

运行:

6778e9ab54a36978d5888aa0c3bdae2e.png

漏洞复现

权限配置如下:

\src\main\java\org\syclover\srpingbootshiro\ShiroConfig.java:

7dd61b47c884f3aa761edefbc1c99913.png

34行为authc拦截器的拦截正则。

路由控制器方法为同目录下的LoginController.java:

0fe662dadadbf4ca251f4158b2f6de1f.png

访问/admin/page接口,会返回302跳转要求登录:

ae34025a4eb85e62a413785321362482.png

而访问/;/admin/page,就可以直接绕过Shiro权限验证,访问到/admin路由中的信息:

8af984268b5ab652d4a9da55e8d5301c.png

漏洞分析

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

Shiro中对于URL的获取及匹配在org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain76eb3a7440620fe9a4fc9ce35f4d1357.png

以访问/;/xxxxx(maven项目名称)/admin/page为例,通过getPathWithinApplication函数得到路径为/

跟进该函数的处理逻辑,位于org.apache.shiro.web.util.WebUtils#getPathWithinApplication6aff8322dfc60a8ede40b3abfb0f03b9.png

继续跟进getRequestUri函数,可以看到org.apache.shiro.web.util.WebUtils#getRequestUri获取到的是/

53aae1524d51b6e358cb19f814c35263.png

分别通过getContextPath()、getServletPath()和getPathInfo()获取并拼接得到/;/xxxxx//admin/page,传入decodeAndCleanUriString后变成了/

org.apache.shiro.web.util.WebUtils#decodeAndCleanUriString:

d96d6ff58dd21ab7dd365a77899391a7.png

根据;进行URL截断,截断之后的结果是/无法命中拦截器map.put("/admin/*","authc");,形成权限绕过。

而在最开始的/;/xxxxx/admin/page,该请求会进入spring中,其处理URL的函数为org.springframework.web.util.UrlPathHelper#getPathWithinServletMapping

df669ef7d6480c21ea14b6f7598ee220.png

经过getPathWithinServletMapping函数格式化处理得到最终路径为/admin/page,所以可以正常访问到内容为’adminpage’的页面。

总结:当URL进入到Tomcat时,Tomcat判断/;xxxxx/admin/page为应用下的/admin/page路由,进入Shiro时被处理为应用下的/admin/page路由,导致Shiro的权限绕过。

漏洞修复

Shiro 1.5.3版本采用标准的getServletPath和getPathInfo进行uri处理,同时取消了url解码:

e16de318442651b98dd305cbb98967f9.png

但是Shiro在处理URL时与spring仍然存在差异,使用getRequestURI方法获取原始URL,然后直接进行分号的去除。只需要设置授权匹配时使用单*的弱匹配,并传入构造的payload使其匹配不上,就可以比较出Shiro和spring的区别,绕过授权。

Shiro 1.5.3版本的ApacheShiro权限绕过漏洞(CVE-2020-13933)参考https://www.freebuf.com/vuls/247308.html

建议将ApacheShiro升级至最新版本,下载地址为http://shiro.apache.org/download.html,并做好资产自查及预防工作。

参考

1、https://www.infoq.com/articles/apache-shiro/

2、http://shiro.apache.org/features.html

3、https://xz.aliyun.com/t/7964

4、https://my.oschina.net/u/4587690/blog/4525549/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值