
Drupal 11.4.8 - Élevé - À distance - XSS - AttributeXss autorise toujours les attributs HTMX
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
Classe : XSS stocké Portée : Distante
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011 a fermé les attributs HTMX dans Xss::attributes(). Les attributs de lien et de menu passent par AttributeXss::sanitizeAttributes, et cette liste d'exclusion ne supprime toujours que style et on*.
Un éditeur de contenu capable de définir un champ Link (ou un lien de menu) peut stocker hx-on-click ou data-hx-on-click. Le profil Standard plus BigPipe charge core/htmx. Lorsqu'un administrateur ou tout autre visiteur ouvre ce nœud et clique sur le lien, HTMX exécute le JS stocké dans l'origine du site.
| ID | pas encore de CVE |
| Classe | XSS stocké (attributs d'événement HTMX) |
| Portée | Distante (champ Link / rédacteur de menu authentifié ; la victime consulte et clique) |
| CWE | CWE-79 |
| CVSS | Élevé : 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Produit | Drupal core |
| Affecté | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Auth | utilisateur authentifié capable d'écrire un champ Link (ou un lien de menu). La victime consulte la page et clique. |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Rédacteur : un éditeur de contenu capable de définir options.attributes d'un lien (champ Link, lien de menu, JSON:API). Victime : toute personne dont la page charge HTMX (Standard + BigPipe charge core/htmx), y compris un administrateur du site qui clique sur le lien.
| Privilège | Méthode / chemin | Type | Prouvé en lab ou déduit |
|---|---|---|---|
| Persister des attributs d'événement HTMX sur un lien | POST /jsonapi/node/article avec field_link.options.attributes.hx-on-click et data-hx-on-click | Intégrité du champ stocké | Prouvé en lab. JSON:API 201, les attributs stockés contiennent toujours hx-on-click |
Imprimer ces attributs sur le <a> du nœud | LinkFormatter -> AttributeXss::sanitizeAttributes | Intégrité du HTML | Prouvé en lab. GET /node/1 le HTML contient hx-on-click et le marqueur window['DRUPAL-HTMX-ATTR-WITNESS']=1 |
| Exécuter ce JS dans l'origine de la victime lors du clic | HTMX lie hx-on-* | Intégrité de la session de la victime | Déduit de HTMX + le chargement de core/htmx par la page. Le lab n'a pas simulé de clic navigateur |
| Agir en tant que visiteur (cookie de session, clics dans l'interface d'admin) | Même XSS stocké | Intégrité de la session de la victime | Déduit. Le lab s'arrête à l'attribut restant dans le HTML |
Négatif : Xss::filter | Xss::filter('<a ... hx-on-click=...>') | Fermé | Prouvé fermé en lab. xss_keeps_hx=False |
| Écriture non authentifiée du lien | JSON:API sans session | Fermé | Le lab s'est d'abord connecté en uid 1. Un inconnu sans compte ne peut pas définir le champ |
| RCE PHP / LPE | n/a | Fermé | Ce reliquat est du JS navigateur, pas du PHP côté serveur |
Même reliquat de version : Move Block sibling markup.
J'ai épinglé drupal/drupal 11.4.8 après SA-CORE-2026-011. Cinq recherches : XSS/HTMX, fichier/MIME/oEmbed, JSON:API/unserialize/SQLi, auth/CSRF/Host, REST/media/Views. L'accès JSON:API, les clés IN d'EntityQuery (SA-004), le POI de champ sérialisé (SA-005) et le Host de rebuild.php (SA-007) restent corrigés. La liste d'exclusion HTMX n'a été appliquée que dans 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
);
Reliquat dans AttributeXss.php :
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
Les appelants incluent LinkFormatter.php et MenuLinkContent::getUrlObject().
Fausses pistes déjà consignées : traiter Xss::filter comme le reliquat (c'est le contrôle) ; écriture JSON:API non authentifiée ; RCE PHP ; un reverse shell. Du théâtre. L'oracle est l'attribut restant dans le HTML du nœud plus core/htmx chargé.
python3 drupal-htmx-attr-Abraxas-Labs.py
ou
cd lab
./run.sh
Cible uniquement http://127.0.0.1:19480. drupal:11.4.8-apache en direct, profil Standard, écriture JSON:API activée pour le lab. Projet Compose 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
Copier la liste de refus hx / data-hx / srcdoc dans AttributeXss. L'intégrer dans Xss comme le dit déjà le docblock de la classe.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.