OpenWebui 富文本提示词 远程命令注入漏洞 | CVE-2025-64495 复现&研究

0x0 背景介绍

Open WebUI 是一个自托管的人工智能平台,设计为完全离线运行。当启用以富文本形式插入提示功能时,将自定义提示插入聊天窗口的功能存在 DOM XSS 漏洞,任何拥有创建提示权限的用户都可以利用此漏洞植入有效载荷最终导致远程命令注入漏洞。

0x1 环境搭建(Ubuntu24+docker)

1.前置条件

  • 配置AI模型(模拟真实场景),有很多办法,我这里使用内置阿里云的KEY进行
  • 访问阿里云百炼进行密钥创建即可阿里云百炼-key

2.项目搭建

  • 创建docker-compose.yml文件
  • 注意OPENAI_API_KEYS更新为申请的key
yml 复制代码
version: "3"
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:v0.6.34
    container_name: open-webui-vuln
    restart: always
    ports:
      - "3000:8080"
    environment:
      - WEBUI_AUTH=False
      - OPENAI_API_BASE_URLS=https://dashscope.aliyuncs.com/compatible-mode/v1
      - OPENAI_API_KEYS=sk-xxx-你的key
    volumes:
      - open-webui-vuln:/app/backend/data

volumes:
  open-webui-vuln:
  • 启动环境
bash 复制代码
docker compose up -d

3.环境配置

  • 搭建完成后,大约2分钟就可以访问了,创建登录的账密即可
  • 登录后开启 以富文本的形式回填提示词

0x2 漏洞复现

手动复现步骤

  • 创建提示词

  • 创建新对话,输入/ 引用刚刚的提示词就直接弹窗了

Python检测

bash 复制代码
https://github.com/Kai-One001/cve-/blob/main/openui-shell-CVE-2025-64495.py
  • 特定反弹shell,因为 fetch('...') 含引号,被 marked 转义,导致语法错误。

PCAP检测

  • 示例是更新接口,其实响应都一样,可以看到恶意语句

  • 反弹也是同样的,通用检测都可以识别

0x3 漏洞原理分析

漏洞定位

  • 通过比对官方补丁变更记录(见下图),可快速锁定漏洞文件:
  • 漏洞文件:RichTextInput.svelte
  • 文件位置:src/lib/components/common/RichTextInput.svelte
js 复制代码
if (insertPromptAsRichText) {
    const htmlContent = marked
        .parse(text, {
            breaks: true,
            gfm: true
        })
        .trim();

    // Create a temporary div to parse HTML
    const tempDiv = document.createElement('div');
    tempDiv.innerHTML = htmlContent;
}
  • 简要说明:当用户启用了"以富文本形式插入提示时,将提示内容 text 渲染为 HTML 并插入编辑器。具体流程如下:

  • 使用 marked.parse() 将用户输入的 text(Markdown 格式)转换为 HTML 字符串;

  • 创建一个临时<div>元素,并通过 innerHTML 将生成的 HTML 注入其中,以便后续转换为 ProseMirror 节点;

  • Marked 库默认允许在 Markdown 中嵌入原始 HTML,这意味着攻击者可以在自定义提示的 content 字段中直接插入 HTML 标签这些标签会被 marked.parse() 原样保留,并通过 innerHTML 注入 DOM,从而触发 XSS 攻击。

修复对比

  • 在官方修复提交中,开发者移除了原有的直接使用 marked.parse() 生成HTML的方式,并引入了 DOMPurify 库对 HTML 内容进行安全净化:
js 复制代码
import DOMPurify from 'dompurify';

// ...

const htmlContent = DOMPurify.sanitize(
    marked.parse(text, {
        breaks: true,
        gfm: true
    }).trim()
);
  • 引入dompurify库,用于清理HTML中恶意数据,防止XSS
  • 保留了marked.parse()Markdown 渲染能力,确保富文本格式正常显示;
  • 外层包裹 DOMPurify.sanitize(),对生成的 HTML 字符串进行深度清理;
  • DOMPurify.sanitize(htmlString) 返回安全的 HTML。

0x4 修复建议

修复方案

  1. 升级到安全版本:公告链接github-open-webui-0.6.36
  2. 临时缓解措施:
    临时禁用富文本: 临时禁用以富文本形式插入提示功能,避免输入未过滤的HTML内容
    安全监控:WAF配置规则,检测针对 /prompt、/rich-text 等接口的异常HTML/JS注入行为

免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。

相关推荐
蒙奇D索大4 小时前
【算法】回溯算法精讲:从深度优先搜索到剪枝优化
经验分享·笔记·算法·深度优先·剪枝·改行学it
明天再做行么4 小时前
考研资源合集
经验分享
mtheliang1235 小时前
晶圆缺陷检测设备靠谱厂家、售后较好的企业
经验分享
草莓熊Lotso7 小时前
Git 本地操作入门:版本控制基础、跨平台部署与仓库核心流程
开发语言·人工智能·经验分享·git·后端·架构·gitee
草莓熊Lotso8 小时前
C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
java·运维·开发语言·c++·人工智能·经验分享·c++进阶
计算机小手18 小时前
快速搭建一个 GitHub 开源项目导航网站,提供便捷的信息抓取、智能摘要、分类管理功能
经验分享·docker·github·开源软件
程序员南音20 小时前
基于Springboot + vue3实现的渔具管理系统
经验分享
hygge9991 天前
JVM GC 垃圾回收体系完整讲解
java·开发语言·jvm·经验分享·面试
hygge9991 天前
MySQL 全体系深度解析(存储引擎、事务、日志、MVCC、锁、索引、执行计划、复制、调优)
数据库·经验分享·mysql·adb·面试