
Drupal 11.4.8 - Alta - Remoto - XSS - AttributeXss consente ancora attributi HTMX
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
Classe: XSS memorizzato Portata: Remota
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011 ha chiuso gli attributi HTMX in Xss::attributes(). Gli attributi dei link e dei menu passano attraverso AttributeXss::sanitizeAttributes, e quella skip list elimina ancora solo style e on*.
Un editor di contenuti che può impostare un campo Link (o un menu link) può memorizzare hx-on-click o data-hx-on-click. Standard più BigPipe carica core/htmx. Quando un amministratore o qualsiasi altro visualizzatore apre quel nodo e clicca sul link, HTMX esegue il JS memorizzato nell'origine del sito.
| ID | nessuna CVE al momento |
| Classe | XSS memorizzato (attributi evento HTMX) |
| Portata | Remota (Link field / scrittore di menu autenticato; la vittima visualizza e clicca) |
| CWE | CWE-79 |
| CVSS | Alto: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Prodotto | Drupal core |
| Affetto | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Auth | utente autenticato che può scrivere un Link field (o menu link). La vittima visualizza la pagina e clicca. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Scrittore: un editor di contenuti che può impostare options.attributes del link (Link field, menu link, JSON:API). Vittima: chiunque la cui pagina carica HTMX (Standard + BigPipe carica core/htmx), incluso un amministratore del sito che clicca sul link.
| Privilegio | Metodo / percorso | Tipo | Provato in lab o dedotto |
|---|---|---|---|
| Persistere attributi evento HTMX su un link | POST /jsonapi/node/article con field_link.options.attributes.hx-on-click e data-hx-on-click | Integrità del campo memorizzato | Provato in lab. JSON:API 201, gli attributi memorizzati contengono ancora hx-on-click |
Stampare quegli attributi sul <a> del nodo | LinkFormatter -> AttributeXss::sanitizeAttributes | Integrità dell'HTML | Provato in lab. GET /node/1 l'HTML contiene hx-on-click e il marker window['DRUPAL-HTMX-ATTR-WITNESS']=1 |
| Eseguire quel JS nell'origine della vittima quando clicca | HTMX associa hx-on-* | Integrità della sessione della vittima | Dedotto da HTMX + la pagina che carica core/htmx. Il lab non ha simulato un click del browser |
| Agire come il visualizzatore (cookie di sessione, click nell'interfaccia admin) | Stesso XSS memorizzato | Integrità della sessione della vittima | Dedotto. Il lab si ferma all'attributo che rimane nell'HTML |
Negativo: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | Chiuso | Provato in lab chiuso. xss_keeps_hx=False |
| Scrittura non autenticata del link | JSON:API senza sessione | Chiuso | Il lab ha effettuato il login come uid 1 prima. Un estraneo senza account non può impostare il campo |
| PHP RCE / LPE | n/a | Chiuso | Questo residuo è JS del browser, non PHP sul server |
Stesso residuo del pin: Move Block sibling markup.
Ho fissato drupal/drupal 11.4.8 dopo SA-CORE-2026-011. Cinque ricerche: XSS/HTMX, file/MIME/oEmbed, JSON:API/unserialize/SQLi, auth/CSRF/Host, REST/media/Views. L'accesso JSON:API, le chiavi IN di EntityQuery (SA-004), il POI dei campi serializzati (SA-005) e l'Host di rebuild.php (SA-007) restano corretti. La skip list HTMX è arrivata solo 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
);
Residuo in AttributeXss.php:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
I chiamanti includono LinkFormatter.php e MenuLinkContent::getUrlObject().
Vicoli ciechi già registrati: trattare Xss::filter come il residuo (è il controllo); scrittura JSON:API non autenticata; PHP RCE; una reverse shell. Teatro. L'oracolo è l'attributo che rimane nell'HTML del nodo più core/htmx caricato.
python3 drupal-htmx-attr-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19480. drupal:11.4.8-apache live, profilo Standard, scrittura JSON:API abilitata per il lab. Progetto 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
Copiare la denylist hx / data-hx / srcdoc in AttributeXss. Incorporarla in Xss come già dice il docblock della classe.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.