
WordPress PPOM for WooCommerce Plugin <= 33.0.15 es vulnerable a inyección SQL.
Este repositorio contiene una Prueba de Concepto (PoC) para una vulnerabilidad de inyección SQL ciega basada en tiempo no autenticada en el plugin de WordPress "PPOM for WooCommerce", que afecta a las versiones hasta la 33.0.15 inclusive.
La vulnerabilidad existe porque el plugin no sanea adecuadamente la entrada proporcionada por el usuario antes de usarla en una consulta SQL. Específicamente, la función get_product_meta() en classes/plugin.class.php concatena directamente el parámetro $meta_id en la consulta SQL sin utilizar sentencias preparadas.
Código Vulnerable (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 atacante no autenticado puede explotar esto creando una carga maliciosa e inyectándola en el parámetro ppom[fields][id] al añadir un producto al carrito. Esto permite al atacante ejecutar comandos SQL arbitrarios, como funciones de retardo de tiempo (SLEEP()), lo que le permite confirmar la vulnerabilidad y potencialmente exfiltrar información sensible de la base de datos carácter por carácter.
La vulnerabilidad se activa cuando la opción "Enable Legacy Price Calculations" está activa en la configuración del plugin, ya que esto obliga a la aplicación a utilizar la ruta de código vulnerable durante las operaciones del carrito.
└── cve-2025-11391/
├── exploit.py # El script de Prueba de Concepto en Python.
└── woocommerce-product-addon/ # Versión vulnerable del plugin (v33.0.15).
requests instalada (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) proporcionada en este repositorio subiendo el archivo .zip desde el directorio woocommerce-product-addon/.sql_injection).El script exploit.py proporcionado confirma la vulnerabilidad inyectando un comando SLEEP() y midiendo el tiempo de respuesta del servidor.
Abra el archivo exploit.py y configure las siguientes variables:
PRODUCT_URL: La URL completa de la página del producto vulnerable que creó.add_to_cart_data['add-to-cart']: El ID de su producto vulnerable.Ejecute el script desde su terminal:
python exploit.py
Si el objetivo es vulnerable, el servidor tardará más que la duración del SLEEP() en responder, lo que provocará que el script expire. El script interpreta correctamente este tiempo de espera como una explotación exitosa.
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() para sanear adecuadamente la entrada, evitando la inyección SQL.Código Parcheado (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 ) );
Esta PoC está destinada únicamente a fines educativos y de investigación. No la utilice en ningún sistema que no le pertenezca o para el que no tenga permiso explícito de prueba. El autor no es responsable del mal uso o de los daños causados por este script.