
Analisi tecnica ed exploit proof-of-concept per CVE-2021-43408, una vulnerabilità di SQL injection nel plugin WordPress Duplicate Post versione 1.1.9, con guida allo sfruttamento passo passo e consigli di rimedio.
WordPress è un software CMS (Content Management System) open source, un sistema di gestione dei contenuti. Invece di utilizzare il linguaggio di markup HTML, WP è scritto nel linguaggio di programmazione PHP e utilizza la piattaforma dati MySQL. WordPress è stato fondato dai programmatori Matt Mullenweg e Mike Little. Attualmente WordPress è di proprietà della società Automattic, con sede a San Francisco, California, Stati Uniti.
Il plugin Duplicate Post di WordPress, nelle versioni 1.1.9 e precedenti, è affetto da una vulnerabilità di SQL Injection. Questo tipo di exploit consente all'attaccante di iniettare query SQL e, di conseguenza, di leggere, modificare o persino eliminare le risorse presenti nel database.
Questa vulnerabilità può essere sfruttata da qualsiasi utente autenticato che disponga dei permessi per utilizzare le funzionalità del plugin Duplicate Post. Per impostazione predefinita, solo l'Admin ha questi permessi; tuttavia, essi possono essere modificati, consentendo così anche a Editor, Author, Contributor e persino Subscriber di utilizzare il plugin.
CVE-2021-43408 è stata scoperta l'11/19/2021 ed è stata valutata di livello HIGH secondo il punteggio CVSS.

La causa principale di questa vulnerabilità risiede nel fatto che i dati inviati tramite la richiesta dell'utente non vengono sanificati prima di essere utilizzati nell'esecuzione delle query SQL.
Più precisamente, nel file post/handler.php, nella funzione cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$idè controllato dall'attaccante
La variabile $id viene passata alla funzione che contiene la query SQL senza alcuna sanificazione. Questa funzione viene richiamata tramite l'Ajax di WordPress wp_ajax_cdp_action_handling.
Si può notare che il parametro id viene passato attraverso la funzione cdn_sanitize_array; qui i campi dati del post vengono elaborati dalla funzione sanitize_text_field, che esegue l'escape di qualsiasi carattere di citazione ' nella stringa di dati.

I campi dati vengono elaborati con
sanitize_text_field
Tuttavia, il codice presenta una vulnerabilità quando i dati del campo Integer vengono passati alla query SQL in esecuzione (campo id): l'attaccante può sfruttare questo difetto e iniettare ulteriori istruzioni SQL nel valore di tale campo. Pertanto, per controllare la query SQL, all'attaccante è sufficiente evitare l'uso del carattere '.
Step 1: Accedere come utente Admin e installare il plugin Duplicate Post versione 1.1.9. Questo plugin aiuta gli utenti a duplicare i post esistenti.

Step 2: Andare alla sezione Post, selezionare un post, scegliere l'azione Copy e fare clic su Apply.

Step 3: Selezionare Setting: Default e fare clic su Copy.

Step 4: Intercettare la richiesta HTTP; il campo dati a cui prestare attenzione qui è id: si può notare che i dati di questo campo sono di tipo numerico Integer.

Step 5: Iniettare il payload di SQL Injection, inviare la richiesta e osservare che il server restituisce la risposta solo dopo 9 secondi -> SQL Injection riuscita.
Payload: 1 and (select*from(select(sleep(9)))a)--

