SSTI: Как шаблоны могут взломать ваш сервер
• SSTI (Server-Side Template Injection) — уязвимость, при которой атакующий может внедрить произвольный код в шаблонизатор и выполнить его. Подобная уязвимость возникает, если пользовательский ввод не экранируется и небезопасно передаётся в шаблон.
• Шаблонизаторы часто используются в веб-приложениях, например в тех, что написаны на python используется jinja2, в PHP — twing, в Java — Velocity и так далее.
• Рассмотрим подобную атаку на простейшем API на Flask:
@app.route("/greet")
def greet():
name = request.args.get("name", "guest")
return render_template_string("Hello {{ " + name + " }}")• Если в качестве параметра пользователь передаст
name={{7*7}}, то эндпоит вернет:
Hello 49
• Как вы понимаете, такая уязвимость прямая дорога к RCE, вне зависимости от ЯП, на котором приложение написано.
• Как защититься:
• Экранирование: Экранируйте любой пользовательской ввод автоматически
• Валидация: Настройте валидацию входных данных
• Изоляция: Изолируйте окружение с шаблонизатором, например в контейнере без доступа к сисколам
• Используйте WAF и IDS/IPS
• Как находить подобные уязвимости:
• Вручную: Самый простой вариант, просто вставляйте
{{ 7*7 }} или подобные пейлоады в конечные точки• Burp Suite: Всеми известная утилита, для автоматического нахождения уязвимостей
• SSTImap: Инструмент, заточенный под автоматическое нахождение SSTI с эксплуатацией
• SSTI XSS Finder: Инструмент, использующий Shodan и AngularJS для нахождения SSTI
• Удачи!
• Поддержать автора монеткой: @v_meshke
