Перейти к содержимому

Поиск по платформе

SSTI: Twig createTemplate() Injection

Пользовательский ввод передаётся в Twig createTemplate(), что позволяет выполнить произвольный код на сервере.

Автор: Hack & Fix
Освоишь: логика вне шаблоновcontext-escapesandbox engine
Средне+60 XP ~40 мин php
CWE-1336 · A03:2021 Pro
Обложка: SSTI: Twig createTemplate() Injection Обложка: SSTI: Twig createTemplate() Injection
Задача
# Инъекция шаблонов Twig: био профиля как программа ## Сценарий Магазин подарков **Podarko** даёт покупателю оформить био в кабинете, и интерфейс обещает поддержку подстановок: в текст можно вставить своё имя, чтобы приветствие выглядело живее. Сервер рендерит био популярным PHP-шаблонизатором Twig при каждом открытии профиля. Разработчики не видят риска: «набор переменных строго ограничен». Но на подготовке к аудиту всплыло, что строка био передаётся шаблонизатору не как данные, а как исходный код шаблона — и компилируется целиком. Вам поручены проверка и оценка последствий. ## Цель 1. Найдите поле био в кабинете и убедитесь, что оно действительно рендерится как шаблон с подстановками. 2. Подтвердите инъекцию детектором: вычислительное выражение в синтаксисе шаблонизатора, которое обычный текст вернуть «вычисленным» не может. 3. Эскалируйте инъекцию до вызова встроенной функции PHP — через цепочку фильтров шаблонизатора — и прочитайте переменную окружения процесса с флагом. ## Теория **Server-Side Template Injection** возникает там, где пользовательский ввод используется как код шаблона, а не как его данные. Разница принципиальна: данные подставляются в заранее написанный шаблон и экранируются при выводе; код шаблона компилируется, и все его конструкции — выражения, фильтры, вызовы — исполняются на сервере. Twig — полноценный язык: вычисляет выражения, применяет цепочки фильтров и работает с коллекциями, а фильтры высшего порядка принимают имя функции как строку — этот мостик и ведёт от «кастомизации приветствия» к выполнению произвольного кода. **Уязвимый паттерн:** ```php // Пользовательская строка компилируется как шаблон $template = $twig->createTemplate($bio); ``` Метод динамической компиляции шаблона предназначен для редких внутренних сценариев, а не для пользовательского ввода. Пока строка био остаётся исходным кодом, песочница и экранирование не спасают: компилятор исполняет то, что в ней написано, в контексте процесса веб-сервера. ## Точка входа атаки `POST /profile/bio` — сохранение био (поле `bio`, требуется CSRF-токен из формы профиля); рендер — на `GET /profile`. * **Обычный пользователь:** `demo` / `demo` * **Флаг:** переменная окружения процесса веб-сервера

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: SSTI: Server-Side Template Injection via eval() Обложка лабы: SSTI: Server-Side Template Injection via eval()
SSTI

SSTI: Server-Side Template Injection via eval()

Greeting template executed via eval() allows arbitrary PHP code injection.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: Blind SSTI: Notification Templates Обложка лабы: Blind SSTI: Notification Templates
SSTI

Blind SSTI: Notification Templates

Админ-шаблон email-уведомлений рендерится через render_template_string() — слепая SSTI через time-based payload.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: Basic SSTI: Кастомное приветствие Обложка лабы: Basic SSTI: Кастомное приветствие
SSTI

Basic SSTI: Кастомное приветствие

Утечка конфиденциальных данных из контекста страницы через небезопасную обработку шаблонов.

+30 XP
Go Pro
Exploit Fix