
wpsqli vollständiger SQLi-Extraktor + Dumper für CVE-2026-60137
Ein schnelles, menügesteuertes Datenbankextraktions-Tool, das die
author__not_in-SQL-Injection-Schwachstelle im WordPress-Core ausnutzt. Dieses Tool konzentriert sich ausschließlich auf die Aufzählung und das Ausgeben von Datenbankinhalten und nutzt die REST-Batch-Route-Confusion (CVE-2026-63030), um die SQLi-Senke ohne Authentifizierung zu erreichen.
wpsqli ist ein reines Python-Tool, das eine verkettete Schwachstelle im WordPress-Core ausnutzt, die eine nicht authentifizierte SQL-Injection in die Datenbank ermöglicht. Es umgeht die Validierung der WordPress-REST-API über einen Batch-Route-Confusion-Bug und liefert ein rohes String-Payload direkt an die SQL-Senke von WP_Query.
Dieses Tool ist auf Geschwindigkeit und Flexibilität ausgelegt: Es versucht automatisch eine UNION-basierte In-Band-Extraktion (sofort), fällt auf eine parallele Boolean-Blind-Extraktion mit 8 Threads zurück und schließlich bei Bedarf auf eine sequenzielle zeitbasierte Extraktion.
Dieses Tool verkettet zwei unabhängige Schwachstellen, um eine nicht authentifizierte Datenbankextraktion zu erreichen:
author__not_in SQL Injection (CVE-2026-60137)Ort: wp-includes/class-wp-query.php, WP_Query::get_posts()
Der Parameter author__not_in wendet die absint()-Bereinigung nur an, wenn die Eingabe ein Array ist. Wenn ein String übergeben wird, wird die is_array()-Absicherung übersprungen, der String passiert implode() unverändert und wird roh in die SQL-$where-Klausel eingefügt.
// Line 2404: guard only fires for ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Line 2408: string passes straight through
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Line 2409: raw interpolation
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
Der Posts-Endpunkt der REST-API bildet author_exclude auf author__not_in ab, deklariert ihn jedoch als type => 'array' aus Ganzzahlen, sodass der Core einen String umwandelt bzw. zurückweist. Bug B schmuggelt den String an der Validierung vorbei, indem ein Desynchronisations-Bug im REST-Batch-Endpunkt (/wp-json/batch/v1) ausgenutzt wird. Durch die Injektion eines fehlerhaften Pfad-Primers, den wp_parse_url() ablehnt, wird ein WP_Error in die Batch-Request-Liste eingeschleust, wodurch $matches von $validation desynchronisiert wird. Dadurch kann eine nachfolgende Sub-Request ohne Parametervalidierung an den falschen Handler übergeben werden.
Hinweis: Die SQLi-Senke wird nur erreicht, wenn kein persistenter Objekt-Cache (Redis/Memcached) verwendet wird.
pip install erforderlich.wp_posts-Zeile, um ganze Strings in einer einzigen HTTP-Anfrage zu extrahieren (sofort).Ctrl+C während der Extraktion stoppt die aktuelle Abfrage und gibt Teilergebnisse zurück, ohne die Sitzung zu beenden.ID|user_login|user_pass mit bcrypt-Hashes, bereit für hashcat -m 35500.Keine Installation erforderlich. Einfach herunterladen und ausführen:
# Clone the repository
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navigate to directory
cd CVE-2026-60137
# Run
python main.py
Anforderungen:
Das interaktive Menü starten:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONNECTION
0. Connect / Change target
1. Check target (version + vuln confirm)
------------------------------------------------------------
FINGERPRINTING
2. MySQL version (@@version)
3. Current database name
4. Current DB user
5. WordPress table prefix
6. Dump wp_users (ID, login, pass hash)
7. Custom SQL query
8. Extract all fingerprints (2+3+4+5)
------------------------------------------------------------
ENUMERATION
9. List all databases
10. List all tables (current DB)
11. List columns of a table
------------------------------------------------------------
DUMPING
12. Dump a specific table
13. Dump all tables (current DB)
14. Full dump to file (all tables + all rows)
------------------------------------------------------------
15. Exit
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
| Option | Beschreibung |
|---|---|
0 | Mit einem Ziel verbinden (bereinigt URLs automatisch) |
1 | Schwachstelle und aktiven Extraktionsmodus verifizieren |
| Option | Beschreibung |
|---|---|
9 | Alle Datenbanken auf dem MySQL-Server auflisten |
10 | Alle Tabellen in der aktuellen oder angegebenen Datenbank auflisten |
11 | Alle Spaltennamen für eine bestimmte Tabelle auflisten |
| Option | Beschreibung |
|---|---|
12 | Eine einzelne Tabelle ausgeben (mit optionalem Zeilenlimit und Dateispeicherung) |
13 | Alle Tabellen in der aktuellen Datenbank ausgeben |
14 | Kompletter Nuclear-Dump — alle Tabellen + alle Zeilen in eine Datei mit Zeitstempel |
Das Tool versucht automatisch drei Extraktionsmodi in der Reihenfolge ihrer Geschwindigkeit:
Erstellt eine gefälschte wp_posts-Zeile, wobei der extrahierte Wert hex-kodiert in der Spalte post_title (eingebettet in ||..||-Marker) liegt. Die REST-API spiegelt ihn in der Antwort zurück — der gesamte String in einer einzigen HTTP-Anfrage.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c), um das Ergebnis zu kodierenWenn UNION nicht verfügbar ist, werden 8 parallele Threads mit binärer Suche verwendet, um jedes Zeichen zu extrahieren. Das Boolean-Orakel prüft, ob das injizierte AND (condition) Zeilen zurückgibt.
Fallback, wenn das Boolean-Orakel keine Zeilen zurückgibt (z. B. bei einer Website mit 0 veröffentlichten Beiträgen). Verwendet IF(condition, SLEEP(N), 0), um Wahrheit in der Antwortlatenz zu kodieren.
Dieses Tool ist ausschließlich für autorisierte Sicherheitstests und Bildungszwecke konzipiert. Sie dürfen dieses Tool nur gegen Systeme verwenden, die Ihnen gehören oder für deren Test Sie eine ausdrückliche schriftliche Genehmigung besitzen. Unbefugter Zugriff auf Computersysteme ist illegal.
Die Autoren und Mitwirkenden dieses Tools sind nicht für Missbrauch oder Schäden verantwortlich, die durch diese Software verursacht werden. Nutzung auf eigene Gefahr
Dieses Tool wird ausschließlich für Bildungs- und autorisierte Testzwecke bereitgestellt.
| Versionsbereich | Status |
|---|
| 6.8.0 – 6.8.5 | SQLi-Bug vorhanden, aber Kette NICHT erreichbar (Batch-Confusion in 6.9.0 eingeführt) |
| 6.9.0 – 6.9.4 | VERWUNDBAR — vollständige Kette ohne Authentifizierung |
| 7.0.0 – 7.0.1 | VERWUNDBAR — vollständige Kette ohne Authentifizierung |
| 6.8.6 | Gepatcht (SQLi) |
| 6.9.5 | Gepatcht |
| 7.0.2 | Gepatcht |
| 7.1-beta2+ | Gepatcht |
| Option | Beschreibung |
|---|
2 | MySQL-Version extrahieren (SELECT @@version) |
3 | Aktuellen Datenbanknamen extrahieren (SELECT DATABASE()) |
4 | Aktuellen DB-Benutzer extrahieren (SELECT CURRENT_USER()) |
5 | WordPress-Tabellenpräfix extrahieren |
6 | wp_users-Tabelle ausgeben (ID, Login, Passwort-Hash) |
7 | Eine benutzerdefinierte SQL-Abfrage ausführen |
8 | Alle Fingerprints (Optionen 2-5) nacheinander ausführen |
| Modus | Anfragen pro Abfrage | Geschwindigkeit | Wann verwendet |
|---|
| UNION | 1 | Sofort | Kein Objekt-Cache, Spaltenanzahl passt |
| Boolean (8 Threads) | ~7 × string_length / 8 | Schnell | UNION blockiert, Zeilen vorhanden |
| Zeitbasiert | ~7 × sleep × string_length | Langsam | Keine Zeilen für das Boolean-Orakel |
| Extraktion | Zeichen | Anfragen | Zeit |
|---|
| MySQL-Version | ~20 | ~140 | ~15s |
| Datenbankname | ~15 | ~105 | ~12s |
| DB-Benutzer | ~25 | ~175 | ~20s |
| Tabellenpräfix | ~5 | ~35 | ~5s |
| wp_users-Zeile (200 Zeichen) | 200 | ~1400 | ~2min |