SSTI
SSTI (Server Side Template Injection) je ranjivost do koje dolazi kada je napadač u mogućnosti iskoristiti sintaksu predloška web aplikacije kako bi umetnuo zlonamjerni teret koji će se izvesti na poslužitelju u obrazac.
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 konkateniran direktno u predložak, umjesto poslan kao podatak. Ovakav pristup dopušta napadačima da injektiraju arbitrarne upute kako bi manipulirali generatorom predložaka, što im često omogućava da preuzmu kontrolu nad cijelim poslužiteljem.
Detekcija ranjivosti i prikupljanje informacija
Da bi se detektirala SSTI ranjivost na poslužitelju, treba uočiti razlike između odgovora na očekivane podatke i odgovora na bilo koji dani teret. Ukoliko poslužitelj u nekom trenutku vrati grešku, lako je otkriti da je ranjiv te čak i pomoću kojeg generatora predložaka je izveden. Još jedan od pokazatelja ranjivosti je nereflektirani ili nepotpuno reflektirani podatak za kojeg se očekuje da će ga poslužitelj reflektirati.
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. “$%\”. Kako bi se ovakva ranjivost lakše razlikovala od obične XSS ranjivost, preporuča se umetanje jednostavnih matematičkih operacija u izraze predloška, npr. “$2_2”.
Nakon što je identificiran potencijal za SSTI ranjivost na poslužitelju, potrebno je identificirati korišteni generator predložaka. Iako je broj potencijalnih jezika velik, svi koriste sličnu sintaksu specifično dizajniranu da ne interferira s HTML znakovima.
Ukoliko poslužitelj ne vrati pogreške pri osnovnim pokušajima otkrivanja ranjivosti, potrebno je testirati razne jezično-specifične terete i promatrati njihovu interpretaciju na generatoru predložaka. Uobičajen način izvođenja ovake diferencijacije je umetanje jednostavnih matematičkih operacija koristeći sintaksu različitih jezika uz promatranje uspješnosti izvođenja.
Jednom kad je generator predložaka poznat, potrebno je pročitati dokumentaciju predloška kako bi se otkrio naefikasniji pristup napadu. Ključna poglavlja ukljč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 otrkilo čemu sve imamo pristup te pronaći objekte u aplikaciji te informacije koje sadrže.
Napad
Nakon što su prikupljene sve potrebne informacije o aplikaciji, moguće je napasti web aplikaciju tradicionalnim metodama penetracijskog testiranja, npr. injekcija predloška za arbitrarnu 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']);
U primjeru, dio predloška se 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 parametar „name“:
http://vulnerable-website.com/?name={{bad-stuff-here}}
PRIMJER: Labos pronađen na internetu
Otvorimo stranicu na adresi https://ssti.secure-cookie.io/
Cilj nam je pomoću SSTI napada izmjeniti naše ime, a možda i doći do nekih zgodnih podataka. Prvo što radimo je bacamo matematičke jednadžbe u polje zaunos teksta kako bismo otkrili predložak, odnosno HTML dokument koji sadrži varijable. U polje unosimo:
{{7*7}}
…i zatim gledamo kako će se interpretirati u predlošku.
Aplikacija izračunava brojeve dane arbitrarnom matematičkom 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 komande. Idemo sad probati doći do informacija o sustavu na kojem se nalazi aplikacija te o tehnologijama koje ju pokreću. Šaljemo komandu:
{{"foo".__class__.__base__.__subclasses__()[182] .__init__.__globals__['sys'].modules['os'].popen("ls").read()}}
I dobivamo svašta jer je aplikacija uistinu ranjiva na SSTI napade. Vidimo da je aplikacija pisana u Python Flasku, da smo došli do naziva json paketa i da koristi Jinja predložak.