
CVE-2026-9811 is a Stored Cross-Site Scripting (Stored XSS) vulnerability affecting Mautic 7 (versions 7.0.0 through 7.1.1).
CVE-2026-9811 ist eine Schwachstelle vom Typ Stored Cross-Site Scripting (Stored XSS), die Mautic 7 (Versionen 7.0.0 bis 7.1.1) betrifft. Die Schwachstelle befindet sich in der Komponente Project Selector, in der Projektnamen, die über eine AJAX-Anfrage zurückgegeben werden, ohne ordnungsgemäße Ausgabekodierung oder Bereinigung in die Seite eingefügt werden. Ein authentifizierter Benutzer mit der Berechtigung, Projekte zu erstellen, kann eine schädliche JavaScript-Nutzlast in einem Projektnamen speichern. Wenn später ein anderer Administrator einen Entitätseditor öffnet, der den Project Selector enthält, wird das schädliche Skript in dessen Browser ausgeführt.
Eigenschaft Wert Produkt Mautic Betroffene Versionen 7.0.0 – 7.1.1 Behobene Version 7.1.2 Komponente Project Selector Schwachstellentyp Stored Cross-Site Scripting (XSS)
Die Anwendung speichert Projektnamen, die von authentifizierten Benutzern bereitgestellt werden, und ruft sie später über einen AJAX-Endpunkt ab. Beim Rendern des Project Selector fügt die Anwendung diese Werte direkt als HTML-Optionselemente in das DOM ein, ohne den Inhalt zu maskieren oder zu bereinigen.
Konzeptionell:
User creates project
│
▼
Project name stored in database
│
▼
AJAX returns project name
│
▼
Inserted into DOM without sanitization
│
▼
Browser executes embedded JavaScript
Da die Anwendung gespeicherten Daten vertraut, wird schädliches JavaScript immer dann ausgeführt, wenn ein anderer privilegierter Benutzer die verwundbare Seite lädt.
Attacker
│
▼
Creates a project with a malicious JavaScript payload as its name
│
▼
Payload is stored in the database
│
▼
Administrator opens an entity editor
│
▼
AJAX request retrieves project names
│
▼
Application inserts project name into the DOM without encoding
│
▼
Browser executes the malicious script
│
▼
Attacker gains actions within the administrator's session
Ein Angreifer mit der Berechtigung, Projekte zu erstellen, erstellt ein Projekt, dessen Name eine schädliche JavaScript-Nutzlast enthält.
Später bearbeitet ein Administrator eine andere Entität, die den Project Selector enthält. Der Selektor lädt die Projektnamen per AJAX und fügt sie direkt in die Seite ein. Da der Projektname nicht bereinigt wird, führt der Browser das eingebettete Skript mit den Rechten des Administrators aus.
Angenommen, Mautic enthält ein Formular wie dieses:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=Marketing Campaign
description=Email Campaign
Das Projekt wird gespeichert als:
Marketing Campaign
Schritt 2: Der Angreifer erstellt ein Projekt
Statt eines normalen Namens gibt der Angreifer HTML ein, das ein harmloses JavaScript-Ereignis enthält:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
description=Test
Die Datenbank speichert nun exakt diese Zeichenfolge.
Schritt 3: AJAX gibt den gespeicherten Wert zurück
Später öffnet ein Administrator eine Seite, die Projekte lädt.
AJAX-Antwort:
{
"id": 7,
"projectName": ""
}
Schritt 4: Verwundbares JavaScript
Angenommen, die Anwendung führt Folgendes aus:
const project = response.projectName;
document.getElementById("projects").innerHTML +=
`<option>${project}</option>`;
Der Browser sieht:
<option>
<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
</option>
Da die Anwendung die Zeichenfolge als HTML und nicht als Text eingefügt hat, analysiert der Browser sie als tatsächliches -Element. Das Bild kann nicht geladen werden (src="x"), wodurch der onerror-Handler ausgeführt wird.
Eine erfolgreiche Ausnutzung kann es einem Angreifer ermöglichen:
| Metrik | Wert |
|---|---|
| CVSS v3.1 (CNA) | 5.4 (Medium) |
Das NVD hat für diese CVE noch keine eigene CVSS-Bewertung veröffentlicht.
Hinweis: Der Hersteller hat den genauen verwundbaren Quellcode nicht veröffentlicht. Das folgende Beispiel veranschaulicht lediglich das Schwachstellenmuster.
// Data returned from AJAX
const project = response.projectName;
// Unsafe: inserted directly into the DOM
document.getElementById("projectSelector").innerHTML +=
`<option>${project}</option>`;
Der Projektname stammt aus einer Benutzereingabe, wird jedoch ohne HTML-Kodierung in die Seite eingefügt. Enthält der gespeicherte Wert HTML oder JavaScript, interpretiert der Browser ihn als ausführbaren Inhalt und nicht als reinen Text.
const option = document.createElement("option");
// Safe: assign as text, not HTML
option.textContent = response.projectName;
document.getElementById("projectSelector").appendChild(option);
Oder: Falls die HTML-Ausgabe unvermeidbar ist, stellen Sie sicher, dass die Ausgabe vor dem Einfügen ordnungsgemäß kodiert wird.
Die Verwendung von textContent (oder einer gleichwertigen sicheren API) stellt sicher, dass Sonderzeichen als reiner Text und nicht als ausführbares HTML oder JavaScript behandelt werden. Selbst wenn ein bösartiger Projektname in der Datenbank gespeichert ist, wird er wörtlich angezeigt, statt ausgeführt zu werden.