
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 unauthentifizierte zeitbasierte Blind-SQL-Injection-Schwachstelle im WordPress-Plugin "PPOM for WooCommerce", das 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. Insbesondere 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.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;
}
Ein nicht authentifizierter Angreifer kann dies ausnutzen, indem er eine schädliche Nutzlast erstellt und diese in den Parameter ppom[fields][id] injiziert, wenn er ein Produkt in den Warenkorb legt. Dies ermöglicht es dem Angreifer, beliebige SQL-Befehle auszuführen, wie z. B. Zeitverzögerungsfunktionen (SLEEP()), um die Schwachstelle zu bestätigen und möglicherweise vertrauliche Informationen zeichenweise aus der Datenbank zu extrahieren.
Die Schwachstelle wird ausgelöst, wenn die Option "Enable Legacy Price Calculations" in den Einstellungen des Plugins aktiviert ist, da dies die Anwendung zwingt, bei Warenkorbvorgängen den anfälligen 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-Bibliothek (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15), die in diesem Repository bereitgestellt wird, 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 zu der von Ihnen erstellten verwundbaren Produktseite.add_to_cart_data['add-to-cart']: Die ID Ihres verwundbaren Produkts.Führen Sie das Skript in Ihrem Terminal aus:
python exploit.py
Wenn das Ziel verwundbar ist, benötigt der Server länger als die SLEEP()-Dauer, um zu antworten, was dazu führt, dass das Skript eine Zeitüberschreitung (Timeout) erhält. Das Skript interpretiert diese Zeitüberschreitung 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 ist ausschließlich für Bildungs- und Forschungszwecke bestimmt. Verwenden Sie es nicht auf einem System, das Sie nicht besitzen oder für das Sie keine ausdrückliche Erlaubnis zum Testen haben. Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die durch dieses Skript verursacht werden.