# Grey Beach
## Описание
Что можно сделать с веб-сервером, если можно загружать свои шаблоны на него? **Ничего!** Я **все** предусмотрел!
---
What can you do with web server if you can upload your templates to that server? **Nothing!** I have considered **everything**!
## Краткое описание уязвимости
На данном сервисе присутствует уязвимость "Sandbox Escape" в шаблонизаторе страниц Jinja. Использование в шаблоне метода `str.format_map(mapping)` позволяет выйти из [SandboxedEnvironment](https://jinja.palletsprojects.com/en/3.0.x/sandbox/#jinja2.sandbox.SandboxedEnvironment) на глобальные переменные с помощью класса `User`.
[Полное описание](https://palletsprojects.com/blog/jinja-2-10-1-released/).
# Решение
## Исследование сервера
При первом входе на сервер необходимо ввести никнейм для доступа к функциональным возможностям.

После POST-запроса на ввод никнейма сервер устанавливает Cookie `session`, которая выглядит как типичная Cookie `session` Flask-сервера. Раскодируем полезную нагрузку `session`.

В сессии сохранился никнейм.
На следующей странице есть форма для загрузки шаблона, при переходе на которую встречается сообщение `data['user']`.

Воспользуемся полезной нагрузкой для доступа к классу `Object` :
`{{ ().__class__.__base__ }}`
Сервер сообщает об опасном содержимом в шаблоне:

При локальной проверке данной нагрузки вызывается исключение [SecurityError](https://jinja.palletsprojects.com/en/3.0.x/sandbox/#jinja2.sandbox.SecurityError).

## Подготовка эксплоита и исполнение
Для обхода данной ошибки необходимо воспользоваться `str.format_map(mapping)`, словарем послужит `data`. Создадим следующую нагрузку для получения глобальных переменных: `{{ "{user.__init__.__globals__}".format_map(data) }}`.
Получен список глобальных переменных:

Далее изучаем переменные класса `Config` :
`{{ "{user.__class__.__init__.__globals__[Config].__dict__}".format_map(data) }}`
И получаем флаг в переменных этого класса.

FLAG:
`bsc{1f 7h3r3 w3r3 n0 60d, 17 w0uld b3 n3c3554ry 70 1nv3n7 h1m}`