Template injection (SSTI - Server-Side Template Injection)

circle-exclamation

Understanding Server-Side Template Injection (SSTI)

What is Server-Side Template Injection?

Server-Side Template Injection (SSTI) is a vulnerability that occurs when user input is embedded into a template in an unsafe way, allowing attackers to inject template directives and execute arbitrary code on the server. This happens when applications dynamically generate templates using user-controlled data without proper sanitization.

Vulnerable Code Example

# Flask/Jinja2 vulnerable template rendering
from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/hello')
def hello():
    name = request.args.get('name', 'World')
    # Vulnerable: User input directly in template
    template = f"<h1>Hello {name}!</h1>"
    return render_template_string(template)

Normal Request:

  • URL: /hello?name=John

  • Template: <h1>Hello John!</h1>

  • Output: <h1>Hello John!</h1>

Malicious Request:

  • URL: /hello?name={{7*7}}

  • Template: <h1>Hello {{7*7}}!</h1>

  • Output: <h1>Hello 49!</h1> (Expression evaluated)

How SSTI Works

SSTI exploits the template engine's ability to evaluate expressions and execute code. When user input is embedded directly into templates, attackers can inject template syntax that gets processed by the template engine, leading to code execution.

Template Engine Processing Flow

  1. User Input - Attacker provides malicious template syntax

  2. Template Construction - Application embeds input into template

  3. Template Parsing - Engine parses template with injected code

  4. Expression Evaluation - Engine evaluates malicious expressions

  5. Code Execution - Arbitrary code executes on the server

Impact and Consequences

  • Remote Code Execution - Complete server compromise

  • Information Disclosure - Access to application data and configuration

  • File System Access - Reading and writing server files

  • Privilege Escalation - Gaining higher system privileges

  • Data Exfiltration - Stealing sensitive information

  • Denial of Service - Crashing the application or server

Common Template Engines

Python Template Engines

Jinja2 (Flask, Django):

  • Syntax: {{ expression }}, {% statement %}

  • Used in: Flask, Django (custom), Ansible

  • Features: Expressions, filters, macros, inheritance

Django Templates:

  • Syntax: {{ variable }}, {% tag %}

  • Used in: Django web framework

  • Features: Tags, filters, template inheritance

Mako:

  • Syntax: ${expression}, <% code %>

  • Used in: Pyramid, SQLAlchemy

  • Features: Python expressions, control structures

JavaScript Template Engines

Handlebars.js:

  • Syntax: {{expression}}, {{#helper}}

  • Used in: Node.js applications, Ember.js

  • Features: Helpers, partials, conditionals

Mustache:

  • Syntax: {{variable}}, {{#section}}

  • Used in: Various JavaScript frameworks

  • Features: Logic-less templates

Pug (formerly Jade):

  • Syntax: #{expression}, !{unescaped}

  • Used in: Express.js applications

  • Features: Clean syntax, mixins, includes

Java Template Engines

Freemarker:

  • Syntax: ${expression}, <#directive>

  • Used in: Spring Boot, Apache Struts

  • Features: Macros, functions, object navigation

Velocity:

  • Syntax: $variable, #directive

  • Used in: Apache projects, Spring

  • Features: VTL (Velocity Template Language)

Thymeleaf:

  • Syntax: ${expression}, th:attribute

  • Used in: Spring Boot applications

  • Features: Natural templates, strong typing


Basic SSTI Detection

Mathematical Expression Testing

Basic Arithmetic

Universal Detection Payloads:

Extended Mathematical Tests:

Polyglot Detection Payloads

Multi-Engine Detection:

Context-Based Detection

HTML Context

Template Injection in HTML:

JavaScript Context

Template Injection in JavaScript:

CSS Context

Template Injection in CSS:


Template Engine Specific Exploitation

Jinja2 (Python/Flask) Exploitation

Basic Jinja2 Syntax

Expression Evaluation:

Jinja2 Object Navigation

Accessing Python Objects:

Remote Code Execution in Jinja2

Class Navigation for RCE:

Advanced Jinja2 RCE:

Jinja2 Filter Abuse

Built-in Filter Exploitation:

Django Template Exploitation

Django Template Syntax

Basic Django Templates:

Django Template RCE

Limited RCE in Django:

Django Debug Mode Exploitation:

Freemarker (Java) Exploitation

Freemarker Syntax

Basic Freemarker Expressions:

Freemarker RCE

Execute Constructor for RCE:

Advanced Freemarker Exploitation:

Velocity (Java) Exploitation

Velocity Syntax

Basic Velocity Expressions:

Velocity RCE

Class Instantiation for RCE:

Twig (PHP) Exploitation

Twig Syntax

Basic Twig Expressions:

Twig RCE

Filter and Function Abuse:

Advanced Twig Exploitation:

Handlebars.js Exploitation

Handlebars Syntax

Basic Handlebars Expressions:

Handlebars RCE

Prototype Pollution and RCE:

Node.js Specific Handlebars RCE:


Advanced SSTI Techniques

Template Engine Fingerprinting

Response-Based Fingerprinting

Engine Detection Payloads:

Error Message Analysis

Error-Based Detection:

Filter Bypassing Techniques

Character Filtering Bypasses

Alternative Quotes and Characters:

String Concatenation:

Keyword Filtering Bypasses

Alternative Method Names:

WAF Bypassing

Encoding and Obfuscation:

Blind SSTI Exploitation

Time-Based Detection

Delay-Based Payloads:

Out-of-Band Detection

DNS/HTTP Exfiltration:

File-Based Detection

File Creation/Modification:


Context-Specific SSTI Exploitation

Email Template Injection

Email Template Vulnerabilities

Email Subject/Body Injection:

Email Header Injection:

PDF Generation Template Injection

PDF Template Vulnerabilities

HTML-to-PDF Template Injection:

PDF Metadata Injection:

SMS/Notification Template Injection

SMS Template Vulnerabilities

SMS Message Template Injection:

Push Notification Injection:


Flask Applications

Flask-Specific SSTI

Flask Configuration Access:

Flask Extension Exploitation:

Django Applications

Django-Specific SSTI

Django Settings Access:

Django ORM Exploitation:

Spring Boot Applications

Thymeleaf SSTI

Thymeleaf Expression Injection:

Spring Framework Exploitation:

Express.js Applications

Pug/Jade SSTI

Pug Template Injection:

EJS Template Injection:


Advanced Attack Scenarios

Multi-Stage SSTI Exploitation

Information Gathering Stage

Environment Discovery:

Application Configuration Extraction:

Persistence and Backdoor Installation

File-Based Persistence:

Memory-Based Persistence:

SSTI with Other Vulnerabilities

SSTI + CSRF

Cross-Site Request Forgery with SSTI:

SSTI + File Upload

Template Injection via File Upload:

SSTI + XXE

XML Template with XXE:

Last updated

Was this helpful?