
Reproducción de CVE: cve-2026-63030_60137-wordpress_rce_reproduction
Descubridor: Searchlight Cyber (via GPT-5.6 Sol)
Gravedad: Crítica — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Estado: Explotado activamente — añadido al CISA KEV
Alias: "wp2shell"
Esta es una cadena de ejecución remota de código no autenticada en el núcleo de WordPress compuesta por dos CVEs:
| CVE | Componente | Tipo | CWE |
|---|---|---|---|
| CVE-2026-63030 | WP REST API batch endpoint | Confusión de ruta / omisión de control de acceso | CWE-436 |
| CVE-2026-60137 | WP_Query author__not_in parameter | Inyección SQL | CWE-89 |
Individualmente, cada fallo es grave; combinados permiten a un atacante no autenticado ejecutar PHP arbitrario en el objetivo y desplegar webshells.
La API REST de WordPress expone un endpoint batch en /wp-json/wp/v2/batch. Debido a un fallo en la resolución de rutas (introducido en el middleware de enrutamiento reescrito de WP 6.9), el procesador batch no valida correctamente que las sub-solicitudes internas en un batch hereden las comprobaciones de autenticación y permisos de la solicitud externa. Un atacante puede crear un payload batch que:
wp/v2/users, wp/v2/plugins) sin las comprobaciones de capacidad requeridas.WP_REST_Server::dispatch() para pasar parámetros de ruta falsificados a los manejadores internos.Esto evita todas las protecciones de autenticación para operaciones de lectura y algunas operaciones de escritura cuando se combina con contrabando de parámetros.
author__not_inLa clase WP_Query acepta un parámetro author__not_in destinado a excluir entradas por IDs de autor específicos. Un error de coerción de tipos en el método WP_Query::get_posts() (introducido en la refactorización de saneamiento de consultas de WP 6.9) hace que los valores de author__not_in se interpolen directamente en la cláusula WHERE de SQL sin la parametrización adecuada cuando se suministran como un array asociativo especialmente diseñado.
La inyección ocurre en el SQL generado post_author IN (...). Al anidar arrays con fragmentos SQL sin procesar, un atacante puede salir de la cláusula IN y ejecutar sentencias UNION / INTO OUTFILE arbitrarias — siempre que el usuario de la base de datos tenga el privilegio FILE.
Atacante (no autenticado)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Omitir autenticación, invocar API de consulta interna
│ └─ CVE-2026-60137: Inyectar SQL mediante author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell desplegada en la raíz web
│ └─ RCE lograda
El endpoint batch proporciona el vector; la SQLi proporciona la entrega del payload.
| Rango de versiones | Cadena completa |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Ambos CVEs presentes |
| WordPress 7.0.0 – 7.0.1 | ✅ Ambos CVEs presentes |
| WordPress ≤ 6.8.x | CVE-2026-63030 solo (SQLi no explotable) |
Los parches se enviaron en WordPress 6.9.5 y 7.0.2 (ambos emitidos el 2026-07-16).
/wp-json/wp/v2/batch devuelva 200 (no 403/404).--target (ver abajo)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch en el WAF / proxy inverso.FILE del usuario MySQL de WordPress.define('DISALLOW_FILE_EDIT', true); y define('DISALLOW_FILE_MODS', true);..php inesperados en wp-content/.author__not_in con valores no enteros en los registros de solicitudes.