aj2108/CVE-2026-9809
GitHub: aj2108/CVE-2026-9809
该项目记录并分析了 Mautic 7 中由于项目名称未做输出编码而导致的存储型 XSS 漏洞,涵盖根因、攻击链路与修复建议。
Stars: 0 | Forks: 0
# CVE-2026-9809
CVE-2026-9809 是一个存储型跨站脚本攻击漏洞,影响 Mautic 7(7.0.0 至 7.1.1 版本)。该缺陷存在于 Projects 组件中,项目名称在管理页面(如 campaigns、emails 和 forms)中作为标签和悬停弹出框显示时,没有进行适当的输出过滤。拥有创建或编辑项目权限的已认证用户可以将恶意的 HTML/JavaScript 存储在项目名称中。当管理员随后查看与该项目关联的实体并将鼠标悬停在其标签上时,恶意脚本就会在管理员的浏览器中执行。
受影响的软件
属性 值
产品 Mautic
受影响版本 7.0.0 – 7.1.1
修复版本 7.1.2
受影响组件 Projects(Tags & Popovers)
漏洞类型
类别:存储型跨站脚本攻击
CWE-79:网页生成时对输入的不当中和(跨站脚本攻击)
根本原因
应用程序存储了已认证用户提供的项目名称。随后,当在管理页面上渲染项目标签和弹出框内容时,存储的值在没有进行适当输出编码或过滤的情况下被插入到 HTML 中。
概念说明:
用户创建项目
│
▼
项目名称存储在数据库中
│
▼
管理员打开 Campaign / Email / Form
│
▼
渲染项目标签和弹出框
│
▼
项目名称在未过滤的情况下插入到 HTML 中
│
▼
浏览器执行嵌入的 JavaScript
浏览器没有将项目名称视为纯文本,而是将其解释为 HTML,从而允许嵌入的 JavaScript 执行。
攻击流程
攻击者
│
▼
创建带有恶意项目名称的项目
│
▼
Payload 存储在数据库中
│
▼
管理员查看 Campaign / Email / Form
│
▼
管理员将鼠标悬停在项目标签上
│
▼
弹出框渲染未过滤的项目名称
│
▼
浏览器执行 JavaScript
│
▼
使用管理员权限执行操作
攻击场景
假设一个已认证用户创建了一个名称包含 HTML 而非普通文本的项目。
该项目被成功保存,因为应用程序没有在输入时对项目名称进行过滤。
随后,管理员打开了与该项目关联的 campaign。当管理员将鼠标悬停在该项目的标签上时,应用程序会使用存储的项目名称生成一个弹出框。由于内容在插入页面时没有进行适当的输出编码,浏览器会将其解释为 HTML 而不是纯文本,从而导致嵌入的 JavaScript 在管理员的会话中执行。
影响
成功利用此漏洞可能会允许攻击者:
在管理员的浏览器中执行任意 JavaScript。
使用管理员的会话执行操作。
修改应用程序设置。
访问敏感的管理数据。
窃取管理员可访问的信息。
该漏洞主要影响机密性和完整性。
严重程度
指标 分数
CVSS v3.1 (CNA) 7.6(高)
NVD 尚未发布其自身的 CVSS 评估;当前分数由 Mautic CNA 提供。
概念性漏洞代码
注意:供应商尚未发布确切的漏洞源代码。以下内容用于说明漏洞模式。
// 从服务器检索到的项目名称
const projectName = response.project.name;
// 不安全:插入了用户控制的 HTML
popover.innerHTML = `
${projectName}
`;
为什么存在漏洞
innerHTML 会导致浏览器将存储的项目名称解析为 HTML。如果项目名称包含带有 JavaScript 事件处理程序的 HTML 元素,浏览器会在渲染弹出框时执行它们。
修正后的代码(概念性)
const tag = document.createElement("span");
tag.className = "project-tag";
// 安全:将输入视为纯文本
tag.textContent = response.project.name;
popover.replaceChildren(tag);
此修复方案有效的原因
使用 textContent 可确保将项目名称视为纯文本而不是 HTML。任何 HTML 特殊字符都将被显示出来,而不会被浏览器解释,从而防止嵌入脚本的执行。在需要渲染 HTML 的地方,开发人员应在插入之前使用维护良好的 HTML 过滤器对不受信任的内容进行清理。
标签:Web安全, 多模态安全, 数据可视化, 漏洞分析, 自动化分析, 蓝队分析, 跨站脚本, 路径探测