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