---
# System prepended metadata

title: Grey Beach

---

# 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/).

# Решение
## Исследование сервера

При первом входе на сервер необходимо ввести никнейм для доступа к функциональным возможностям. 
![Login Page](https://i.imgur.com/mJx3b43.png)

После POST-запроса на ввод никнейма сервер устанавливает Cookie `session`, которая выглядит как типичная Cookie `session` Flask-сервера. Раскодируем полезную нагрузку `session`. 
![Cookie Payload](https://i.imgur.com/frRngYm.png)
В сессии сохранился никнейм.

На следующей странице есть форма для загрузки шаблона, при переходе на которую встречается сообщение `data['user']`.
![Template Upload](https://i.imgur.com/nwof0fy.png)

Воспользуемся полезной нагрузкой для доступа к классу `Object` :
`{{ ().__class__.__base__ }}`
Сервер сообщает об опасном содержимом в шаблоне:
![SecurityError](https://i.imgur.com/ug93CUr.png)
При локальной проверке данной нагрузки вызывается исключение [SecurityError](https://jinja.palletsprojects.com/en/3.0.x/sandbox/#jinja2.sandbox.SecurityError).
![LocalCheck](https://i.imgur.com/ZEUZHsn.png)
## Подготовка эксплоита и исполнение
Для обхода данной ошибки необходимо воспользоваться `str.format_map(mapping)`, словарем послужит `data`. Создадим следующую нагрузку для получения глобальных переменных: `{{ "{user.__init__.__globals__}".format_map(data) }}`.

Получен список глобальных переменных:
![Globals](https://i.imgur.com/qWRP8Jw.png)

Далее изучаем переменные класса `Config` :

`{{ "{user.__class__.__init__.__globals__[Config].__dict__}".format_map(data) }}`

И получаем флаг в переменных этого класса. 
![Flag](https://i.imgur.com/eU9Mi79.png)

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