
PoC di CVE-2025-22710
Plugin WordPress
Nome del componente WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Versione vulnerabile <= 8.50.0
Slug del componente smart-manager-for-wp-e-commerce
Link del componente https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Classe di vulnerabilità A3: Injection
Tipo di vulnerabilità SQL Injection
Amministratore
Il plugin WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager (di seguito Smart Manager) è un plugin che consente la modifica in massa e la visualizzazione di tutti i tipi di post in WordPress.
Nella versione 8.50.0 e precedenti del plugin Smart Manager, quando si utilizza la funzione di ricerca avanzata per visualizzare i post, si verifica una vulnerabilità di SQL Injection perché i valori di filtro vengono passati alle query del database senza elaborazione di escape.
Tuttavia, mentre i risultati diretti degli attacchi di SQL Injection non sono visibili sullo schermo, è possibile eseguire Blind SQL Injection sfruttando le differenze nei valori di risposta in base a condizioni true/false.
⚠️ Almeno un post deve esistere per osservare la differenza nei valori di risposta in base alle condizioni true/false.
/wp-admin/admin.php?page=smart-manager).

' OR 1=1 )) # nel campo di input di testo. Successivamente, fare clic sul pulsante di ricerca in alto.

' OR 1=2 )) # nel campo di input di testo, non verrà recuperato alcun post perché la condizione è sempre falsa (OR 1=2).

Quando si esegue la funzione 'Advanced Search' richiesta nella descrizione del PoC sopra, viene generato il seguente pacchetto e i valori di filtro (Post Title, is, ' OR 1=1 )) #) inseriti nella ricerca avanzata vengono immessi nei dati della richiesta advanced_search_query.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

Quando questo pacchetto viene richiesto, viene chiamata la funzione get_data_model nel file /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php, che esegue query al database nel seguente ordine.
Se i dati della richiesta advanced_search_query esistono, viene chiamata la funzione process_search_cond. In questo momento, i dati della richiesta advanced_search_query vengono passati al valore con chiave search_query nell'argomento coppia chiave-valore.
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

La funzione chiamata process_search_cond itera sul valore con chiave search_query, inizializza il valore di filtro Post Title (post_tile) nella variabile $search_col e inizializza il valore di filtro ' OR 1=1 )) # contenente il payload di SQL Injection nella variabile $search_value.
Nella funzione di ricerca avanzata, l'input dell'utente (' OR 1=1 )) #) viene incluso direttamente nella query del database senza elaborazione di escape, causando una vulnerabilità di SQL Injection. Questa vulnerabilità consente agli attaccanti di eseguire query SQL arbitrarie, portando potenzialmente a seri rischi per la sicurezza come la divulgazione o la manipolazione di informazioni sensibili dal database.
⚠️ L'implementazione del codice PoC interroga il nome del database sfruttando la vulnerabilità di SQL Injection.
Aprire il codice PoC in un editor e inserire l'indirizzo del sito WordPress e le credenziali dell'amministratore.

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


Le variabili $search_col e $search_value vengono passate rispettivamente alle chiavi search_col (=post_title) e search_value (=' OR 1=1 )) #) dell'array $search_params. Successivamente, questa variabile $search_params viene passata come valore con chiave search_params alla funzione create_flat_table_search_query.

Successivamente, la funzione create_flat_table_search_query definisce la clausola WHERE della query SQL e, a questo punto, il search_value (=' OR 1=1 )) #) della chiave search_params passato come argomento viene incluso nella clausola WHERE senza alcuna elaborazione di escape.

Quindi, il valore di ritorno della funzione create_flat_table_search_query (contenente il payload di SQL Injection) viene passato come argomento alla funzione process_flat_table_search_query.

La funzione process_flat_table_search_query costruisce una query al database utilizzando l'argomento ricevuto, inizializzando le variabili $select, $from e $where. Qui possiamo vedere che il payload di SQL Injection viene passato direttamente alla variabile $where senza alcuna validazione.

Le variabili $select, $from, $where vengono assegnate direttamente alla variabile $query_posts_search e questa variabile viene infine passata come argomento alla funzione che esegue la query al database.
