
WordPress PPOM for WooCommerce Plugin <= 33.0.15 é vulnerável a SQL Injection
Este repositório contém uma Prova de Conceito (PoC) para uma vulnerabilidade de injeção SQL cega baseada em tempo e não autenticada no plugin WordPress "PPOM for WooCommerce", afetando versões até a 33.0.15 inclusive.
A vulnerabilidade existe porque o plugin não sanitiza adequadamente a entrada fornecida pelo usuário antes de usá-la em uma consulta SQL. Especificamente, a função get_product_meta() em classes/plugin.class.php concatena diretamente o parâmetro $meta_id na consulta SQL sem usar declarações preparadas.
Código Vulnerável (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;
}
Um atacante não autenticado pode explorar isso criando um payload malicioso e injetando-o no parâmetro ppom[fields][id] ao adicionar um produto ao carrinho. Isso permite que o atacante execute comandos SQL arbitrários, como funções de atraso de tempo (SLEEP()), permitindo confirmar a vulnerabilidade e potencialmente exfiltrar informações sensíveis do banco de dados caractere por caractere.
A vulnerabilidade é acionada quando a opção "Enable Legacy Price Calculations" está ativa nas configurações do plugin, pois isso força o aplicativo a usar o caminho de código vulnerável durante as operações de carrinho.
└── cve-2025-11391/
├── exploit.py # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (v33.0.15).
requests instalada (pip install requests)./htdocs/wp4hacking/).woocommerce-product-addon (v33.0.15) fornecida neste repositório enviando o arquivo .zip do diretório woocommerce-product-addon/.sql_injection).O script exploit.py fornecido confirma a vulnerabilidade injetando um comando SLEEP() e medindo o tempo de resposta do servidor.
Abra o arquivo exploit.py e configure as seguintes variáveis:
PRODUCT_URL: A URL completa da página do produto vulnerável que você criou.add_to_cart_data['add-to-cart']: O ID do seu produto vulnerável.Execute o script no seu terminal:
python exploit.py
Se o alvo for vulnerável, o servidor levará mais tempo do que a duração do SLEEP() para responder, fazendo com que o script atinja o tempo limite (timeout). O script interpreta corretamente esse timeout como uma exploração bem-sucedida.
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 sanitizar adequadamente a entrada, prevenindo a injeção SQL.Código Corrigido (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 destina-se apenas a fins educacionais e de pesquisa. Não a utilize em qualquer sistema que você não possua ou para o qual não tenha permissão explícita para testar. O autor não é responsável por qualquer uso indevido ou dano causado por este script.