
Il plugin WordPress PPOM for WooCommerce <= 33.0.15 è vulnerabile a SQL Injection.
Questa repository contiene una prova di concetto (PoC) per una vulnerabilità di SQL injection 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. In particolare, la funzione get_product_meta() in classes/plugin.class.php concatena direttamente il parametro $meta_id nella query SQL senza utilizzare istruzioni preparate (prepared statements).
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 "Enable Legacy Price Calculations" è attiva nelle impostazioni del plugin, poiché ciò costringe l'applicazione a utilizzare il percorso di codice vulnerabile durante le operazioni sul carrello.
└── cve-2025-11391/
├── exploit.py # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (v33.0.15).
requests installata (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) fornita in questa 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.
Attempting SQL Injection PoC (One-Step Method)...
Make sure 'Enable Legacy Price Calculations' is active.
[*] Sending SQL Injection payload...
Request timed out after 10.00 seconds.
[+] SUCCESS! 'Read timed out' occurred because the SLEEP(7) payload was executed.
The site is vulnerable to Time-Based Blind SQL Injection.
$wpdb->prepare() per sanificare correttamente l'input, prevenendo l'SQL injection.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 ) );
Questo PoC è destinato esclusivamente a scopi educativi e di ricerca. Non utilizzarlo su sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test. L'autore non è responsabile di qualsiasi uso improprio o danno causato da questo script.