
RCE no autenticado en el núcleo de WordPress (CVE-2026-63030 + CVE-2026-60137)
Explota la confusión de rutas de la API REST de WordPress (CVE-2026-63030) + la inyección SQL (CVE-2026-60137) en el endpoint por lotes para lograr la ejecución remota de código.
El endpoint por lotes (/batch/v1) de la API REST de WordPress no aísla correctamente el enrutamiento de las solicitudes. Al anidar solicitudes por lotes unas dentro de otras, un atacante puede realizar solicitudes internas que evitan las comprobaciones de permisos normales de WordPress. El indicador clave es el patrón de error parse_path_failed + block_cannot_read en la respuesta — esto confirma que la confusión de rutas es explotable.
Cuando una solicitud se enruta erróneamente a través del endpoint por lotes, el parámetro author_exclude en GET /wp/v2/posts no se sanea correctamente. Esto permite la inyección SQL mediante consultas apiladas y sentencias UNION, todo sin autenticación.
Fase 1: Sondeo
─────────────
Comprobar que el endpoint por lotes es accesible (HTTP 207)
Verificar la confusión de rutas mediante solicitudes de marcador
Confirmar la inyección SQL mediante temporización/oráculo
Fase 2: UNION → RCE (vía rápida)
─────────────────────────────
Si la inyección UNION funciona:
1. Detectar el prefijo de tablas (a ciegas o por fuerza bruta con los comunes)
2. CREAR USUARIO ADMIN mediante consultas UNION INSERT apiladas
- Hash Bcrypt generado vía PHP en la máquina del atacante
- Insertar fila en {prefix}_users + {prefix}_usermeta
- El nuevo usuario obtiene capacidades de administrador
3. Iniciar sesión + Desplegar webshell como plugin de WordPress
4. Ejecutar comandos mediante ?t=TOKEN&c=id
Fase 3: A ciegas → Hash (vía de respaldo)
─────────────────────────────────
Si UNION está bloqueado pero la inyección SQL a ciegas funciona:
1. Extraer versión de MySQL, usuario y nombre de la base de datos
2. Extraer el prefijo de tablas de information_schema
3. Extraer el hash del administrador de {prefix}_users WHERE id=1
4. Romper offline: hashcat -m 3200 hash.txt wordlist.txt
5. Usar --user / --pass --cmd id con la contraseña rota
Fase 4: Inicio de sesión con credenciales
──────────────────────
Si se proporcionan --user/--pass:
1. Iniciar sesión vía wp-login.php o REST API Basic Auth
2. Subir webshell como plugin
3. Ejecutar comandos
# Modo automático: comprobar, UNION, crear admin, desplegar webshell
python3 wp2shell.py https://target.com
# Con credenciales conocidas (p. ej., tras romper el hash)
python3 wp2shell.py https://target.com --user admin --pass P@ssw0rd --cmd id
# Solo UNION (omitir el respaldo a ciegas)
python3 wp2shell.py https://target.com --union-only
# Solo extracción a ciegas (omitir el intento UNION)
python3 wp2shell.py https://target.com --blind-only
# Depuración mediante proxy
python3 wp2shell.py https://target.com --proxy http://127.0.0.1:8080
# Duración personalizada de SLEEP para la inyección a ciegas basada en tiempo (por defecto 0.01s)
python3 wp2shell.py https://target.com --sleep 0.5
Esta herramienta es solo para pruebas de seguridad autorizadas. Debes tener permiso explícito del propietario del objetivo antes de usarla. El acceso no autorizado a sistemas informáticos es ilegal.
| Flag | Descripción |
|---|
--proxy | Proxy HTTP (p. ej., Burp Suite) |
--user | Nombre de usuario administrador para el inicio de sesión |
--pass | Contraseña del administrador |
--cmd | Comando a ejecutar en el objetivo |
--union-only | Omitir la extracción a ciegas |
--blind-only | Omitir el intento UNION |
--sleep | Segundos de SLEEP para la inyección a ciegas basada en tiempo |