# 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')
```

<figure><img src="https://676766212-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR6dozMpxuaoEOVvH1vR%2Fuploads%2FlW9oLxMbQH5ATyWcglxl%2Fimage.png?alt=media&#x26;token=77ca84fb-0fda-4b6a-93e1-9ad0ccdfc57a" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://676766212-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR6dozMpxuaoEOVvH1vR%2Fuploads%2F95F39YwKp45Hm5whN9by%2Fimage.png?alt=media&#x26;token=1ebc5a64-1ae1-464f-b051-296a2480b0fa" alt=""><figcaption></figcaption></figure>

Демонстрация того, что {{7\*7}} отображается как 49, доказывает, что наше приложение уязвимо для SSTI.

## 3. Смягчение последствий:

Если пользовательские шаблоны являются бизнес-требованием, как они должны быть реализованы? Самый низкорискованный подход - просто использовать тривиальный шаблонизатор, такой как Mustache или Python's Template. Максимально возможное отделение логики от рендеринга может значительно снизить подверженность наиболее опасным атакам на основе шаблонов. Другой, дополнительный подход - признать, что выполнение произвольного кода неизбежно (независимо от фильтрации/белых списков/черных списков), и поместить его в песочницу внутри заблокированного контейнера Docker.

## 4. Выводы:

Отказ от использования пользовательских шаблонов избавляет вас от этой возможной эксплуатации. Однако если вам действительно необходимо использовать шаблонный рендеринг, альтернативой может быть песочница для фактического рендеринга в пользовательском режиме, хотя здесь вы можете вспомнить об основных недостатках.
