
WordPress PPOM per WooCommerce Plugin <= 33.0.15 è vulnerabile a SQL Injection
Questo repository contiene una Proof of Concept (PoC) per una vulnerabilità di iniezione SQL cieca basata sul tempo, non autenticata, nel plugin WordPress "PPOM for WooCommerce", che interessa le versioni fino alla 33.0.15 inclusa.
La vulnerabilità esiste perché il plugin non riesce a sanificare correttamente l'input fornito dall'utente prima di utilizzarlo in una query SQL. Nello specifico, la funzione get_product_meta() in classes/plugin.class.php concatena direttamente il parametro $meta_id nella query SQL senza utilizzare istruzioni preparate.
Codice Vulnerabile (classes/plugin.class.php):
function get_product_meta( $meta_id ) {
// ...
global $wpdb;
$qry = 'SELECT * FROM ' . $wpdb->prefix . PPOM_TABLE_META . " WHERE productmeta_id = $meta_id";
$res = $wpdb->get_row( $qry );
return $res;
}
Un attaccante non autenticato può sfruttare questa vulnerabilità creando un payload dannoso e iniettandolo nel parametro ppom[fields][id] quando aggiunge un prodotto al carrello. Ciò consente all'attaccante di eseguire comandi SQL arbitrari, come funzioni di ritardo temporale (SLEEP()), permettendogli di confermare la vulnerabilità e potenzialmente esfiltrare informazioni sensibili dal database carattere per carattere.
La vulnerabilità viene attivata quando l'opzione "Abilita calcoli prezzo legacy" è attiva nelle impostazioni del plugin, poiché ciò forza l'applicazione a utilizzare il percorso di codice vulnerabile durante le operazioni sul carrello.
└── cve-2025-11391/
├── exploit.py # Lo script Python Proof of Concept.
└── woocommerce-product-addon/ # Versione vulnerabile del plugin (v33.0.15).
requests installata (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) fornita in questo repository caricando il file .zip dalla directory woocommerce-product-addon/.sql_injection).Lo script exploit.py fornito conferma la vulnerabilità iniettando un comando SLEEP() e misurando il tempo di risposta del server.
Apri il file exploit.py e configura le seguenti variabili:
PRODUCT_URL: L'URL completo della pagina del prodotto vulnerabile che hai creato.add_to_cart_data['add-to-cart']: L'ID del tuo prodotto vulnerabile.Esegui lo script dal tuo terminale:
python exploit.py
Se il target è vulnerabile, il server impiegherà più tempo della durata di SLEEP() per rispondere, causando il timeout dello script. Lo script interpreta correttamente questo timeout come uno sfruttamento riuscito.
Tentativo di PoC per Iniezione SQL (Metodo in un Passaggio)...
Assicurati che 'Abilita calcoli prezzo legacy' sia attivo.
[*] Invio del payload di Iniezione SQL...
Richiesta scaduta dopo 10.00 secondi.
[+] SUCCESSO! 'Read timed out' si è verificato perché il payload SLEEP(7) è stato eseguito.
Il sito è vulnerabile all'Iniezione SQL Cieca Basata sul Tempo.
$wpdb->prepare() per sanificare correttamente l'input, prevenendo l'iniezione SQL.Codice Corretto (classes/plugin.class.php):
$table = $wpdb->prefix . PPOM_TABLE_META;
$res = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE productmeta_id = %d", $meta_id ) );
Questa PoC è intesa esclusivamente a scopo educativo e di ricerca. Non utilizzarla su alcun sistema di cui non sei proprietario o per il quale non hai esplicita autorizzazione a testare. L'autore non è responsabile per qualsiasi uso improprio o danno causato da questo script.