
CVE-2026-63030 & CVE-2026-60137 RCE-Kette Proof-of-Concept
⚠ Dieses Tool dient ausschließlich zu Bildungs- oder Bug-Bounty-Zwecken. Unautorisierte Nutzung außerhalb kontrollierter Umgebungen ist strengstens untersagt.
Proof-of-Concept für die wp2shell-Verwundbarkeitskette, die den WordPress Core betrifft und CVE-2026-63030 mit CVE-2026-60137 kombiniert. Das Projekt demonstriert das Zusammenspiel zwischen der REST-API-Batch-Routen-Verwechslungs-Verwundbarkeit und einer WP_Query-SQL-Injection, was einen unauthentifizierten Weg zur vollständigen WordPress-Übernahme und Remote Code Execution (RCE) ermöglicht.
Die vollständige Sicherheitsmeldung finden Sie hier
wp2shell ist eine Pre-Authentication-RCE-Kette im WordPress Core, die CVE-2026-63030 (Routen-Verwechslung im Batch-REST-Endpunkt) und CVE-2026-60137 (SQL-Injection in WP_Query) kombiniert.
Die Routen-Verwechslung: /wp-json/batch/v1 verarbeitet mehrere Unteranfragen über parallele $matches- und $validation-Arrays, die nach Position indiziert sind. Eine Unteranfrage mit einem fehlerhaften Pfad (z. B. http://) wird an $validation angehängt, aber aufgrund einer -Anweisung nicht an , wodurch die Arrays desynchronisiert werden. Spätere Anfragen werden unter dem Handler verarbeitet, der für die Anfrage vorgesehen ist, wodurch Schema-Validierung und Berechtigungsprüfungen umgangen werden.
continue$matchesDie SQL-Injection: Zwei verschachtelte Batch-Aufrufe nutzen dies aus. Der äußere Batch umgeht die Methoden-Allowlist (die normalerweise GET blockiert). Der innere Batch liefert eine skalare author_exclude-Zeichenkette an GET /wp/v2/posts – die Desynchronisation leitet sie an der Validierung vorbei, und WP_Query interpoliert die nicht bereinigte Zeichenkette direkt in SQL, was eine UNION-basierte Blind-Injection ergibt.
Cache-Vergiftung: Die SQLi gibt gefälschte WP_Post-Objekte zurück, die WordPress im Speicher zwischenspeichert. Diese gefälschten Beiträge enthalten [embed]-Shortcodes, die WordPress dazu veranlassen, echte oembed_cache-Datenbankzeilen aus den gefälschten Referenzen zu erstellen.
Changeset-Eskalation: Mithilfe der SQLi fälscht der Angreifer einen customize_changeset-Beitrag im Speicher, dessen JSON "user_id": 1 enthält. Ein Zykluserkennungs-Gadget löst wp_update_post() aus, ohne post_content zu überschreiben, wodurch die Nutzlast des Angreifers erhalten bleibt. Die Anwendung des Changesets übernimmt vorübergehend die Identität des Administrators.
Hook-Wiedereintritt: Ein fabrizierter Beitrag mit dem Status parse und dem Typ request löst den parse_request-Hook aus und spielt die gesamte Batch-Anfrage mit der angenommenen Admin-Rolle erneut ab. Diesmal ist eine POST /wp/v2/users-Unteranfrage erfolgreich und erstellt ein neues Admin-Konto.
Code-Ausführung: Der Angreifer meldet sich als der erstellte Admin an und lädt ein schädliches Plugin hoch, um beliebige Befehle auszuführen.
| Version | Status |
|---|---|
| WordPress 6.9.0 – 6.9.4 | Verwundbar |
| WordPress 7.0.0 – 7.0.1 | Verwundbar |
| WordPress 6.9.5 | Behoben |
| WordPress 7.0.2+ | Behoben |
Zur Nutzung dieses PoC ist lediglich Python 3.8+ erforderlich.
Führen Sie es aus dem Repository-Verzeichnis aus, um eine Verwundbarkeitsprüfung durchzuführen:
wp2shell.py http://victim.com
Führt eine einzelne Verwundbarkeitsprüfung durch. Sendet eine harmlose Batch-Marker-Sonde, die den Routen-Verwechslungs-Bug erkennt, ohne SQLi-Nutzlasten auszuführen. Ein verwundbares Ziel gibt HTTP 207 mit dem Fehlermuster parse_path_failed, block_cannot_read und rest_batch_not_allowed zurück.
Verwenden Sie --confirm-sqli, um zusätzlich eine aktive SQLi-Bestätigungsnutzlast zu senden. Die Bestätigung versucht zuerst UNION-Reflexion und fällt dann auf zeitbasierte Sonden zurück.
Einzelnes Ziel prüfen (Standardmodus)
wp2shell.py http://target.com
Mit explizitem Modus prüfen
Mit explizitem Modus prüfen
wp2shell.py http://target.com --check
Mit SQLi-Bestätigung prüfen
wp2shell.py http://target.com --check --confirm-sqli
Extrahiert Daten aus der Datenbank mithilfe der Pre-Authentication-SQL-Injection. Standardmäßig wird --technique auto verwendet, das verfügbare Methoden in dieser Reihenfolge ausprobiert:
WP_Post-Zeile über UNION und liest deren Titel als ||HEX(value)|| aus der REST-Antwort zurück. Eine Anfrage pro Wert. Am schnellsten.EXTRACTVALUE/UPDATEXML, um ~15 Bytes pro Anfrage auszulesen. Funktioniert, wenn das Ziel MySQL-Fehler widerspiegelt (z. B. wenn WP_DEBUG_DISPLAY aktiviert ist).X-WP-Total-Header als Wahr/Falsch-Signal. Funktioniert auch, wenn keine Daten reflektiert werden.Erzwingen Sie eine bestimmte Technik mit --technique union|error|blind. Diese Lesepfade sind schreibgeschützt und schreiben nicht in die Datenbank.
Server-Fingerabdruck (Standardabfrage)
wp2shell.py http://target.com --read
Logins und Passwort-Hashes ausgeben
wp2shell.py http://target.com --read --preset users
Benutzerdefinierte SQL-Abfrage
wp2shell.py http://target.com --read --query "SELECT @@version"
Blind-Technik erzwingen
wp2shell.py http://target.com --read --technique blind --query "SELECT user_login FROM wp_users LIMIT 1"
Mit error-basierter Technik extrahieren
wp2shell.py http://target.com --read --technique error --query "SELECT user_pass FROM wp_users LIMIT 1"
Führt Befehle auf dem Zielserver aus. Funktioniert in zwei Modi:
Mit Anmeldedaten (meldet sich als bestehender Admin an und lädt Plugin-Shell hoch):
Bestimmten Befehl ausführen
wp2shell.py http://target.com --shell --user admin --password '<wiederhergestellt>' --cmd id
Interaktive Shell
wp2shell.py http://target.com --shell --user admin --password '<wiederhergestellt>' --interactive
Ohne Anmeldedaten (Pre-Auth-RCE – führt die vollständige SQLi→Admin-Brücke aus, meldet sich als generierter Admin an und lädt dann die Plugin-Shell hoch):
Einzelnen Befehl ausführen
wp2shell.py http://target.com --shell --cmd id
Interaktive Shell
wp2shell.py http://target.com --shell --interactive
Die Plugin-Webshell wird mit einem zufälligen Pfad und einem Pro-Lauf-Token hochgeladen. Die hochgeladene Webshell wird automatisch entfernt. Wenn die Pre-Auth-Brücke einen Administrator erstellt, wird dieses generierte Konto nach Abschluss der Shell-Sitzung automatisch entfernt.
Liste aller Flags:
| Flag | Beschreibung |
|---|---|
--check | Verwundbarkeitsprüfung ausführen (Standardmodus, wenn kein anderer Modus angegeben ist) |
--read | Daten per SQL-Injection extrahieren |
--shell | Befehle auf dem Server ausführen |
--query | Benutzerdefinierte SQL-Abfrage für den Lesemodus |
--preset | Vordefinierte Abfragevoreinstellung (users, config, versions) |
--technique | SQLi-Extraktionstechnik: union, error, blind oder auto (Standard) |
--confirm-sqli | SQLi-Bestätigungsnutzlast nach der Prüfung senden |
--cmd | Auszuführender Befehl im Shell-Modus (Standard: id) |
--interactive, -i | Interaktiver Shell-Modus |
--user | Admin-Benutzername für die authentifizierte Shell |
--password | Admin-Passwort für die authentifizierte Shell |
--proxy | HTTP/HTTPS-Proxy (z. B. http://127.0.0.1:8080) |
--timeout | Anfrage-Timeout in Sekunden (Standard: 30) |
--verbose, -v | Ausführliche Ausgabe |
Dieses Tool dient ausschließlich zu Bildungs- oder Bug-Bounty-Zwecken. Unautorisierte Nutzung außerhalb kontrollierter Umgebungen ist strengstens untersagt.