User Tools

Site Tools


ssti

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ssti [2023/11/20 08:54] zrinkassti [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====SSTI==== ====SSTI====
 **SSTI (Server Side Template Injection)** je ranjivost do koje dolazi kada napadač iskorištava sintaksu predloška web aplikacije kako bi u obrazac umetnuo zlonamjerni teret koji će se izvesti na poslužitelju. **SSTI (Server Side Template Injection)** je ranjivost do koje dolazi kada napadač iskorištava sintaksu predloška web aplikacije kako bi u obrazac umetnuo zlonamjerni teret koji će se izvesti na poslužitelju.
- +Generatori predložaka (eng. //template engines//) su dizajnirani za generiranje web stranica kombiniranjem fiksnih predložaka s promjenjivim podatcima. Do SSTI-a dolazi kada je korisnički unos nije poslan kao podatak, već je konkateniran direktno u predložak. Ovakav pristup dopušta napadačima da ubacuju proizvoljne naredbe kako bi manipulirali generatorom predložaka, što im često omogućava preuzimanje kontrole nad cijelim poslužiteljem.
-Generatori predložaka (eng. //template engines//) su dizajnirani za generiranje web stranica kombiniranjem fiksnih predložaka s promjenjivim podatcima. Do SSTI-a dolazi kada je korisnički unos nije poslan kao podatak, već je konkateniran direktno u predložak. Ovakav pristup dopušta napadačima da ubacuju proizvoljne upute kako bi manipulirali generatorom predložaka, što im često omogućava preuzimanje kontrole nad cijelim poslužiteljem. +
  
 ===Detekcija ranjivosti i prikupljanje informacija=== ===Detekcija ranjivosti i prikupljanje informacija===
Line 8: Line 7:
  
 Jedan od osnovnih pristupa otkrivanju ovakve ranjivosti je zbunjivanje predloška (eng. //template fuzzing//) umetanjem nizova posebnih znakova često korištenih u predlošku, npr.  Jedan od osnovnih pristupa otkrivanju ovakve ranjivosti je zbunjivanje predloška (eng. //template fuzzing//) umetanjem nizova posebnih znakova često korištenih u predlošku, npr. 
-<code>${{<%[%'"}}%\ </code>+**%%${{<%[%'"}}%\ %%**
  
-Kako bi se ovakva ranjivost lakše razlikovala od obične XSS ranjivosti, preporučse umetanje jednostavnih matematičkih operacija. Potrebno je identificirati koji je generator predložaka korišten. To se ostvari isprobavanjem različitih predložaka dok neki od njih ne vrati smislen rezultat, primjerice:+Kako bi se ovakva ranjivost lakše razlikovala od obične XSS ranjivosti, preporučuje se umetanje jednostavnih matematičkih operacija. Potrebno je identificirati koji je generator predložaka korišten. To se ostvari isprobavanjem različitih predložaka dok neki od njih ne vrati smislen rezultat. Iako je broj potencijalnih jezika velik, svi koriste sličnu sintaksu  dizajniranu da ne interferira s HTML znakovima, primjerice:
 <code> <code>
 {{7*7}} {{7*7}}
Line 20: Line 19:
 </code> </code>
  
-Iako je broj potencijalnih jezika velik, svi koriste sličnu sintaksu  dizajniranu da ne interferira s HTML znakovima. Jednom kad je generator predložaka poznat, potrebno je pročitati dokumentaciju predloška kako bi se otkrio najefikasniji pristup napadu. Ključna poglavlja uključuju osnovnu sintaksu, sigurnost, listu ugrađenih metoda, funkcija, filtera i varijabli te ekstenzija  i/ili plugina. Također je potrebno istražiti okolinu kako bi se otkrilo čemu sve imamo pristup te pronaći objekte u aplikaciji te informacije koje sadrže. +Jednom kad je generator predložaka poznat, potrebno je pročitati dokumentaciju predloška kako bi se otkrio najefikasniji pristup napadu. Ključna poglavlja uključuju osnovnu sintaksu, sigurnost, listu ugrađenih metoda, funkcija, filtera i varijabli te ekstenzija  i/ili plugina. Također je potrebno istražiti okolinu kako bi se otkrilo čemu sve imamo pristup te pronaći objekte u aplikaciji te informacije koje sadrže. 
    
  {{ ::ssti_dec_tree.png?nolink&600 |Primjer stabla odluke za otkrivanje jezika i generatora predložaka u pitanju}}  {{ ::ssti_dec_tree.png?nolink&600 |Primjer stabla odluke za otkrivanje jezika i generatora predložaka u pitanju}}
Line 26: Line 25:
  
 ===Napad=== ===Napad===
-Nakon što su prikupljene sve potrebne informacije o aplikaciji, moguće je napasti web aplikaciju tradicionalnim metodama penetracijskog testiranja, npr. injekcijom predloška za arbitrarnu izradu objekata ili čitanje/pisanje u datotekamakako bi se otkrila ranjivost svake pojedine funkcije. Dan je jednostavni primjer ranjivog koda:  +Nakon što su prikupljene sve potrebne informacije o aplikaciji, moguće je napasti web aplikaciju  ubacivanjem predloška za izradu objekata ili čitanje/pisanje u datotekama kako bi se otkrila ranjivost svake pojedine funkcije. Dan je jednostavni primjer ranjivog koda:  
-$output = $twig->render("Dear " . $_GET['name']);+<code> $output = $twig->render("Dear " . $_GET['name']); </code>
  
 U primjeru se dio predloška generira dinamički putem GET parametra //name//. S obzirom na to da se sintaksa evaluira na poslužitelju, napadač može postaviti SSTI teret u taj parametar:\\ U primjeru se dio predloška generira dinamički putem GET parametra //name//. S obzirom na to da se sintaksa evaluira na poslužitelju, napadač može postaviti SSTI teret u taj parametar:\\
-http://vulnerable-website.com/?name={{bad-stuff-here}}+<code>http://vulnerable-website.com/?name={{bad-stuff-here}}</code>
  
  
Line 38: Line 37:
    
 Cilj nam je s pomoću SSTI napada izmijeniti svoje ime, a možda i doći do nekih zgodnih podataka. Cilj nam je s pomoću SSTI napada izmijeniti svoje ime, a možda i doći do nekih zgodnih podataka.
-Prvo unosimo matematičke jednadžbe u polje za unos teksta kako bismo otkrili predložak, odnosno HTML dokument koji sadrži varijable. U polje unosimo: +Prvo unosimo matematičke jednadžbe u polje za unos teksta kako bismo otkrili predložak, odnosno HTML dokument koji sadrži varijable. U polje unosimo 
-{{7*7}}  +**%%{{7*7}}%%**  i zatim gledamo kako će se interpretirati u predlošku.\\
-...i zatim gledamo kako će se interpretirati u predlošku.\\+
 {{ ::ssti_lab2.png?nolink&600 |}} {{ ::ssti_lab2.png?nolink&600 |}}
-Aplikacija izračunava brojeve dane jednadžbom i vraća ih kao naše ime. Sad kad znamo koji predložak HTML-a se koristi pa u dvostrukim vitičastim zagradama možemo slati i kompleksnije naredbe. Pokušajmo doći do informacija o sustavu na kojem se nalazi aplikacija te o tehnologijama koje ju pokreću.\\ +Aplikacija izračunava brojeve dane jednadžbom i vraća ih kao naše ime. Budući da se naredba 7*7 izvršila, znamo da se koristi predložak dvostrukim vitičastim zagradama pa možemo stranici poslati kompleksnije naredbe. Pokušajmo doći do informacija o sustavu na kojem se nalazi aplikacija.\\ 
-Krećemo postepeno i zasad samo pokušamo {{"foo"}} . +Krećemo s nečim jednostavnim te zasad samo pokušajmo **%%{{"foo"}}%%** 
-Vidimo da se string prepoznao. Sad pokušajmo saznati u kojem se jeziku mogu prihvatiti naredbe.  +Vidimo da se string prepoznao jer smo dobili odgovor "Hello foo". Sad pokušajmo saznati u kojem se jeziku mogu prihvatiti naredbe tako što ćemo zvati neke funkcije nad tim stringom
-Ako u dvostrukim vitičastim zagradama pošaljemo //"foo".toUpperCase()//, nećemo uspjeti, što značda ne možemo slati naredbe u Javi. No, ako pokušamo koristiti Python sintaksu i upišemo+Ako unesemo **%%{{"foo".toUpperCase()}}%%**naredba se neće prepoznati i nećemo dobiti odgovor. Zaključujemo da aplikacija ne prihvaća naredbe pisane u Javi. No, ako pokušamo koristiti Python sintaksu i upišemo **%%{{"foo".upper()}}%%**, dobijemo rezultat //FOO//, što znači da možemo slati naredbe u Pythonu.\\ 
-{{"foo".upper()}} +Ono što sad želimo je doći do Pythonovog 'osmodula jer nam on omogućuje naredbe vezane uz operacijski sustav. Šaljemo naredbu:
-zaista dobijemo rezultat //FOO//, što znači da možemo slati naredbe u Pythonu.\\ +
-Ono što sad želimo je doći do Pythonovog //os// modula jer nam on omogućuje naredbe vezane uz operacijski sustav. Šaljemo naredbu:+
 <code> <code>
 {{"foo".__class__.__base__.__subclasses__()[182] {{"foo".__class__.__base__.__subclasses__()[182]
-.__init__.__globals__['sys'].modules['os'].popen("ls").read()}} +.__init__.__globals__['sys'].modules['os'].popen("ls").read()}}</code>
-{{ ::ssti_lab3.png?nolink&600 |}} <code>+
  
-Raščlanimo ju na dijelove.  +Raščlanimo ju na dijelove. **%%.__class__%%** vraća klasu objekta nad kojim je funkcija pozvana (u ovom slučaju 'str'). **%%.__base__%%** traži ime bazne klase (object). **%%.__subclasses__%%** vraća listu svih potklasi od //object//. Trebamo klasu na indeksu 182 jer ona uključuje 'sys' modul, a od njega možemo doći do 'os' modula. Da bismo došli do modula, prvo moramo inicijalizirati objekt te klase (naredbe **%%.__init__%%**) i dohvatiti globalne varijable te funkcije (naredba **%%.__globals__%%**). Želimo samo 'sys' pa to navedemo u zagradi pored. 'sys' modul sadrži metodu //modules// pa ju pozovemo i navedemo da želimo 'os'. Sad možemo izvesti bilo koju funkciju iz tog modula te biramo //ls// koji pozovemo preko //popen//. Na kraju pozovemo //read()// da bismo mogli pročitati output.
-**.__class__** vraća klasu objekta nad kojim je funkcija pozvana (u ovom slučaju 'str'). **.__base__** traži ime bazne klase (object). **.__subclasses__** vraća listu svih potklasi od //object//, a nama samo treba klasa na indeksu 182 //// jer ona uključuje 'sys' modul, a od njega možemo doći do 'os' modula. Da bismo došli do modula, prvo moramo inicijalizirati objekt te klase (naredbe **.__init__**) i dohvatiti globalne varijable te funkcije (naredba **.__globals__**). Želimo samo 'sys' pa to navedemo u zagradi pored. 'Sys' modul sadrži metodu //modules// pa ju pozovemo i navedemo da želimo 'os'. Sad možemo izvesti bilo koju funkciju iz tog modula te biramo //ls// koji pozovemo preko //popen//. Na kraju pozovemo //read()// da bismo zapravo mogli pročitati output.+
  
 +{{ ::ssti_lab3.png?nolink&600 |}} 
  
 +Na ovaj smo način izveli naredbu operacijskog sustava na udaljenom poslužitelju. U ovom slučaju to je bila ls naredba, no mogla se iskoristiti i bilo koja druga.
  
 ===Izvori==== ===Izvori====
ssti.1700470484.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki