
Este repositório contém um kit de pesquisa e validação prático para CVE-2025-4396, uma injeção de SQL cega baseada em tempo não autenticada que afeta o plugin Relevanssi do WordPress através do parâmetro `cats`.
Este repositório contém um kit prático de pesquisa e validação para CVE-2025-4396, uma Injeção SQL Cega Baseada em Tempo não autenticada que afeta o plugin Relevanssi do WordPress através do parâmetro cats.
O projeto foi desenvolvido para engajamentos autorizados de Purple Team com o objetivo de:
O repositório inclui:
Aviso Legal
Este projeto é fornecido apenas para fins educacionais, validação defensiva e testes de segurança autorizados.
Não o utilize contra sistemas que você não possui ou para os quais não tenha permissão explícita por escrito para avaliar.
CVE-2025-4396 é uma vulnerabilidade de Injeção SQL que afeta a funcionalidade de busca do Relevanssi no WordPress.
No cenário testado, o problema é acessível através do fluxo de busca e, mais especificamente, através do parâmetro cats. O caminho de código vulnerável permite que a entrada controlada pelo atacante influencie a consulta SQL gerada pelo plugin.
Como o endpoint vulnerável é acessível sem autenticação prévia, a falha pode ser explorada por um atacante remoto para realizar injeção SQL não autenticada.
O impacto prático inclui:
A vulnerabilidade existe porque a entrada controlada pelo usuário, vinda de um parâmetro relacionado à busca, não é tratada de forma segura antes de ser incorporada em uma consulta SQL.
Na prática, isso significa que um atacante pode injetar expressões SQL na lógica da consulta do sistema e forçar o banco de dados a avaliar condições adicionais.
A vulnerabilidade é explorada em modo cego, o que significa que a aplicação não exibe diretamente erros SQL ou resultados brutos do banco de dados.
Em vez de ler a saída da consulta na página, o atacante faz uma série de perguntas de verdadeiro/falso ao banco de dados e observa um efeito colateral:
A exploração depende de funções SQL como SLEEP() para criar uma diferença mensurável no tempo de resposta do servidor.
Isso permite que um atacante infira dados sem nunca vê-los diretamente.
Por exemplo, o atacante pode fazer perguntas como:
$?”Ao repetir esse processo, o atacante pode reconstruir um hash completo caractere por caractere.
A abordagem padrão percorre um conjunto de caracteres conhecido e testa cada candidato um por um.
Para cada posição no hash alvo:
Este método é simples e confiável, mas relativamente lento, pois pode exigir muitas requisições por caractere.
A abordagem mais rápida utiliza busca binária no valor ASCII de cada caractere.
Em vez de perguntar:
a?”b?”c?”ela pergunta:
Isso divide o espaço de busca pela metade a cada requisição e reduz drasticamente o número de requisições HTTP.
O ataque permite que o operador extraia o valor user_pass de wp_users, geralmente para um ID de usuário WordPress escolhido, como:
1 para o administrador padrão,Em versões recentes do WordPress, esse valor pode usar o novo pipeline de senhas do WordPress 6.8+, que combina:
CVE_2025_4396.pyEste é o script de extração padrão.
Ele realiza uma Injeção SQL Cega Baseada em Tempo clássica e extrai o hash alvo caractere por caractere usando uma busca linear sobre um charset fixo.
Para cada posição do caractere:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Argumentos:
-t, --target : URL alvo vulnerável, incluindo o parâmetro injetável
-u, --userid : ID do usuário WordPress a ser alvo
-s, --sleep : limite de tempo de espera em segundos
-v, --verbose : ativa o log de depuração
CVE_2025_4396_Stealth.pyEsta é a edição de busca binária.
Realiza o mesmo objetivo de extração que o script padrão, mas substitui a busca linear caractere por caractere por uma busca binária nos valores ASCII.
Para cada posição:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Após a extração do hash de senha do WordPress, o próximo passo é quebrá-lo offline.
Notas sobre Hashing do WordPress 6.8+. No fluxo testado, o valor extraído pode parecer com:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Para o Hashcat, a porção bcrypt utilizável é:
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.