
Le plugin WordPress PPOM for WooCommerce <= 33.0.15 est vulnérable à l'injection SQL.
Ce dépôt contient une preuve de concept (PoC) pour une vulnérabilité d'injection SQL aveugle basée sur le temps, non authentifiée, dans le plugin WordPress « PPOM for WooCommerce », affectant les versions jusqu'à la 33.0.15 incluse.
La vulnérabilité existe parce que le plugin ne parvient pas à assainir correctement les entrées fournies par l'utilisateur avant de les utiliser dans une requête SQL. Plus précisément, la fonction get_product_meta() dans classes/plugin.class.php concatène directement le paramètre $meta_id dans la requête SQL sans utiliser de requêtes préparées.
Code vulnérable (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 attaquant non authentifié peut exploiter cette faille en créant une charge utile malveillante et en l'injectant dans le paramètre ppom[fields][id] lors de l'ajout d'un produit au panier. Cela permet à l'attaquant d'exécuter des commandes SQL arbitraires, telles que des fonctions de temporisation (SLEEP()), lui permettant de confirmer la vulnérabilité et potentiellement d'exfiltrer des informations sensibles de la base de données caractère par caractère.
La vulnérabilité est déclenchée lorsque l'option « Enable Legacy Price Calculations » est active dans les paramètres du plugin, car cela force l'application à utiliser le chemin de code vulnérable lors des opérations de panier.
└── cve-2025-11391/
├── exploit.py # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (v33.0.15).
requests installée (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) fournie dans ce dépôt en téléversant le fichier .zip depuis le répertoire woocommerce-product-addon/.sql_injection).Le script exploit.py fourni confirme la vulnérabilité en injectant une commande SLEEP() et en mesurant le temps de réponse du serveur.
Ouvrez le fichier exploit.py et configurez les variables suivantes :
PRODUCT_URL : l'URL complète de la page produit vulnérable que vous avez créée.add_to_cart_data['add-to-cart'] : l'ID de votre produit vulnérable.Exécutez le script depuis votre terminal :
python exploit.py
Si la cible est vulnérable, le serveur mettra plus de temps que la durée du SLEEP() pour répondre, ce qui entraînera une expiration du délai (timeout) du script. Le script interprète correctement cette expiration comme une exploitation réussie.
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() pour assainir correctement l'entrée, empêchant ainsi l'injection SQL.Code corrigé (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 ) );
Ce PoC est destiné uniquement à des fins éducatives et de recherche. Ne l'utilisez pas sur un système que vous ne possédez pas ou pour lequel vous n'avez pas explicitement l'autorisation de tester. L'auteur n'est pas responsable de toute utilisation abusive ou de tout dommage causé par ce script.