
Riproduzione CVE: cve-2026-63030_60137-wordpress_rce_reproduction
Scoperto da: Searchlight Cyber (tramite GPT-5.6 Sol)
Gravità: Critica — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Stato: Attivamente sfruttata — aggiunta al catalogo CISA KEV
Alias: "wp2shell"
Questa è una catena di esecuzione remota di codice non autenticata nel WordPress Core composta da due CVE:
| CVE | Componente | Tipo | CWE |
|---|
| CVE-2026-63030 | Endpoint batch API REST WP | Confusione di route / bypass dei controlli di accesso | CWE-436 |
| CVE-2026-60137 | Parametro author__not_in di WP_Query | SQL injection | CWE-89 |
Singolarmente ogni vulnerabilità è grave; combinate consentono a un attaccante non autenticato di eseguire PHP arbitrario sul target e di distribuire webshell.
L'API REST di WordPress espone un endpoint batch all'indirizzo /wp-json/wp/v2/batch. A causa di un difetto nella risoluzione delle route (introdotto nel middleware di routing riscritto di WP 6.9), il processore batch non valida correttamente che le interne sotto-richieste in un batch ereditino i controlli di autenticazione e autorizzazione della richiesta esterna. Un attaccante può creare un payload batch che:
wp/v2/users, wp/v2/plugins) senza i necessari controlli sulle capability.WP_REST_Server::dispatch() per passare parametri di route falsificati agli handler interni.Questo bypassa tutte le protezioni di autenticazione per le operazioni di lettura e alcune operazioni di scrittura se combinato con il contrabbando di parametri.
author__not_inLa classe WP_Query accetta un parametro author__not_in pensato per escludere i post di specifici ID autore. Un bug di coercizione del tipo nel metodo WP_Query::get_posts() (introdotto nella refactoring della sanitizzazione delle query di WP 6.9) fa sì che i valori di author__not_in vengano interpolati direttamente nella clausola SQL WHERE senza una corretta parametrizzazione quando vengono forniti come array associativo appositamente costruito.
L'iniezione avviene nel SQL generato post_author IN (...). Annidando array con frammenti SQL grezzi, un attaccante può uscire dalla clausola IN ed eseguire istruzioni UNION / INTO OUTFILE arbitrarie — a condizione che l'utente del database abbia il privilegio FILE.
Attacker (unauthenticated)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Bypass auth, invoke internal query API
│ └─ CVE-2026-60137: Inject SQL via author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell deployed to web root
│ └─ RCE achieved
L'endpoint batch fornisce il vettore; la SQLi fornisce la consegna del payload.
| Intervallo di versioni | Catena completa |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Entrambe le CVE presenti |
| WordPress 7.0.0 – 7.0.1 | ✅ Entrambe le CVE presenti |
| WordPress ≤ 6.8.x | Solo CVE-2026-63030 (SQLi non sfruttabile) |
Le patch sono state distribuite in WordPress 6.9.5 e 7.0.2 (entrambe rilasciate il 16-07-2026).
/wp-json/wp/v2/batch restituisca 200 (non 403/404).--target (vedi sotto)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch al WAF / reverse proxy.FILE dall'utente MySQL di WordPress.define('DISALLOW_FILE_EDIT', true); e define('DISALLOW_FILE_MODS', true);..php inattesi sotto wp-content/.author__not_in con valori non interi.