Template Injection [SSTI]
1. Введение:
Инъекция шаблонов на стороне сервера - это когда злоумышленник может использовать собственный синтаксис шаблона для внедрения вредоносной полезной нагрузки в шаблон, который затем выполняется на стороне сервера.
Шаблонные движки предназначены для создания веб-страниц путем комбинирования фиксированных шаблонов с изменчивыми данными. Это позволяет злоумышленникам внедрять произвольные директивы шаблона, чтобы манипулировать шаблонизатором, что часто позволяет им получить полный контроль над сервером.
2. Типичный уязвимый код:
Существует несколько библиотек/фреймворков, использующих шаблоны, вот несколько из них: Jinja, Flask, Mako, Twig. Следующий фрагмент кода демонстрирует уязвимость Flask:
Введенные данные отображаются и отражаются в ответе. Это легко принять за простую XSS-уязвимость, но ее легко обнаружить, если попробовать задать математические операции в шаблонном выражении: {{7*7}}.
Демонстрация того, что {{7*7}} отображается как 49, доказывает, что наше приложение уязвимо для SSTI.
3. Смягчение последствий:
Если пользовательские шаблоны являются бизнес-требованием, как они должны быть реализованы? Самый низкорискованный подход - просто использовать тривиальный шаблонизатор, такой как Mustache или Python's Template. Максимально возможное отделение логики от рендеринга может значительно снизить подверженность наиболее опасным атакам на основе шаблонов. Другой, дополнительный подход - признать, что выполнение произвольного кода неизбежно (независимо от фильтрации/белых списков/черных списков), и поместить его в песочницу внутри заблокированного контейнера Docker.
4. Выводы:
Отказ от использования пользовательских шаблонов избавляет вас от этой возможной эксплуатации. Однако если вам действительно необходимо использовать шаблонный рендеринг, альтернативой может быть песочница для фактического рендеринга в пользовательском режиме, хотя здесь вы можете вспомнить об основных недостатках.
Last updated