
Proof-of-concept exploit per una vulnerabilità XSS riflessa nel plugin WordPress Groundhogg, che dimostra l'iniezione di script non autenticata tramite parametri URL appositamente costruiti.
Plugin WordPress
Nome del componente WordPress CRM, Email & Marketing Automation for WordPress | Award Winner — Groundhogg
Versione vulnerabile <= 3.7.3.2
Slug del componente groundhogg
Link del componente https://wordpress.org/plugins/groundhogg/
Classe di vulnerabilità A3: Injection
Tipo di vulnerabilità Cross Site Scripting (XSS)
Non autenticato
Le versioni 3.7.3.3 e precedenti del plugin Groundhogg contengono una vulnerabilità di tipo Reflected Cross Site Scripting dovuta a una validazione insufficiente dell'input e a una mancata gestione dell'escaping dei parametri URL. Questa vulnerabilità si verifica quando si utilizza la funzionalità di filtro di ricerca nei menu 'Contatti', 'Funnel' e 'Registri' della dashboard del plugin.
Tramite questa vulnerabilità, un utente non autenticato può creare un URL contenente script dannosi e, quando altri utenti accedono a questo URL, lo script viene eseguito nel loro browser, potenzialmente causando la divulgazione delle informazioni dei cookie. Ciò rappresenta un serio rischio per la sicurezza, poiché può essere sfruttato in particolare per dirottare le sessioni degli utenti con privilegi di amministratore.
Preparare un sito WordPress con il plugin 'Groundhogg' <=3.7.3.2 attivato.
Poiché questo plugin utilizza la REST API, il Permalink deve essere impostato su
Nome del post.
Successivamente, l'accesso ai link per ciascun menu di seguito attiverà una vulnerabilità di tipo Reflected XSS.
Menu Contatti(/wp-admin/admin.php?page=gh_contacts)
http://localhost:8080/wp-admin/admin.php?page=gh_contacts&filters=W1t7ImlkIjoiIiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiJ9XV0

Menu Funnel(/wp-admin/admin.php?page=gh_funnels)
Per riprodurre la vulnerabilità XSS in questo menu, deve esistere almeno 1 Funnel.
http://localhost:8080/wp-admin/admin.php?page=gh_funnels&status=inactive&include_filters=W1t7ImlkIjoiMTBjY2FmZmUtZjE0YS00MTg5LWE0MzctYjA2MTFhMTQ2ZDk1IiwidHlwZSI6InRpdGxlIiwidmFsdWUiOiI8aW1nIHNyYz1cInhcIiBvbmVycm9yPVwiYWxlcnQoZG9jdW1lbnQuY29va2llKVwiPiIsImNvbXBhcmUiOiJlcXVhbHMifV1d

Menu Registri(/admin.php?page=gh_events)
http://localhost:8080/wp-admin/admin.php?page=gh_events&tab=emails&include_filters=W1t7ImlkIjoiIiwidHlwZSI6ImZyb21fYWRkcmVzcyIsInZhbHVlIjoiPGltZyBzcmM9XCJ4XCIgb25lcnJvcj1cImFsZXJ0KGRvY3VtZW50LmNvb2tpZSlcIj4iLCJjb21wYXJlIjoiZXF1YWxzIn1dXQ

Quando si eseguono ricerche con filtro nei menu 'Contatti', 'Funnel' e 'Registri' della dashboard del plugin Groundhogg, le impostazioni del filtro vengono codificate in Base64 prima di essere passate come parametri URL.
Ad esempio, quando si imposta una ricerca con filtro nel menu 'Contatti' in cui 'Nome' è impostato su 'Test', il parametro URL filters riceve i seguenti dati:
W1t7ImlkIjoiMjM3NzdjMGItYTQ1Ni00M2JlLWExZGMtODkzN2E1MDk0M2I5IiwidHlwZSI6ImZpcnN0X25hbWUiLCJjb21wYXJlIjoiZXF1YWxzIiwidmFsdWUiOiJUZXN0In1dXQ

Quando il valore inserito nel parametro URL filters viene decodificato in Base64, è possibile vedere i seguenti dati.
[[{"id":"23777c0b-a456-43be-a1dc-8937a50943b9","type":"first_name","compare":"equals","value":"Test"}]]

Quando viene richiesta una ricerca con filtro, viene eseguita la funzione scripts della classe Contacts_Page nel file /wp-content/plugins/groundhogg/admin/contacts/contacts-page.php.
A questo punto, il parametro URL filters codificato in Base64 viene decodificato e passato alla variabile ContactSearch nell'area JavaScript della risposta HTTP.

Pertanto, è possibile verificare che nei dati della risposta HTTP, i dati codificati in Base64 passati al parametro URL filters vengono decodificati prima di essere consegnati.

Successivamente, i dati decodificati vengono inseriti direttamente negli elementi DOM che visualizzano i risultati della ricerca con filtro tramite la logica JavaScript.

Attraverso questo meccanismo, il termine di ricerca con filtro (<img src="x" onerror="alert(document.cookie)">) inserito nel PoC viene passato come variabile nel codice JavaScript senza gestione dell'escaping e viene inserito ed eseguito negli elementi DOM dalla logica client.


Di conseguenza, a causa della gestione insufficiente dell'escaping dei dati di ricerca con filtro, i valori contenenti script dannosi possono essere eseguiti direttamente, e questa vulnerabilità si verifica allo stesso modo in tutti i menu 'Contatti', 'Funnel' e 'Registri'.