
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 repositorio contiene un kit práctico de investigación y validación para CVE-2025-4396, una Inyección SQL Ciega Basada en Tiempo sin autenticación que afecta al plugin Relevanssi de WordPress a través del parámetro cats.
El proyecto fue creado para ejercicios autorizados de Purple Team con el fin de:
El repositorio incluye:
Aviso legal
Este proyecto se proporciona únicamente con fines educativos, validación defensiva y pruebas de seguridad autorizadas.
No lo utilice contra sistemas que no posea o para los que no tenga permiso explícito por escrito para evaluar.
CVE-2025-4396 es una vulnerabilidad de Inyección SQL que afecta a la funcionalidad de búsqueda de Relevanssi en WordPress.
En el escenario probado, el problema es accesible a través del flujo de búsqueda y, más específicamente, a través del parámetro cats. La ruta de código vulnerable permite que la entrada controlada por el atacante influya en la consulta SQL generada por el plugin.
Debido a que el punto final vulnerable es accesible sin autenticación previa, la falla puede ser explotada por un atacante remoto para realizar una inyección SQL sin autenticación.
El impacto práctico incluye:
La vulnerabilidad existe porque la entrada controlada por el usuario proveniente de un parámetro relacionado con la búsqueda no se maneja de forma segura antes de incorporarse a una consulta SQL.
En la práctica, esto significa que un atacante puede inyectar expresiones SQL en la lógica de consulta del backend y forzar a la base de datos a evaluar condiciones adicionales.
La vulnerabilidad se explota en modo ciego, lo que significa que la aplicación no muestra directamente errores SQL ni resultados sin procesar de la base de datos.
En lugar de leer la salida de la consulta desde la página, el atacante le hace a la base de datos una serie de preguntas de verdadero/falso y observa un efecto secundario:
La explotación se basa en funciones SQL como SLEEP() para crear una diferencia medible en el tiempo de respuesta del servidor.
Esto permite a un atacante inferir datos sin verlos directamente.
Por ejemplo, el atacante puede hacer preguntas como:
$?"Al repetir este proceso, el atacante puede reconstruir un hash completo carácter por carácter.
El enfoque estándar itera a través de un conjunto de caracteres conocido y prueba cada candidato uno por uno.
Para cada posición en el hash objetivo:
Este método es simple y confiable, pero relativamente lento porque puede requerir muchas solicitudes por carácter.
El enfoque más rápido utiliza una búsqueda binaria sobre el valor ASCII de cada carácter.
En lugar de preguntar:
a?"b?"c?"pregunta:
Esto divide el espacio de búsqueda a la mitad en cada solicitud y reduce drásticamente el número de peticiones HTTP.
El ataque permite al operador extraer el valor user_pass de wp_users, típicamente para un ID de usuario de WordPress elegido, como:
1 para el administrador predeterminado,En versiones recientes de WordPress, este valor puede usar el nuevo pipeline de contraseñas de WordPress 6.8+, que combina:
CVE_2025_4396.pyEste es el script de extracción estándar.
Realiza una Inyección SQL Ciega Basada en Tiempo clásica y extrae el hash objetivo carácter por carácter mediante una búsqueda lineal sobre un conjunto de caracteres fijo.
Para cada posición de carácter:
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 objetivo vulnerable incluyendo el parámetro inyectable
-u, --userid : ID de usuario de WordPress al que apuntar
-s, --sleep : umbral de sueño en segundos
-v, --verbose : habilita el registro de depuración
CVE_2025_4396_Stealth.pyEsta es la edición de búsqueda binaria.
Realiza el mismo objetivo de extracción que el script estándar, pero reemplaza la búsqueda lineal carácter por carácter con una búsqueda binaria sobre valores ASCII.
Para cada posición:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Una vez que se ha extraído el hash de contraseña de WordPress, el siguiente paso es descifrarlo fuera de línea.
Notas sobre el Hash en WordPress 6.8+. En el flujo de trabajo probado, el valor extraído puede verse así:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Para Hashcat, la porción bcrypt utilizable es:
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Sin embargo, este bcrypt no se aplica directamente a la contraseña sin procesar. WordPress primero aplica una etapa de preprocesamiento:
Esto significa que una lista de palabras normal no se puede enviar directamente a Hashcat si se desea reproducir la lógica exacta de WordPress 6.8+.
En su lugar, cada contraseña candidata debe transformarse primero en su representación de pre-hash compatible con WordPress.
El repositorio también incluye un script "auxiliar" que:
$wp$ cuando sea necesario,Extraer el hash :
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.Preparar el entorno de descifrado :
python3hashcat y disponible en PATHEjecutar Auto_Crack.py :
python3 Auto_Crack.py -H '\$wp\$2y\$10\$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.' -w /usr/share/wordlists/rockyou.txt
Es necesario escapar "$" con "\" -> compatibilidad con bash
El siguiente contenido de detección puede ser utilizado por los equipos del SOC para identificar intentos de explotación y medir la madurez defensiva.
title: Potential Time-Based Blind SQLi (CVE-2025-4396 Relevanssi)
id: 5a8a1c93-5c74-4b5b-a620-8e1c3e41ab5d
status: experimental
description: Detects HTTP GET requests containing typical Time-Based Blind SQL injection payloads often used to exploit CVE-2025-4396 in the WordPress Relevanssi plugin (bypassing comma filters).
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:
- Highly unlikely. Legitimate search queries should not contain SQL functions.
level: high
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"ET EXPLOIT WordPress Relevanssi SQLi Attempt (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]
Las detecciones base anteriores son buenas para explotación no ofuscada, pero se debilitan cuando un operador introduce tácticas más avanzadas.
La visibilidad del SOC se degrada cuando el atacante comienza a usar:
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
Úselo solo en entornos donde tenga autorización explícita para realizar pruebas. Los autores y colaboradores no asumen ninguna responsabilidad por su uso indebido.
Aviso legal
Este proyecto se proporciona únicamente con fines educativos, validación defensiva y pruebas de seguridad autorizadas.
No lo utilice contra sistemas que no posea o para los que no tenga permiso explícito por escrito para evaluar.