Перейти к содержимому
← Каталог php SSTI

SSTI: Server-Side Template Injection via eval()

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

easyphpPro
Задача
# Server-Side Template Injection: персональное приветствие ## Сценарий Перед вами PHP-приложение интернет-магазина SecureShop. На странице профиля пользователю доступна настройка персонального приветствия: он вводит произвольный текст в поле формы, нажимает «Сохранить», и при каждом следующем заходе на профиль сервер показывает это приветствие. Реализация выглядит безобидно — это же просто строка пользователя, которая отдаётся обратно на его собственную страницу. Но обработчик профиля делает с этой строкой одну операцию, которая в production-коде категорически не должна применяться к недоверенному вводу: пропускает её через машинерию исполнения **как фрагмент исходного кода**, а не как данные, выводимые из уже скомпилированного шаблона. Поскольку приложение написано на интерпретируемом языке PHP, у этого фрагмента есть прямой доступ ко всем встроенным функциям рантайма — к работе с файловой системой, к запуску внешних команд, к чтению переменных окружения процесса. А именно в переменных окружения хранится CTF-флаг. Особенность PHP-стека: язык изначально проектировался как «шаблонизатор поверх C» — переключение между «обычным текстом» и «исполняемым кодом» происходит через специальные теги-разделители. Любое место в коде, где недоверенная строка передаётся в функцию-исполнитель встроенного интерпретатора, превращается в полноценную точку входа для произвольного PHP-кода. От текстовой подмены SQL-параметра это отличается тем, что атакующему не нужны никакие синтаксические ухищрения — он просто пишет нормальный код, который сервер выполняет в контексте своего процесса с правами того же пользователя, под которым работает веб-сервер. ## Цели 1. Найдите в приложении поле ввода произвольного текста, содержимое которого затем отображается на той же странице — на нём можно проверить, как именно сервер обрабатывает ввод. 2. Эмпирически подтвердите, что сервер не просто показывает текст «как есть», а **выполняет** его (простейший детектор — арифметическое выражение, обёрнутое в специальные теги-разделители PHP: если на странице вместо введённой строки появится **результат вычисления**, ввод действительно исполняется как код). 3. Через встроенную функцию рантайма для чтения переменных окружения процесса извлеките CTF-флаг. Имя переменной с флагом — стандартное для лаб платформы; результат отрисуется в области приветствия на странице профиля. ## Дополнительные исследования После того как факт исполнения PHP-кода подтверждён, полезно проверить, насколько широка поверхность атаки в реальном production-сценарии: какие ещё функции рантайма доступны (запуск внешних команд, чтение произвольных файлов, открытие сетевых соединений). Это влияет на оценку критичности уязвимости: SSTI в PHP-стеке с непривилегированным веб-сервером — это уже RCE на уровне веб-процесса, и в зависимости от конфигурации может быть pivot-точкой для дальнейшего движения по инфраструктуре. ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru