# 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}`