Template Injection [SSTI]
1. Введение:
Инъекция шаблонов на стороне сервера - это когда злоумышленник может использовать собственный синтаксис шаблона для внедрения вредоносной полезной нагрузки в шаблон, который затем выполняется на стороне сервера.
Шаблонные движки предназначены для создания веб-страниц путем комбинирования фиксированных шаблонов с изменчивыми данными. Это позволяет злоумышленникам внедрять произвольные директивы шаблона, чтобы манипулировать шаблонизатором, что часто позволяет им получить полный контроль над сервером.
2. Типичный уязвимый код:
Существует несколько библиотек/фреймворков, использующих шаблоны, вот несколько из них: Jinja, Flask, Mako, Twig. Следующий фрагмент кода демонстрирует уязвимость Flask:
from flask import Flask,request,render_template_string
from urllib.parse import unquote
app = Flask(__name__)
@app.route("/")
def main_page():
return "Hey there, this is my cool weeb site."
@app.errorhandler(404)
def page_not_found(error):
url = unquote(request.url)
return render_template_string("<h1>URL %s not found</h1><br/>" % url), 404
if __name__ == '__main__':
app.run(debug = False, host = '0.0.0.0')

Введенные данные отображаются и отражаются в ответе. Это легко принять за простую XSS-уязвимость, но ее легко обнаружить, если попробовать задать математические операции в шаблонном выражении: {{7*7}}.

Демонстрация того, что {{7*7}} отображается как 49, доказывает, что наше приложение уязвимо для SSTI.
3. Смягчение последствий:
Если пользовательские шаблоны являются бизнес-требованием, как они должны быть реализованы? Самый низкорискованный подход - просто использовать тривиальный шаблонизатор, такой как Mustache или Python's Template. Максимально возможное отделение логики от рендеринга может значительно снизить подверженность наиболее опасным атакам на основе шаблонов. Другой, дополнительный подход - признать, что выполнение произвольного кода неизбежно (независимо от фильтрации/белых списков/черных списков), и поместить его в песочницу внутри заблокированного контейнера Docker.
4. Выводы:
Отказ от использования пользовательских шаблонов избавляет вас от этой возможной эксплуатации. Однако если вам действительно необходимо использовать шаблонный рендеринг, альтернативой может быть песочница для фактического рендеринга в пользовательском режиме, хотя здесь вы можете вспомнить об основных недостатках.
Last updated