Найти в Дзене
B0rn2beR00T

Решение Server-side Attacks (Skills Assessment)

Приветствую! В новой статье разберём Skills Assessment модуля HTB Server-side Attacks, посвящённый SSTI-атаке. Приступим к разбору! SSTI (Server-Side Template Injection) — это уязвимость, при которой злоумышленник может внедрять произвольный код в шаблоны, обрабатываемые на стороне сервера. Уязвимость возникает когда веб-приложение использует шаблонизатор (Jinja2, Twig, Freemarker и т.д.) для динамической генерации контента, но при этом некорректно обрабатывает пользовательские данные. Если пользовательский ввод передается прямо в шаблон без надлежащей фильтрации или экранирования, злоумышленник может внедрить в него специальные конструкции шаблонизатора. Процесс выявления уязвимости SSTI аналогичен процессу выявления любой другой уязвимости, связанной с внедрением кода, например SQL-инъекции. Наиболее эффективный способ — внедрить специальные символы, имеющие семантическое значение в шаблонизаторах, и наблюдать за поведением веб-приложения. Для большей наглядности продемонстрирую прос
Оглавление

Приветствую!

В новой статье разберём Skills Assessment модуля HTB Server-side Attacks, посвящённый SSTI-атаке. Приступим к разбору!

Немного теории

SSTI (Server-Side Template Injection) — это уязвимость, при которой злоумышленник может внедрять произвольный код в шаблоны, обрабатываемые на стороне сервера.

Уязвимость возникает, когда веб-приложение использует шаблонизатор (Jinja2, Twig, Freemarker и т.д.) для динамической генерации контента, но при этом некорректно обрабатывает пользовательские данные. Если пользовательский ввод передается прямо в шаблон без надлежащей фильтрации или экранирования, злоумышленник может внедрить в него специальные конструкции шаблонизатора.

Процесс выявления уязвимости SSTI аналогичен процессу выявления любой другой уязвимости, связанной с внедрением кода, например SQL-инъекции. Наиболее эффективный способ — внедрить специальные символы, имеющие семантическое значение в шаблонизаторах, и наблюдать за поведением веб-приложения.

Для большей наглядности продемонстрирую простой кейс:

На хосте используется серверный шаблонизатор, который формирует страницу приветствия на основе введённого имени пользователя. Значение, введённое пользователем, без должной фильтрации напрямую подставляется в шаблон.

-2

Для проверки наличия SSTI использовали простую тестовую полезную нагрузку: {{3*3}}.

Данная конструкция характерна для популярных шаблонизаторов и позволяет определить, выполняется ли выражение на стороне сервера.

-3

После отправки запроса сервер обработал выражение внутри шаблона и вернул результат вычисления: 9.

Это указывает на то, что введённые данные интерпретируются как часть шаблона, а не как обычный текст.

Решаем Skills Assessment

На первый взгляд web-приложение кажется совсем бесполезным. Никаких фич явных нет и функционал особо не ясен.

-4

Если покопаться глубже, то можно заметить код предназначенный для определения местоположения грузовиков с идентификаторами "FusionExpress01", "FusionExpress02" и "FusionExpress03".

-5

На корневую конечную точку сервера ('/') отправляется синхронный POST-запрос для каждого идентификатора грузовика в списке. Ожидается, что сервер вернет текущее местоположение каждого грузовика в формате JSON. Затем скрипт обновляет HTML-элемент, соответствующий каждому идентификатору грузовика, указывая либо местоположение грузовика, либо сообщение об ошибке, если местоположение не удалось получить.

Чуть далее находим интересные POST-запросы к конечной точке api=http://truckapi.htb/?id%3DFusionExpress01

-6

Отправленный в теле POST-запроса, возвращает идентификатор грузовика, а также его местоположение в формате JSON.

Изменив идентификатор грузовика с помощью полезной нагрузки {{7*7}}, можно убедиться, что сервер уязвим к SSTI.

В теле запроса указываем следующее: api=http://truckapi.htb/?id%3D{{7*7}}

-7

Попробуем определить шаблонизатор. При срабатывании пейлоада {{7*7}} можем с уверенностью сказать, что это Jinja или Twig. Сузим наш круг подозреваемых и используем нагрузку {{7*'7'}}:

-8
В Jinja результатом при внедрении {{7*'7'}} будет 7777777, а в Twig — 49.

Теперь, когда мы знаем, что работаем с Twig, нужно найти пейлоад для реализации RCE.

Ещё один способ определить шаблонизатор: {{ _self }}

-9

В Twig мы можем использовать ключевое слово _self для получения небольшой информации о текущем шаблоне.

Строка __string_template__f050969002a0e70c537fbc89f966065a - это хеш-идентификатор кешированного шаблона в Twig. Это связано с тем, что Twig компилирует шаблоны в PHP классы для повышения производительности. При кешировании он генерирует уникальные имена классов.

Перебрав всё что можно для Twig нашёл следующий пейлоад, который сработал корректно: {{ ['id'] | filter('system') }}7'}}

-10

Команда id на хосте выполнилась. Теперь прочитаем содержимое флага:

{{ ['cat /flag.txt'] | filter('system') }}

Кроме того, необходимо закодировать пробелы и символ вертикальной черты в URL-адресе (Выделяем в Burp строку для кодирования и жмём дважды CTRL+U), чтобы итоговая полезная нагрузка выглядела следующим образом:

api=http://truckapi.htb/?id%3D{{%2b['cat%2b/flag.txt']%2b%7C%2bfilter('system')%2b}}

-11

А вот и наш флаг! Победа!

-12

Выводы

Отличный кейс! Давайте подведём итоги что мы узнали из него.

Мы выяснили как определять при помощи нагрузки шаблонизатор. В Jinja результатом при внедрении {{7*'7'}} будет 7777777, а в Twig — 49. Также всегда можно вызвать {{_self}} и посмотреть информацию о текущем шаблоне. В Twig это будет выглядеть особенным образом, что мы выяснили ранее.

Также смогли найти сам SSTI и превратить его в RCE для шаблонизатора Twig. Хочу отметить, что такой пейлоад вряд ли сработает на современных проектах, основанных на Twig. Не стоит расстраиваться т.к. на новые версии тоже есть свои пейлоады, но для их эксплуатации нужна мисконфигурация при настройке самого Twig.

Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!