
Prova di concetto di CVE-2025-22783
Plugin WordPress
Nome del componente SEO Plugin di Squirrly SEO
Versione vulnerabile <= 12.4.01
Slug del componente squirrly-seo
Link del componente https://wordpress.org/plugins/squirrly-seo/
Classe di vulnerabilità A3: Injection
Tipo di vulnerabilità SQL Injection
Collaboratore (Contributor) +
Il plugin SEO di Squirrly SEO ti permette di migliorare il SEO del tuo sito web attraverso una funzione di collegamento interno che ti consente di selezionare pagine sorgente e destinazione basate su parole chiave specifiche. Puoi gestire le parole chiave di ogni collegamento, le pagine sorgente, le pagine di destinazione e lo stato tramite la pagina di gestione dei collegamenti interni (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks).
Nelle versioni 12.4.01 e precedenti del plugin Squirrly SEO, è possibile cercare i collegamenti interni creati sulla pagina di gestione dei collegamenti interni. Si verifica una vulnerabilità di SQL Injection quando i termini di ricerca inseriti dagli utenti (Collaboratore+) vengono passati direttamente alle query del database senza convalida.
Sebbene i risultati della ricerca non vengano visualizzati direttamente sulla pagina di gestione dei collegamenti interni, le informazioni del database possono essere estratte utilizzando tecniche di SQL Injection basate sul tempo, come la funzione SLEEP.
Accedi al sito di destinazione con un account che ha privilegi di Collaboratore o superiori, dove è installata la versione 12.4.01 o inferiore del plugin Squirrly SEO.
Quindi, quando accedi all'URL sottostante, poiché la condizione dell'istruzione IF '1=1' nel payload di SQL Injection è sempre vera, la funzione SLEEP(5) verrà eseguita e la pagina verrà caricata dopo 5 secondi.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
D'altra parte, se cambi la condizione dell'istruzione IF in '1=2', la pagina verrà caricata immediatamente perché il valore del risultato è falso.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
Nella pagina di gestione dei collegamenti interni (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks) del plugin Squirrly SEO, quando si cercano collegamenti interni, si interroga il database chiamando la funzione getSqInnerlinks nel file /wp-content/plugins/squirrly-seo/models/Qss.php.

A questo punto, possiamo vedere che la variabile $query_where viene inserita direttamente nella query SQL. Esaminiamo come viene costruito il valore della variabile $query_where:
$search contiene il termine di ricerca inserito durante la ricerca del collegamento interno, e la funzione sanitize_text_field viene utilizzata per elaborare i dati di input dell'utente.$search viene utilizzata come parte della clausola condizionale e memorizzata nella variabile $query_where.$query_where e vengono applicati filtri tramite la funzione apply_filters.Pertanto, sebbene il termine di ricerca inserito dagli utenti durante la ricerca del collegamento interno venga elaborato dalla funzione sanitize_text_field, questa funzione non può prevenire attacchi di SQL Injection. I caratteri speciali utilizzati nelle query SQL (virgolette singole ('), commenti (#), ecc.) non vengono filtrati e, quando la variabile $search contenente il payload di SQL Injection viene passata alla query del database senza un'adeguata escape, si verifica una vulnerabilità di SQL Injection.
⚠️ Il codice PoC implementato effettua l'accesso con un account amministratore per creare un account con i privilegi minimi (Collaboratore+) necessari per la riproduzione della vulnerabilità, e poi attiva la vulnerabilità utilizzando quell'account.

Quindi, esegui il seguente comando per avviare il codice PoC.
Modulo richiestorequests
python poc.py
