
CVE Reproduction: cve-2026-63030_60137-wordpress_rce_reproduction
Entdecker: Searchlight Cyber (via GPT-5.6 Sol)
Schweregrad: Kritisch — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Status: Aktiv ausgenutzt — zu CISA KEV hinzugefügt
Alias: "wp2shell"
Dies ist eine nicht authentifizierte Remote-Code-Ausführungskette in WordPress Core, die aus zwei CVEs besteht:
| CVE | Komponente | Typ | CWE |
|---|---|---|---|
| CVE-2026-63030 | WP REST API Batch-Endpunkt | Routenkonfusion / Zugriffskontrollumgehung | CWE-436 |
| CVE-2026-60137 | WP_Query author__not_in Parameter | SQL-Injection | CWE-89 |
Jeder einzelne Fehler ist schwerwiegend; zusammen erlauben sie einem nicht authentifizierten Angreifer, beliebiges PHP auf dem Ziel auszuführen und Webshells zu installieren.
Die WordPress REST API stellt einen Batch-Endpunkt unter /wp-json/wp/v2/batch bereit. Aufgrund eines Fehlers in der Routenauflösung (eingeführt in WPs 6.9 umgeschriebener Routing-Middleware) validiert der Batch-Prozessor nicht korrekt, dass interne Unteranfragen in einem Batch die Authentifizierungs- und Berechtigungsprüfungen der äußeren Anfrage erben. Ein Angreifer kann eine Batch-Nutzlast erstellen, die:
wp/v2/users, wp/v2/plugins) ohne die erforderlichen Berechtigungsprüfungen aufruft.WP_REST_Server::dispatch() ausnutzt, um gefälschte Routenparameter an interne Handler zu übergeben.Dies umgeht alle Authentifizierungssperren für Lese-Operationen und einige Schreib-Operationen, wenn es mit Parameterschmuggel kombiniert wird.
author__not_in SQL-InjectionDie Klasse WP_Query akzeptiert einen Parameter author__not_in, der dazu dient, Beiträge nach bestimmten Autoren-IDs auszuschließen. Ein Typenzwangsfehler in der Methode WP_Query::get_posts() (eingeführt in WPs 6.9 Refaktorierung der Abfragebereinigung) führt dazu, dass author__not_in-Werte direkt in die SQL-WHERE-Klausel interpoliert werden, ohne ordnungsgemäße Parametrisierung, wenn sie als speziell gestaltetes assoziatives Array bereitgestellt werden.
Die Injektion erfolgt im generierten SQL post_author IN (...). Durch Verschachtelung von Arrays mit rohen SQL-Fragmenten kann ein Angreifer aus der IN-Klausel ausbrechen und beliebige UNION- / INTO OUTFILE-Anweisungen ausführen – vorausgesetzt, der Datenbankbenutzer hat die FILE-Berechtigung.
Angreifer (nicht authentifiziert)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Authentifizierung umgehen, interne Abfrage-API aufrufen
│ └─ CVE-2026-60137: SQL über author__not_in injizieren
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell im Web-Root installiert
│ └─ RCE erreicht
Der Batch-Endpunkt bietet den Vektor; die SQLi bietet die Payload-Zustellung.
| Versionsbereich | Vollständige Kette |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Beide CVEs vorhanden |
| WordPress 7.0.0 – 7.0.1 | ✅ Beide CVEs vorhanden |
| WordPress ≤ 6.8.x | Nur CVE-2026-63030 (SQLi nicht ausnutzbar) |
Patches wurden in WordPress 6.9.5 und 7.0.2 veröffentlicht (beide am 16.07.2026 herausgegeben).
/wp-json/wp/v2/batch 200 zurückgibt (nicht 403/404).--target-Flag aus (siehe unten)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch am WAF / Reverse Proxy.FILE-Berechtigung vom WordPress MySQL-Benutzer.define('DISALLOW_FILE_EDIT', true); und define('DISALLOW_FILE_MODS', true);..php-Dateien unter wp-content/.author__not_in mit nicht-ganzzahligen Werten in den Anfragelogs.