
Prova di concetto di CVE-2025-22652
Plugin WordPress
Nome componente Payment Forms for Paystack
Versione vulnerabile <= 4.0.1
Slug del componente payment-forms-for-paystack
Link del componente https://wordpress.org/plugins/payment-forms-for-paystack/
Classe di vulnerabilità A3: Injection
Tipo di vulnerabilità SQL Injection
Amministratore
Nel plugin Payment Forms for Paystack versione 4.0.1 e precedenti, è presente una vulnerabilità di SQL Injection a causa di una validazione dell'input e una gestione dell'escape insufficienti per il parametro URL order durante la visualizzazione dell'elenco dei pagamenti nei moduli di pagamento. Tramite questa, un attaccante con privilegi di amministratore può estrarre tutte le informazioni dal database del sito target.
Sebbene questa vulnerabilità non consenta query dirette sui dati, i dati possono essere estratti utilizzando tecniche di SQL Injection basate sul tempo.
Prepara un sito WordPress con il plugin Payment Forms for Paystack installato versione 4.0.1 o precedente.
Poiché è necessario aggiungere un modulo Paystack per eseguire la ricerca, aggiungi un modulo dal menu di aggiunta moduli Paystack (wp-admin/post-new.php?post_type=paystack_form).

Dopo aver aggiunto il modulo, puoi controllare lo ShortCode e inserire l'ID dell'attributo di quello ShortCode nel parametro URL form dell'URL qui sotto prima di accedervi.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)
Ad esempio, se [pff-paystack id="13"], accedi a http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=1)

Di conseguenza, poiché la clausola condizionale where 1=1 nel payload di SQL Injection inserito nel parametro URL order è sempre vera, puoi confermare che la funzione viene eseguita e la risposta arriva dopo 5 secondi.
Quando si richiede l'URL in cui si verifica la vulnerabilità, viene chiamata la funzione get_payments_by_id nel file /wp-content/plugins/payment-forms-for-paystack/includes/classes/class-helpers.php.
A questo punto, il parametro URL order viene inserito direttamente nella query SQL ed eseguito sul database senza alcuna validazione dell'input o gestione dell'escape.

Pertanto, quando il payload di SQL Injection , (select sleep(5) from dual where 1=1) viene inserito nel parametro URL order, viene eseguita la query SQL mostrata di seguito. A questo punto, a seconda che la clausola condizionale nel payload sia vera o falsa, si verifica una differenza nel tempo di risposta, e questa differenza di tempo può essere utilizzata per estrarre i dati dal database.
SELECT * FROM %i WHERE post_id = %d AND paid = %s ORDER BY %i , (select sleep(5) from dual where 1=1)
Apri il codice PoC in un editor e inserisci l'indirizzo del sito WordPress e le credenziali dell'amministratore.

Quindi inserisci il seguente comando per eseguire il codice PoC.
Modulo richiestorequests
python poc.py

sleep(5)
D'altra parte, se modifichi la clausola condizionale nel payload di SQL Injection inserito in order in where 1=2, puoi confermare che la risposta arriva immediatamente.
http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=<Insertion Point>&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
Ad esempio, se [pff-paystack id="13"], accedi a http://localhost:8080/wp-admin/edit.php?post_type=paystack_form&page=submissions&form=13&orderby=&order=,+(select+sleep(5)+from+dual+where+1=2)
