
This repository contains a practical research and validation toolkit for CVE-2025-4396, an unauthenticated Time-Based Blind SQL Injection affecting the WordPress Relevanssi plugin through the `cats` parameter.
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.
No entanto, este bcrypt não é aplicado diretamente à senha bruta. O WordPress primeiro aplica uma etapa de pré-processamento:
Isso significa que uma wordlist normal não pode ser enviada diretamente ao Hashcat se você deseja reproduzir a lógica exata do WordPress 6.8+.
Em vez disso, cada senha candidata deve ser transformada primeiro em sua representação de pré-hash compatível com o WordPress.
O repositório também inclui um script "auxiliar" que:
$wp$ quando necessário,Extraia o hash:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.Prepare o ambiente de cracking:
python3hashcat disponível no PATHExecute Auto_Crack.py:
python3 Auto_Crack.py -H '\$wp\$2y\$10\$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.' -w /usr/share/wordlists/rockyou.txt
Precisamos escapar "$" com "\" -> compatibilidade com bash
O seguinte conteúdo de detecção pode ser usado pelas equipes de SOC para identificar tentativas de exploração e medir a maturidade defensiva.
title: Potential Time-Based Blind SQLi (CVE-2025-4396 Relevanssi)
id: 5a8a1c93-5c74-4b5b-a620-8e1c3e41ab5d
status: experimental
description: Detecta requisições HTTP GET contendo payloads típicos de Injeção SQL Cega Baseada em Tempo frequentemente usados para explorar CVE-2025-4396 no plugin Relevanssi do WordPress (contornando filtros de vírgula).
author: n3fhara
date: 2026-03-18
tags:
- attack.initial_access
- attack.t1190
- cve.2025-4396
logsource:
category: webserver
detection:
selection_endpoint:
cs-uri-query|contains:
- 's='
- 'cats='
- 'tags='
selection_payload:
cs-uri-query|contains:
- 'SLEEP('
- 'WAITFOR'
- 'SUBSTRING('
- 'ASCII('
- 'LENGTH('
selection_bypass_indicators:
cs-uri-query|contains:
- 'FROM'
- 'FOR 1'
- '*('
condition: selection_endpoint and selection_payload and selection_bypass_indicators
falsepositives:
- Altamente improvável. Consultas de busca legítimas não devem conter funções SQL.
level: high
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"ET EXPLOIT Tentativa de SQLi no WordPress Relevanssi (CVE-2025-4396)"; flow:established,to_server; content:"GET"; http_method; content:"cats="; http_uri; pcre:"/(cats|tags)=.*(SLEEP|WAITFOR)%28.*(%2A|\*).*SUBSTRING/i"; classtype:web-application-attack; sid:1000001; rev:1; metadata:created_at 2026_03_18, cve CVE_2025_4396;)
index=web_logs sourcetype=access_combined
| regex uri_query="(?i)cats=|tags="
| stats count as request_count, avg(response_time) as avg_time, max(response_time) as max_time, dc(uri_query) as unique_payloads by clientip
| where request_count > 20 AND max_time > 2000
| sort - max_time
url.query : (*cats=* OR *tags=* OR *s=*) AND url.query : (*SLEEP* OR *WAITFOR* OR *SUBSTRING* OR *ASCII*) AND url.query : (*FROM* OR *FOR* OR *%2A*)
sequence by source.ip with maxspan=1m
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
As detecções de base acima são boas para exploração não ofuscada, mas tornam-se mais fracas quando um operador introduz táticas mais avançadas.
A visibilidade do SOC degrada quando o atacante começa a usar:
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
Use apenas em ambientes onde você está explicitamente autorizado a testar. Os autores e contribuidores não assumem nenhuma responsabilidade por uso indevido.
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.