
WordPress PPOM für WooCommerce Plugin <= 33.0.15 ist anfällig für SQL-Injection
Dieses Repository enthält einen Proof of Concept (PoC) für eine nicht authentifizierte zeitbasierte Blind-SQL-Injection-Schwachstelle im WordPress-Plugin „PPOM for WooCommerce", die Versionen bis einschließlich 33.0.15 betrifft.
Die Schwachstelle besteht, weil das Plugin die vom Benutzer bereitgestellten Eingaben nicht ordnungsgemäß bereinigt, bevor es sie in einer SQL-Abfrage verwendet. Konkret verkettet die Funktion get_product_meta() in classes/plugin.class.php den Parameter $meta_id direkt in die SQL-Abfrage, ohne vorbereitete Anweisungen (Prepared Statements) zu verwenden.
Verwundbarer Code ():
classes/plugin.class.phpfunction 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;
}
Ein nicht authentifizierter Angreifer kann dies ausnutzen, indem er eine schädliche Nutzlast erstellt und sie in den Parameter ppom[fields][id] injiziert, wenn ein Produkt zum Warenkorb hinzugefügt wird. Dies ermöglicht es dem Angreifer, beliebige SQL-Befehle auszuführen, wie z. B. Zeitverzögerungsfunktionen (SLEEP()), wodurch er die Schwachstelle bestätigen und möglicherweise vertrauliche Informationen Zeichen für Zeichen aus der Datenbank exfiltrieren kann.
Die Schwachstelle wird ausgelöst, wenn die Option „Enable Legacy Price Calculations" in den Plugin-Einstellungen aktiv ist, da dies die Anwendung dazu zwingt, während Warenkorbvorgängen den verwundbaren Codepfad zu verwenden.
└── cve-2025-11391/
├── exploit.py # Das Python-Proof-of-Concept-Skript.
└── woocommerce-product-addon/ # Verwundbare Version des Plugins (v33.0.15).
requests (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15), indem Sie die .zip-Datei aus dem Verzeichnis woocommerce-product-addon/ hochladen.sql_injection).Das bereitgestellte Skript exploit.py bestätigt die Schwachstelle, indem es einen SLEEP()-Befehl injiziert und die Antwortzeit des Servers misst.
Öffnen Sie die Datei exploit.py und konfigurieren Sie die folgenden Variablen:
PRODUCT_URL: Die vollständige URL zur von Ihnen erstellten verwundbaren Produktseite.add_to_cart_data['add-to-cart']: Die ID Ihres verwundbaren Produkts.Führen Sie das Skript über Ihr Terminal aus:
python exploit.py
Wenn das Ziel verwundbar ist, benötigt der Server länger als die SLEEP()-Dauer, um zu antworten, wodurch das Skript einen Timeout auslöst. Das Skript interpretiert diesen Timeout korrekt als erfolgreiche Ausnutzung.
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(), um die Eingabe ordnungsgemäß zu bereinigen und so die SQL-Injection zu verhindern.Gepatchter Code (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 ) );
Dieser PoC dient ausschließlich Bildungs- und Forschungszwecken. Verwenden Sie ihn nicht auf Systemen, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testberechtigung haben. Der Autor ist nicht verantwortlich für Missbrauch oder Schäden, die durch dieses Skript verursacht werden.