ruoyi4.8后台RCE分析
字数 1258 2025-08-29 22:41:10

RuoYi 4.8后台RCE漏洞分析与利用教学文档

漏洞概述

RuoYi 4.8后台存在远程代码执行(RCE)漏洞,通过组合利用计划任务功能和文件上传功能,可实现任意代码执行。该漏洞利用需要知道profile目录路径。

环境搭建

  1. 下载RuoYi 4.8版本
  2. 导入数据库
  3. 修改配置文件:
    • 修改application-druid.yml中的数据库账号密码
    • 修改application.yml中的文件路径及log存放路径
  4. 启动系统

漏洞分析

计划任务功能分析

  1. 路由定位:通过提交数据包锁定后端路由
  2. 安全校验
    • 检查是否包含rmildaphttp等关键词,禁止对这些协议进行调用
    • 检查是否使用了黑名单中的类
  3. 白名单校验
    • 提取调用的类名,判断是否包含白名单字符串com.ruoyi.quartz.task
    • 使用正则匹配,该字符串可以出现在任意位置,存在绕过可能
  4. 任务执行流程
    • 启动任务时获取调用的类名、方法名和参数值
    • 方法参数处理:只允许字符串、布尔、长整、浮点、整型,无法传递类对象
    • 实例化该类并反射调用其方法(方法必须为public修饰)

利用条件

  1. 使用的类不在黑名单中
  2. 类名包含com.ruoyi.quartz.task字符串
  3. 不能使用rmildaphttp等协议

文件上传功能分析

  1. 系统存在文件上传点
  2. 可以上传文件名包含com.ruoyi.quartz.task字符串的文件

漏洞利用步骤

1. 利用JNI机制

Java中存在JNI(Java Native Interface)机制,可以通过加载外部链接库执行其中的构造函数:

  • 使用com.sun.glass.utils.NativeLibLoaderloadLibrary方法(public修饰)加载链接库
  • 注意:会自动添加.dylib等后缀(不同系统后缀不同)
  • 需要考虑系统架构兼容性

2. 构造并上传恶意链接库

  1. 编译恶意链接库文件
  2. 上传该文件到系统

3. 修改文件名

使用RenameUtil类方法修改文件名:

  • 将上传的文件名修改为包含com.ruoyi.quartz.task字符串的名称

4. 启动计划任务

  1. 创建计划任务调用NativeLibLoader.loadLibrary方法
  2. 指定加载修改后的恶意链接库文件
  3. 触发RCE执行

关键点总结

  1. 白名单绕过:利用正则匹配特性,确保类名中包含com.ruoyi.quartz.task字符串
  2. 文件上传:上传恶意链接库文件是攻击的关键步骤
  3. JNI利用:通过加载本地库实现代码执行,绕过Java安全限制
  4. 文件名修改:使用系统提供的工具类修改文件名以满足白名单要求
  5. 系统兼容性:注意不同操作系统下的库文件后缀和架构差异

防御建议

  1. 严格限制计划任务可调用的类和方法
  2. 加强文件上传功能的安全检查
  3. 更新到最新版本的RuoYi系统
  4. 实施最小权限原则,限制后台功能的访问权限
  5. 监控系统日志,特别是计划任务和文件操作相关的日志
RuoYi 4.8后台RCE漏洞分析与利用教学文档 漏洞概述 RuoYi 4.8后台存在远程代码执行(RCE)漏洞,通过组合利用计划任务功能和文件上传功能,可实现任意代码执行。该漏洞利用需要知道profile目录路径。 环境搭建 下载RuoYi 4.8版本 导入数据库 修改配置文件: 修改 application-druid.yml 中的数据库账号密码 修改 application.yml 中的文件路径及log存放路径 启动系统 漏洞分析 计划任务功能分析 路由定位 :通过提交数据包锁定后端路由 安全校验 : 检查是否包含 rmi 、 ldap 、 http 等关键词,禁止对这些协议进行调用 检查是否使用了黑名单中的类 白名单校验 : 提取调用的类名,判断是否包含白名单字符串 com.ruoyi.quartz.task 使用正则匹配,该字符串可以出现在任意位置,存在绕过可能 任务执行流程 : 启动任务时获取调用的类名、方法名和参数值 方法参数处理:只允许字符串、布尔、长整、浮点、整型,无法传递类对象 实例化该类并反射调用其方法(方法必须为public修饰) 利用条件 使用的类不在黑名单中 类名包含 com.ruoyi.quartz.task 字符串 不能使用 rmi 、 ldap 、 http 等协议 文件上传功能分析 系统存在文件上传点 可以上传文件名包含 com.ruoyi.quartz.task 字符串的文件 漏洞利用步骤 1. 利用JNI机制 Java中存在JNI(Java Native Interface)机制,可以通过加载外部链接库执行其中的构造函数: 使用 com.sun.glass.utils.NativeLibLoader 的 loadLibrary 方法(public修饰)加载链接库 注意:会自动添加 .dylib 等后缀(不同系统后缀不同) 需要考虑系统架构兼容性 2. 构造并上传恶意链接库 编译恶意链接库文件 上传该文件到系统 3. 修改文件名 使用 RenameUtil 类方法修改文件名: 将上传的文件名修改为包含 com.ruoyi.quartz.task 字符串的名称 4. 启动计划任务 创建计划任务调用 NativeLibLoader.loadLibrary 方法 指定加载修改后的恶意链接库文件 触发RCE执行 关键点总结 白名单绕过 :利用正则匹配特性,确保类名中包含 com.ruoyi.quartz.task 字符串 文件上传 :上传恶意链接库文件是攻击的关键步骤 JNI利用 :通过加载本地库实现代码执行,绕过Java安全限制 文件名修改 :使用系统提供的工具类修改文件名以满足白名单要求 系统兼容性 :注意不同操作系统下的库文件后缀和架构差异 防御建议 严格限制计划任务可调用的类和方法 加强文件上传功能的安全检查 更新到最新版本的RuoYi系统 实施最小权限原则,限制后台功能的访问权限 监控系统日志,特别是计划任务和文件操作相关的日志