
Drupal 11.4.8 – Hoch – Remote – XSS – AttributeXss erlaubt weiterhin HTMX-Attribute
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
Klasse: Stored XSS Reichweite: Remote
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011 hat HTMX-Attribute in Xss::attributes() geschlossen. Link- und Menü-Attribute laufen durch AttributeXss::sanitizeAttributes, und diese Skip-Liste entfernt weiterhin nur style und on*.
Ein Content-Editor, der ein Link-Feld (oder einen Menü-Link) setzen kann, kann hx-on-click oder data-hx-on-click speichern. Standard plus BigPipe lädt core/htmx. Wenn ein Admin oder ein anderer Betrachter diesen Node öffnet und auf den Link klickt, führt HTMX das gespeicherte JS im Ursprung der Website aus.
| ID | noch keine CVE |
| Klasse | Stored XSS (HTMX-Event-Attribute) |
| Reichweite | Remote (authentifizierter Link-Feld-/Menü-Schreiber; Opfer betrachtet und klickt) |
| CWE | CWE-79 |
| CVSS | High: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Produkt | Drupal core |
| Betroffen | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Auth | authentifizierter Benutzer, der ein Link-Feld (oder Menü-Link) schreiben kann. Opfer betrachtet die Seite und klickt. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Schreiber: ein Content-Editor, der Link-options.attributes setzen kann (Link-Feld, Menü-Link, JSON:API). Opfer: jeder, dessen Seite HTMX lädt (Standard + BigPipe lädt core/htmx), einschließlich eines Site-Admins, der auf den Link klickt.
| Privileg | Methode / Pfad | Art | Lab-bewiesen oder abgeleitet |
|---|---|---|---|
| HTMX-Event-Attribute auf einem Link persistieren | POST /jsonapi/node/article mit field_link.options.attributes.hx-on-click und data-hx-on-click | Integrität des gespeicherten Felds | Lab-bewiesen. JSON:API 201, gespeicherte Attribute enthalten weiterhin hx-on-click |
Diese Attribute im Node-<a> ausgeben | LinkFormatter -> AttributeXss::sanitizeAttributes | Integrität des HTML | Lab-bewiesen. GET /node/1 HTML enthält hx-on-click und den Marker window['DRUPAL-HTMX-ATTR-WITNESS']=1 |
| Dieses JS im Ursprung des Opfers ausführen, wenn es klickt | HTMX bindet hx-on-* | Integrität der Opfer-Session | Abgeleitet aus HTMX + der Seite, die core/htmx lädt. Lab hat keinen Browser-Klick ausgeführt |
| Als Betrachter agieren (Session-Cookie, Admin-UI-Klicks) | Dasselbe Stored XSS | Integrität der Opfer-Session | Abgeleitet. Lab endet beim Attribut, das im HTML verbleibt |
Negativ: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | Geschlossen | Lab-bewiesen geschlossen. xss_keeps_hx=False |
| Unauthentifiziertes Schreiben des Links | JSON:API ohne Session | Geschlossen | Lab war zuerst als uid 1 angemeldet. Ein Fremder ohne Konto kann das Feld nicht setzen |
| PHP RCE / LPE | n/a | Geschlossen | Dieser Rest ist Browser-JS, nicht PHP auf dem Server |
Gleicher Pin-Rest: Move Block sibling markup.
Ich habe drupal/drupal 11.4.8 nach SA-CORE-2026-011 gepinnt. Fünf Suchen: XSS/HTMX, Datei/MIME/oEmbed, JSON:API/unserialize/SQLi, Auth/CSRF/Host, REST/Media/Views. JSON:API-Zugriff, EntityQuery-IN-Keys (SA-004), serialized-field POI (SA-005) und rebuild.php Host (SA-007) bleiben gepatcht. Die HTMX-Skip-Liste landete nur in Xss.php.
$skip = (
in_array($attribute_name, ['style', 'srcdoc']) ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, 'data-hx') ||
str_starts_with($attribute_name, 'hx') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
AttributeXss.php-Rest:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
Aufrufer umfassen LinkFormatter.php und MenuLinkContent::getUrlObject().
Bereits dokumentierte Irrwege: Xss::filter als Rest zu behandeln (es ist die Kontrolle); unauth JSON:API-Schreibzugriff; PHP RCE; eine Reverse Shell. Theater. Das Orakel ist das Attribut, das im Node-HTML verbleibt, plus geladenes core/htmx.
python3 drupal-htmx-attr-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19480. Live drupal:11.4.8-apache, Standard-Profil, JSON:API-Schreibzugriff für das Lab aktiviert. Compose-Projekt drupal-htmx-attr.
SUCCESS drupal-htmx-attr how=live write=jsonapi nid=1 hx-on-click=kept jsonapi-stored=1 xss-filter=stripped htmx=loaded marker=1 version=11.4.8 DRUPAL-HTMX-ATTR-WITNESS
Kopiere die hx / data-hx / srcdoc-Denylist in AttributeXss. Führe sie in Xss zusammen, wie es der Klassen-Docblock bereits sagt.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.