当前位置: 首页 > news >正文

Shiro-认证绕过漏洞(CVE-2020-1957)

文章目录

  • 漏洞原理
  • 源码分析与复现
  • 影响版本

漏洞原理

核心点就是shiro和spring对uri进行配合匹配的时候有缺陷导致的,shiro中很轻易就能绕过,其次spring中对;分号好像情有独钟,被大牛们发现后也就一下子绕过了。
主流payload:/xxx/..;/admin/
具体后台路由不一定是admin,得看情况而定,但是下面的分析都由admin为后台路由进行分析。

源码分析与复现

环境说明:后台路由为admin
下面我用vulhub开启对应的靶场
在这里插入图片描述
接着访问uri:/xxx/..;/admin/
xxx是随便填,而最重要的认证绕过的是..;能够让你走到admin后台,复现成功了。
在这里插入图片描述
在该漏洞中,认证过程需要走两个框架,一个是shiro另一个是spring,uri第一个进入的是shiro接着判断完了才交给spring,这个交给spring的时候也出了问题,下面开始讲解过程。
1.shiro中可能会有这样的过滤器对uri进行匹配,分支判断是否需要认证
在这里插入图片描述
这里是配置map.put会出现问题,所以是否出现认证绕过还得看匹配的规则写的如何,这不重要,我们约定配置为:/admin/** 然后该规则下需要authc,表示需要进行身份认证,这看起来很正常,admin路由确实要求身份认证。

2.接着我们下面开始分析当请求http://xxx.xxxx.com/xxx/…;/admin/在后台是如何走的:
首先经过shiro处理,直接看最重要的部分,shiro对;分号的处理。
作用:直接匹配59,即;的ascii码值,发现有分号就返回分号前的字段,否则返回整个uri。
那么这里就拿到uri:xxx/..
在这里插入图片描述

3.接下去的函数都是规范化,比如//处理成/这些就不说了,直接看最后给到拦截器判断的requestURI值为/xx/..,pathMatches就会根据拦截器判断是否为/admin/**,那么很显然不是,现在就相当于你bypass掉了shiro的认证。
在这里插入图片描述
4.shiro认证完了就到spring对uri进行认证了
如何拿到uri的这部分就跳过了,交到spring的uri是完整的,即/xxx/..;/admin/所以说这就是交给spring的时候没有同步好uri的处理结果,那么在spring中主要分析他怎么处理;的即可
最主要跟进removeSemicolonContentInternal(requestUri)方法,他的作用就是:移除uri中/与/之间的;分号以及;分号后面的内容
根据这句话可以得知最后的uri应该是:/xxx/../admin/ == /admin/
../ 为回到上一层目录,就到admin了,认证绕过结束,收工。

影响版本

Shiro < 1.5.3
SpringBoot 的版本 < 2.3


参考文章:
https://www.freebuf.com/articles/web/362350.html
https://blog.spoock.com/2020/05/09/cve-2020-1957/
https://cn-sec.com/archives/1312489.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 排序----数据结构
  • Lanterns (dp 紫 线段树 二分 维护dp)
  • Java 入门指南:Java 8 新特性 —— Stream 流
  • golang操作mysql利器-gorm
  • 大学生必看!60万人在用的GPT4o大学数学智能体有多牛
  • 大数据新视界 --大数据大厂之 Node.js 与大数据交互:实现高效数据处理
  • Codeforces Round 973 (Div. 2) - D题
  • 数据库事务中的四大问题:脏读、脏写、不可重复读与幻读详解
  • 【HTTPS】对称加密和非对称加密
  • RocketMQ控制台手动新增主题,报错:clusterName or brokerName can not be all blank
  • 【设计模式-备忘录】
  • Redisson 总结
  • 目前主流语言比较
  • Alluxio EnterpriseAI on K8s 部署教程
  • 探索 Python 的火焰:Fire 库的神秘力量
  • C++类中的特殊成员函数
  • Consul Config 使用Git做版本控制的实现
  • Git初体验
  • Javascript弹出层-初探
  • JavaScript新鲜事·第5期
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • oldjun 检测网站的经验
  • 机器学习 vs. 深度学习
  • 巧用 TypeScript (一)
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 突破自己的技术思维
  • 我的zsh配置, 2019最新方案
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​批处理文件中的errorlevel用法
  • # centos7下FFmpeg环境部署记录
  • #宝哥教你#查看jquery绑定的事件函数
  • #数据结构 笔记一
  • #微信小程序:微信小程序常见的配置传值
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (06)Hive——正则表达式
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2)nginx 安装、启停
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (SERIES12)DM性能优化
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .htaccess配置常用技巧
  • .net core 6 redis操作类
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET面试题(二)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • ;号自动换行
  • @Autowired和@Resource装配
  • @取消转义