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安全, 多模态安全, 数据可视化, 漏洞分析, 自动化分析, 蓝队分析, 跨站脚本, 路径探测