Shiro权限绕过漏洞分析(CVE-2020-1957)
这篇是实战:https://xz.aliyun.com/t/10328
,不过中间的以下条件的“2、要以路径通配符**结尾”是错的,这个不是条件,只要让路径规范化处理完后匹配上anon配置的即可。评论里有大佬指出了。
前言
2020年3月23号,Shiro开发者Brian Demers在用户社区发表帖子,提醒shiro用户进行安全更新,本次更新进行了三个修复,其中就包括了对编号为CVE-2020-1957的Shrio授权绕过漏洞的修复。漏洞影响shiro 1.5.2版本以下。
分析过程
SHIRO-682
根据Shiro开发者在1.5.2版本中提交的commit中关于PathMatchingFilter类的测试用例,可以直接关联到JIRA issueSHIRO-682,该issue在1.5.0版本中进行了修复。而1.5.2版本中更新则是对其绕过的修复。
SHIRO-682的修复了spring框架下uri = uri + ‘/’ 绕过Shiro防护的问题。然后下面的描述则清晰得描述了造成改错误的原因。
在Spring web项目中,请求URI/resource/menus和/resource/menus/都可以访问到服务器的资源。
但在Shiro中的URL路径表达式pathPattern可以正确匹配/resource/menus,但不能正确匹配/resource/menus/,导致过滤链无法正确匹配,从而绕Shiro的防护机制。
Shiro拦截器
Shiro框架通过拦截器功能来实现对用户访问权限的控制和拦截。Shiro中常见的拦截器有anon,authc等拦截器。
1.anon为匿名拦截器,不需要登录就能访问,一般用于静态资源,或者移动端接口
2.authc为登录拦截器,需要登录认证才能访问的资源。
用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表达式通常为ANT格式。如下配置,访问 /index.html主页的时候,Shiro将不会对其进行登录判断,anon拦截器不需要登录就能进行访问。而对于/user/xiaoming 等 /user/xiaogang等接口,authc拦截器将会对其进行登录判断,有登录认证才能访问资源。
[urls]
/index.html = anon
/user/** = authc
Shiro的URL路径表达式为Ant 格式,路径通配符支持?***。
?:匹配一个字符
*:匹配零个或多个字符串
**:匹配路径中的零个或多个路径
其中*表示匹配零个或多个字符串,/*可以匹配/hello,但匹配不到/hello/因为*通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*URL路径表达式将无法正确匹配,放行。然后进入到spring(Servlet)拦截器,spring中/hello形式和/hello/形式的URL访问的资源是一样的。
漏洞复现
明白上文的内容,漏洞复现就很容易了,复现环境代码主要参考网上的开源demo。
1.下载demo代码shiro-basic。
2.导入idea
3.Shiro版本1.4.2
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.4.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.2</version></dependency>
4.修改ShiroConfig配置文件,添加authc拦截器的拦截正则
@BeanShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();......//map.put("/*", "authc");map.put("/hello/*", "authc"); bean.setFilterChainDefinitionMap(map);return bean;}
5.修改路由控制器方法
@GetMapping("/hello/{currentPage}")public String hello(@PathVariable Integer currentPage) {return "hello";
}
6.启动应用
访问/hello/1接口,可以看到被authc拦截器拦截了,将会跳转到登录接口进行登录。
访问/hello/1/,成功绕过authc拦截器,获取到了资源。
漏洞成因
漏洞初始成因可以定位到 PathMatchingFilterChainResolver的getChain函数下,该函数作用根据URL路径匹配中配置的url路径表达式来匹配输入的URL,判断是否匹配拦截器,匹配成功将会返回响应的拦截器执行链,让ShiroFither执行权限操作的。
其对于URL路径表达式和输入URL的匹配主要通过pathMathches函数进行匹配。
pathMatches函数其最终会调用shiro.util.AntPathMatcher类中doMatch的对于ant格式的pathPattern和requestURI进行匹配。
//pathMatches:135, PathMatchingFilterChainResolver (org.apache.shiro.web.filter.mgt)
protected boolean pathMatches(String pattern, String path) {PatternMatcher pathMatcher = this.getPathMatcher();return pathMatcher.matches(pattern, path);
}
doMatch:109, AntPathMatcher (org.apache.shiro.util),当Shiro 的Ant格式的pathPattern 中的的*通配符是不支持匹配路径的,所以/hello/*不能成功匹配/hello/1/,也就不会触发authc拦截器进行权限拦截。从而成功绕过了Shiro拦截器,而后再进入到spring拦截器中,/hello/1/与/hello/1能获取到相同的资源。
漏洞修复
该漏洞是由中国开发者在2019年3月25日在ShiroGitHub项目上提交的issue,并PR了分支代码589f10添加漏洞修复代码,最终分支代码在1.5.0版本进行了合并,合并时间为2019年11月20日。
1.5.0版本修复
1.5.0版本修复源自tomsun28提交的PR代码,代码修复位置为pathsMatch:125, PathMatchingFilter (org.apache.shiro.web.filter),该修复方式是通过判断requestURI是否以/为结尾,如果以/结尾的话,则去掉尾部的/符号在与URL表达式进行比较。
也就是当requestURI为/hello/1/等以/为结尾的URI的时候,都会被清除最后的/号,再进行URL路径匹配。
≤1.5.1版本绕过
观察1.5.2版本中新添加的测试用例。
切换测试版本到1.5.1中,然后从中上面的测试用例提取payload进行绕过。
在1.5.1版本中,添加/还是会直接跳转到登录。
绕过payload,/fdsf;/../hello/1,成功绕过。
问题同样可以定位到getChain函数中对于requestURI的获取中,如下图所示,this.getPathWithinApplication(request)获取的requestURI为/fdsf,而不是我们输入的/fdsf;/../hello/1,从而导致后面的URI路径模式匹配返回False,从而再次绕过了shiro拦截器。
getPathWithinApplication函数中会调用WebUtils (org.apache.shiro.web.util)中的getRequestUri函数获取RequestUri。
public static String getRequestUri(HttpServletRequest request) {String uri = (String)request.getAttribute("javax.servlet.include.request_uri");if (uri == null) {uri = request.getRequestURI();}return normalize(decodeAndCleanUriString(request, uri));}
RequestUri函数中最终调用decodeAndCleanUriString函数对URI进行清洗。
private static String decodeAndCleanUriString(HttpServletRequest request, String uri) {uri = decodeRequestString(request, uri);int semicolonIndex = uri.indexOf(59);//获取;号的位置return semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri;}
如果URI中存在;号的话,则会删除其后面的所有字符。/fdsf;/../hello/1/最终也就变成了/fdsf。
1.5.2版本修复
再1.5.2版本中对其进行了修复,获取requestURI的方式从request.getRequestUri直接获取的方式更改为获取request的ContextPath,ServletPath,PathInfo,然后再重新拼接而成。
输入的/fdsf;/../hello/1/,将会被拼接为//hello/1/1再进行URI路径匹配,则无法绕过拦截器。
总结
在web容器中,Shiro的拦截器是先与spring(Servlet)执行,两者拦截器对于URI模式匹配的差异,导致Shiro拦截器的绕过,而Shiro对其进行了两次修复,其一为删除requestURI后面的/号进行URL路径匹配,算是简单的修复了添加/号绕过的方式,而后在1.5.2版本中通过requestURI自主拼接的方式修复了/fdsf;/../hello/1/等使用了;号方式的绕过。
而后又会有什么形式的绕过,或者又有什么其它容器导致的差异化绕过。则未可知。
修复方案
1.升级1.5.2版本及以上
2.尽量避免使用*通配符作为动态路由拦截器的URL路径表达式。
参考链接
1.https://github.com/apache/shiro/pull/127
2.https://blog.51cto.com/luchunli/1835108
3.https://issues.apache.org/jira/browse/SHIRO-682
4.https://www.syshlang.com/96db3174/
5.http://shiro-user.582556.n2.nabble.com/Re-ANNOUNCE-CVE-2020-1957-Apache-Shiro-1-5-2-released-td7582136.html
*本文作者:tbag@斗象能力中心TCC,转载请注明来自FreeBuf.COM
Shiro权限绕过漏洞分析(CVE-2020-1957)相关推荐
- Shiro 权限绕过漏洞分析(CVE-2020-1957)
1## 前言 2020年3月23号,Shiro开发者Brian Demers在用户社区发表帖子,提醒shiro用户进行安全更新,本次更新进行了三个修复,其中就包括了对编号为CVE-2020-1957的 ...
- 众至科技:漏洞通告 | 微软10月发布多个安全漏洞;Apache Shiro权限绕过漏洞;Apache Commons存在代码执行漏洞
微软发布10月多个安全漏洞 1.漏洞概述 2022年10月11日,微软发布了10月安全更新,此次更新修复了包括2个0 day漏洞在内的84个安全漏洞(不包括10月3日修复的12个Microsoft ...
- shiro权限绕过漏洞
1.shiro权限绕过漏洞 1.1.漏洞成因分析 Apahce Shiro 由于处理身份验证请求时出错,存在"权限绕过漏洞"(漏洞编号:CVE-2020-11989),远程攻击者可 ...
- Apache Shiro权限绕过漏洞 (CVE-2020-11989) 挖掘分析和复现
聚焦源代码安全,网罗国内外最新资讯! 1.1 状态 完成漏洞挖掘条件分析.漏洞复现. 1.2 简介 Apache Shiro作为Java框架,可被用于身份认证.授权等任务. 整合Apache Shi ...
- CVE-2020-17510: Apache Shiro 权限绕过漏洞通告
原创 360CERT [三六零CERT](javascript:void(0)
- launchAnyWhere: Activity组件权限绕过漏洞解析
前言 今年3月份,知名反病毒软件公司卡巴斯基实验室发布了一份关于中国电商平台拼多多的调查报告,称该平台的安装程序中含有恶意代码.这一消息引起了广泛的关注和讨论,也引发了人们对于拼多多平台安全性的担忧 ...
- couchdb 垂直权限绕过漏洞(cve-2017-12635)
Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和 ...
- Discuz论坛附件下载权限绕过漏洞
近日,有网友在乌云上发布了一则Discuz论坛附件下载权限绕过漏洞,能够任意下载带有权限的附件并且无需扣除自身积分.目前Discuz正在处理中,但暂未放出漏洞补丁,有需要的朋友不妨趁漏洞修补之前到各论 ...
- 身份验证绕过漏洞分析
0x01 前言 最近Tenable 披露了Arcadyna 网络设备身份验证绕过漏洞,并且很多的厂商都采用产生漏洞的组件,由于Arcadyan 设备固件厂商并没有开源出来,在官网支持里面下载的文件是w ...
最新文章
- 自定义Visual Studio IntelliTrace 智能跟踪
- npm publish 发布一个 Angular 库的时候报错
- java语言中的浮点型数据分为,Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为float型和double型,其中dou...
- RTT的线程同步篇——互斥量
- MySQL Control Flow Functions(控制流)
- Linux权限相关及yum源的配置
- 微信公众号之生成带参数的二维码
- 电商网站项目总结(面向对象编程篇)
- Idea导入MySQL驱动包
- 施耐德PLC Unity Pro xl 软件使用三
- 烽火JAVA面试题目
- Python datetime日期相减
- 登录英雄联盟显示正在连接服务器,windows10系统登录英雄联盟出现连接不上服务器如何解决...
- 写引流和游戏脚本用什么语言和工具好?网上都有哪些脚本语言?
- 复习笔记1-计算机及其应用基础知识
- STM32——CAN通信实验
- LINUX下PHP扩展开发:第一个C扩展
- 双六(挑战程序设计竞赛)
- HEU 2010 France '98
- 布法罗计算机专业怎么样,2019上海软科世界一流学科排名计算机科学与工程专业排名纽约州立大学布法罗分校排名第76-100...
热门文章
- Oracle Primavera P6软件项目进度评估与偏差控制
- 加班,随笔(20090328)
- 根据工资计算应缴纳的党费
- XJTU_ 西安交通大学2020大学计算机作业-第八周
- 想在2020年竞争“出位”,品牌营销该怎么做?想在2020年竞争“出位”,品牌营销该怎么做?
- deepin 任务栏 不见 或者闪烁
- 2022上半年系统集成项目管理工程师真题及参考答案(广东卷)
- Zero-始于无终于无
- 2019年最新(最全)的jQuery面试问题和答案汇总(小白,菜鸟有用)大全
- 智能教育深度学习推荐系统---1.1.概述