
CVE-2026-9809 is a Stored Cross-Site Scripting (Stored XSS) vulnerability affecting Mautic 7 (versions 7.0.0 through 7.1.1).
CVE-2026-9809 是一个影响 Mautic 7(7.0.0 至 7.1.1 版本)的存储型跨站脚本(Stored XSS)漏洞。该缺陷存在于 Projects 组件中,项目名称会在管理页面(如营销活动、电子邮件和表单)上以标签和悬停弹出层的形式显示,但未经过正确的输出清理。拥有创建或编辑项目权限的已认证用户可以在项目名称中存储恶意 HTML/JavaScript。当管理员随后查看与该项目关联的实体并悬停在其标签上时,恶意脚本会在管理员的浏览器中执行。
| 属性 | 值 |
|---|---|
| 产品 | Mautic |
| 受影响版本 | 7.0.0 – 7.1.1 |
| 修复版本 | 7.1.2 |
| 受影响组件 | Projects(标签与弹出层) |
应用程序存储由已认证用户提供的项目名称。之后,当项目标签和弹出层内容在管理页面上渲染时,存储的值会被插入到 HTML 中,而没有经过适当的输出编码或清理。
概念上:
User creates project
│
▼
Project name stored in database
│
▼
Administrator opens Campaign / Email / Form
│
▼
Project tag & popover rendered
│
▼
Project name inserted into HTML without sanitization
│
▼
Browser executes embedded JavaScript
浏览器不会将项目名称视为纯文本,而是将其解释为 HTML,从而允许嵌入的 JavaScript 执行。
Attacker
│
▼
Creates a project with a malicious project name
│
▼
Payload stored in database
│
▼
Administrator views Campaign / Email / Form
│
▼
Administrator hovers over the project tag
│
▼
Popover renders unsanitized project name
│
▼
Browser executes JavaScript
│
▼
Actions performed with administrator's privileges
假设一个已认证用户创建了一个名称包含 HTML 而非普通文本的项目。
由于应用程序在输入时不会清理项目名称,因此项目会成功保存。
之后,管理员打开与该项目关联的营销活动。当管理员将鼠标悬停在项目标签上时,应用程序会使用存储的项目名称生成弹出层。由于内容是在没有正确输出编码的情况下插入页面的,浏览器会将其解释为 HTML 而非纯文本,从而导致嵌入的 JavaScript 在管理员的会话中执行。
成功利用该漏洞可能允许攻击者:
该漏洞主要影响机密性和完整性。
| 指标 | 评分 |
|---|---|
| CVSS v3.1(CNA) | 7.6(高危) |
NVD 尚未发布其自身的 CVSS 评估;当前评分由 Mautic CNA 提供。
注意:供应商尚未公布确切的漏洞源代码。以下内容说明了该漏洞的模式。
// Project name retrieved from the server
const projectName = response.project.name;
// Unsafe: inserts user-controlled HTML
popover.innerHTML = `
<span class="project-tag">
${projectName}
</span>
`;
innerHTML 会导致浏览器将存储的项目名称解析为 HTML。如果项目名称包含带有 JavaScript 事件处理程序的 HTML 元素,浏览器在渲染弹出层时会执行这些事件处理程序。
const tag = document.createElement("span");
tag.className = "project-tag";
// Safe: treat input as plain text
tag.textContent = response.project.name;
popover.replaceChildren(tag);
使用 textContent 可确保项目名称被当作字面文本而非 HTML 处理。任何 HTML 特殊字符都会被显示出来,而不会被浏览器解释,从而阻止嵌入脚本的执行。在需要渲染 HTML 的情况下,开发人员应在插入之前使用维护良好的 HTML 清理器对不受信任的内容进行清理。