
Il plugin Gravity Forms per WordPress (testato fino alla versione 2.9.28) è vulnerabile a cross-site scripting (XSS) riflesso non autenticato tramite il parametro `form_ids` nell'azione AJAX `gform_get_config`.
form_ids di gform_get_config| Campo | Valore |
|---|---|
| Software Interessato | Gravity Forms (Plugin WordPress) |
| Vendor | Rocketgenius, Inc. |
| Tipo di Vulnerabilità | CWE-79: Neutralizzazione Impropria dell'Input Durante la Generazione di Pagine Web (Cross-Site Scripting Riflesso) |
| Catena CWE | CWE-20 → CWE-116 → CWE-838 → CWE-79 (vedi Analisi CWE di seguito) |
| Versioni Interessate | Confermata sulla 2.9.28 (ultima al momento della scoperta); le versioni precedenti sono probabilmente interessate |
| Versione Correttiva | 2.9.30.1 (hotfix) |
| Punteggio CVSS 3.1 | 6.1 (Medio) |
| Vettore CVSS 3.1 | AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N |
| Autenticazione Richiesta | Nessuna (Non Autenticato) |
| Interazione dell'Utente | Richiesta (la vittima deve visitare una pagina controllata dall'attaccante o fare clic su un link appositamente creato) |
| Scoperta di | Anthony Cihan — Obviam |
| Data della Scoperta | 2026-03-04 |
| Data della Divulgazione | 2026-03-18 |
| ID CVE | CVE-2026-4406 |
Il plugin Gravity Forms per WordPress (testato fino alla versione 2.9.28) è vulnerabile a cross-site scripting (XSS) riflesso non autenticato tramite il parametro form_ids nell'azione AJAX gform_get_config. La vulnerabilità esiste perché i valori form_ids forniti dall'utente vengono riflessi testualmente nella risposta HTTP del server senza alcuna sanificazione, codifica o escaping dell'output. La risposta viene servita con un'intestazione Content-Type: text/html; charset=UTF-8, che induce il browser a interpretare e renderizzare il contenuto riflesso come HTML, inclusi eventuali elementi script iniettati.
Un attaccante non autenticato può sfruttare questa vulnerabilità per eseguire JavaScript arbitrario nel contesto dell'origine del sito WordPress di destinazione. Poiché l'azione gform_get_config richiede un config_nonce valido, e questo nonce è incorporato pubblicamente nel sorgente HTML di ogni pagina che carica un modulo Gravity Forms, un attaccante può ottenere facilmente un nonce valido richiedendo qualsiasi pagina pubblica del sito di destinazione prima di costruire la richiesta di exploit.
Uno sfruttamento riuscito consente a un attaccante di rubare i cookie di sessione, eseguire azioni per conto di utenti autenticati (inclusi gli amministratori di WordPress), reindirizzare gli utenti verso siti dannosi, deturpare il contenuto delle pagine o stabilire un accesso persistente tramite la creazione di account amministrativi.
POST /wp-admin/admin-ajax.php
### Azione Vulnerabile```
gform_get_config
Il parametro POST args accetta un oggetto JSON contenente un array form_ids. I valori in questo array vengono utilizzati come chiavi di oggetto nella struttura della risposta JSON senza sanificazione:```json
{"form_ids":["ATTACKER_CONTROLLED_VALUE"]}
### Comportamento della risposta
Il server elabora i valori di `form_ids` e li riflette come chiavi JSON all'interno del corpo della risposta. La risposta è racchiusa in marcatori di commento HTML e servita come `text/html`:```
Content-Type: text/html; charset=UTF-8
<!-- gf:json_start -->{"success":true,"data":{"common":{"form":{"pagination":{"ATTACKER_CONTROLLED_VALUE":null}}}}}<!-- gf:json_end -->
form_ids non vengono validati come interi, sanitizzati o filtrati. Il server accetta contenuto stringa arbitrario, inclusi tag HTML e gestori di eventi.form_ids vengono riflessi nel corpo della risposta senza codifica delle entità HTML. Caratteri come <, >, " e ' passano senza modifiche.Content-Type: text/html; charset=UTF-8, che istruisce il browser a interpretare il corpo della risposta come HTML. Qualsiasi tag HTML all'interno del valore riflesso viene istanziato e renderizzato dal parser HTML del browser.config_nonce richiesto dall'azione gform_get_config è incorporato nell'oggetto di configurazione JavaScript (gform_theme_config) su ogni pagina che carica un modulo Gravity Forms. Questo nonce è identico su tutte le pagine e non è legato a una specifica sessione utente, rendendolo banalmente ottenibile da utenti non autenticati.Questa vulnerabilità è il risultato di molteplici debolezze concorrenti che si concatenano per produrre la condizione sfruttabile. Sebbene CWE-79 sia la classificazione primaria ai fini della segnalazione CVE, l'intera catena documenta come ogni fallimento si combini per abilitare lo sfruttamento.
CWE-20 CWE-116 CWE-838 CWE-79 Improper Input → Improper Encoding → Inappropriate Encoding → Cross-Site Validation or Escaping of Output for Output Context Scripting (XSS) [EXPLOITABLE] form_ids accepts Reflected values are JSON data served as Browser parses arbitrary strings not HTML-entity text/html instead of injected HTML tags instead of integers encoded in response application/json and executes JS
### CWE-20: Convalida dell'Input Impropria (Contributo)
**Ruolo:** Abilitatore principale — consente l'ingresso di dati dannosi nella pipeline di elaborazione.
Il parametro `form_ids` nell'oggetto JSON `args` dovrebbe contenere identificatori numerici di moduli, ma accetta input stringa arbitrari senza alcuna validazione. Non vengono applicati controlli di tipo (`intval()`), filtri regex (`^[0-9]+$`), confronti con una whitelist di ID modulo noti, né restrizioni sulla lunghezza.
**Evidenza:** Il server accetta ed elabora valori `form_ids` contenenti tag HTML, gestori di eventi JavaScript e Unicode arbitrario senza rifiutarli.```json
{"form_ids":["<svg onload=alert(1)>"]} ← Accepted
{"form_ids":["3"]} ← Expected
Ruolo: Vulnerabilità principale — la causa diretta della condizione XSS.
Quando il server costruisce la risposta JSON contenente i valori form_ids, non applica la codifica delle entità HTML all'output. I caratteri con significato speciale in HTML (<, >, ", ', &) passano senza modifiche nel corpo della risposta. Le funzioni PHP htmlspecialchars(), esc_html(), wp_json_encode() con JSON_HEX_TAG, o funzioni equivalenti di codifica dell'output non vengono applicate ai valori form_ids prima che vengano scritti nella risposta.
Evidenza: La stringa letterale <svg onload=alert(document.domain)> appare nel corpo della risposta byte per byte identica all'input, anziché come <svg onload=alert(document.domain)>.
Ruolo: Escalation del contesto — trasforma un problema di riflessione dei dati in un'iniezione di codice eseguibile.