
WordPress PPOM for WooCommerce Plugin <= 33.0.15 é vulnerável a Injeção de SQL
Este repositório contém uma Prova de Conceito (PoC) para uma vulnerabilidade de injeção SQL cega baseada em tempo, não autenticada, no plugin WordPress "PPOM for WooCommerce", afetando versões até 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 prepared statements.
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 do carrinho.
└── cve-2025-11391/
├── exploit.py # O script Python da Prova de Conceito.
└── woocommerce-product-addon/ # Versão vulnerável do 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 estiver vulnerável, o servidor levará mais tempo que a duração do SLEEP() para responder, fazendo com que o script expire. 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 use 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.