FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA SPECIJALISTIČKI STUDIJ “INFORMACIJSKA SIGURNOST” Ranjivosti web-aplikacija prema OWASP-u Seminarski rad iz predmeta “Sigurnost računalnih mreža” Iva Musić Sadržaj 1. Uvod ................................................................................................................................................ 3 2. Umetanje ......................................................................................................................................... 4 3. 2.1. Primjeri napada ....................................................................................................................... 4 2.2. Izbjegavanje napada umetanjem ............................................................................................ 6 2.2.1. Parametrizirani izrazi ....................................................................................................... 6 2.2.2. Izbjegavanje ..................................................................................................................... 6 2.2.3. Provjera uzoraka .............................................................................................................. 7 2.2.4. Dozvole za bazu podataka ............................................................................................... 7 Cross-site scripting .......................................................................................................................... 8 3.1. 4. Tipovi XSS ranjivosti................................................................................................................. 8 3.1.1. Nepostojana XSS ranjivost ............................................................................................... 9 3.1.2. Postojana XSS ranjivost ................................................................................................... 9 3.2. Primjeri iskorištavanja XSS ranjivosti..................................................................................... 10 3.3. Smanjivanje prijetnje ............................................................................................................. 10 3.3.1. Kontekstualno kodiranje/provjera ulaznog niza ........................................................... 10 3.3.2. Sigurnosna provjera nepouzdanog HTML unosa........................................................... 11 3.3.3. Sigurnost cookieja ......................................................................................................... 11 3.3.4. Onemogućavanje skripti ................................................................................................ 11 3.3.5. Nadolazeće obrambene tehnologije ............................................................................. 12 Loša autentifikacija i upravljanje sjednicama ................................................................................ 13 4.1. Autentifikacija............................................................................................................................. 13 4.1.1. Smanjivanje prijetnje kod autentifikacije ............................................................................ 13 4.2. Upravljanje sjednicama .............................................................................................................. 15 4.2.1. Svojstva identifikatora sjednice........................................................................................... 16 4.2.2. Implementacija upravljanja sjednicama .............................................................................. 17 4.2.3. Životni ciklus identifikatora sjednice ................................................................................... 19 4.2.4. Istek sjednice ....................................................................................................................... 20 4.2.5. Dodatne zaštite za upravljanje sjednicom na klijentskoj strani .......................................... 22 4.2.6. Otkrivanje napada na sjednicu ............................................................................................ 23 5. 6. Nesigurne reference na objekte .................................................................................................... 25 5.1. Primjer ranjivosti ................................................................................................................... 25 5.2. Provjera ranjivosti na nesigurne reference na objekte ......................................................... 26 5.3. Zaštita od nesigurnih referenci na objekte ........................................................................... 26 Krivotvorenje zahtjeva na drugom sjedištu................................................................................... 28 6.1. Primjer napada ........................................................................................................................... 28 6.2. Sprječavanje napada .................................................................................................................. 29 7. Pogrešno postavljene sigurnosne postavke .................................................................................. 30 7.1. Primjeri pogrešno postavljenih sigurnosnih postavki ................................................................ 31 7.2. Sprječavanje pogrešno postavljenih sigurnosnih postavki......................................................... 31 8. Nesigurna pohrana šifriranih podataka......................................................................................... 32 8.1. Primjeri nesigurne pohrane šifriranih podataka ........................................................................ 32 8.2. Sprečavanje kriptografskih nedostataka .................................................................................... 32 8.3. 9. Zaštita od kriptografskih nedostataka ................................................................................... 33 Nezaštićeni pristup URL-ovima...................................................................................................... 34 9.1. Primjer nezaštićenog pristupa URL-ovima ................................................................................. 34 9.2. Provjera sigurnosti pristupa URL-ovima ..................................................................................... 35 9.3. Zaštita pristupa URL-ovima ........................................................................................................ 35 10. Nedovoljna zaštita na transportnom sloju .................................................................................... 37 10.1. Primjer nedovoljne zaštite na transportnom sloju................................................................... 37 10.2. Provjera sigurnosti na transportnom sloju............................................................................... 38 10. 3. Zaštita na transportnom sloju ................................................................................................. 38 11. Neprovjerena preusmjeravanja i proslijeđivanja .......................................................................... 39 11.1. Primjeri neprovjerenih preusmjeravanja i proslijeđivanja ....................................................... 39 11.2. Sprječavanje neprovjerenih preusmjeravanja i proslijeđivanja ............................................... 39 12. Popis literature .............................................................................................................................. 41 1. Uvod The Open Web Application Security Project (OWASP) je otvorena zajednica posvećena tome da omogući organizacijama razvijanje, kupnju i održavanje aplikacija koje se mogu smatrati sigurnima. OWASP svake tri godine izrađuje dokument kojem je cilj ojačati svijest o važnosti sigurnosti web aplikacija. OWASP Top Ten predstavlja široki konsenzus o tome koji su najkritičniji sigurnosni propusti web aplikacija. Suradnici na projektu su razni sigurnosni stručnjaci iz cijelog svijeta koji su podijelili svoje znanje za izradu ovog popisa. Usvajanje savjeta iz dokumenta OWASP Top Ten je možda najučinkovitiji prvi korak prema promjeni kulture razvoja aplikacija unutar organizacije u onu koja proizvodi siguran kôd. Na OWASP-ovom popisu deset najvećih ranjivosti iz 2010. godine su: A1. Umetanje A2. Cross-site scripting A3. Loša autentifikacija i upravljanje sjednicama A4. Nesigurne reference na objekte A5. Krivotvorenje zahtjeva na drugom sjedištu A6. Pogrešno postavljene sigurnosne postavke A7. Nesigurna pohrana šifriranih podataka A8. Nezaštićeni pristup URL-ovima A9. Nedovoljna zaštita na transportnom sloju A10. Neprovjerena preusmjeravanja i proslijeđivanja U daljnjem tekstu biti će pobliže objašnjena svaka od navedenih ranjivosti, biti će navedeni uvjeti u kojima se ranjivosti pojavljuju, te kako se one mogu iskoristiti. Osim toga biti će navedeni i načini na koje se aplikacije može zaštititi od ovih ranjivosti. 2. Umetanje Nedostaci vezani uz umetanje javljaju se kada aplikacija preuzima i obrađuje nepouzdane podatke. Napadi umetanjem su vrlo rasprostranjeni, posebice su česti u SQL, LDAP i XPath upitima, OS naredbama itd. [2] SQL umetanje je tehnika koja se često koristi za napad na web stranicu. Umetanje se obavlja uključujući dijelove SQL izraza u ulazno polje web obrasca s ciljem prosljeđivanja SQL naredbe bazi podataka (npr. za slanje sadržaja baze podataka napadaču). SQL umetanje je tehnika ubrizgavanja kôda koja iskorištava sigurnosni propust u kôdu web stranice. Ranjivost se iskorištava kada se iz korisničkog unosa krivo filtriraju evakuacijski znakovi ugrađeni u SQL naredbe ili kada je unos nepravilno upisan i neočekivano izvršen. SQL naredbe se tada umeću iz web obrasca u bazu podataka (kao i upiti) kako bi promjenili sadržaj baze podataka ili izvukli iz nje za napadača podatke kao što su brojevi kreditnih kartica ili lozinke. SQL umetanje je uglavnom poznat kao napad na web stranice, ali se može koristiti kao napad na bilo koju vrstu SQL baze podataka. U produkcijskom okruženju je primijećeno da je učestalost napada na aplikacije u prosjeku 71 pokušaj u satu. Napad SQL umetanjem (SQLIA) sadrži pet glavnih pod-klasa ovisno o tehničkim aspektima napada na implementaciju: - Klasična SQLIA Zaključivanje SQL umetanjem Interakcija s SQL umetanjem SQLIA specifična za sustave upravljanja bazama podataka Složena SQLIA 2.1. Primjeri napada Primjer 1: Pogrešno filtriranje znakova „escape“ Ovaj oblik SQL umetanja događa se kada se iz korisničkog unosa ne filtriraju znakovi „escape“, te se proslijeđuju u SQL naredbu. To rezultira mogućim manipulacijama izjava koje se provode na bazi od strane krajnjeg korisnika zahtjeva. Sljedeća linija kôda ilustrira ovu ranjivost: statement = "SELECT * FROM users WHERE name = '" + userName + "';" Ovaj SQL kôd je dizajniran kako bi izvukao evidenciju o navedenom korisničkom imenu iz svoje baze korisnika. Međutim, ako je varijabla "userName" izrađena na specifičan način od strane zlonamjernog korisnika, SQL naredba može učiniti više nego što joj je autor namijenio. Na primjer, ako se varijabla "userName" postavi kao: ' or '1'='1 ili pomoću komentara čak i blokira ostatak upita (postoje tri vrste SQL komentara): ' or '1'='1' -- ' ' or '1'='1' ({ ' ' or '1'='1' /* ' dobiva se jedna od sljedećih SQL naredbi: SELECT * FROM users WHERE name = '' OR '1'='1'; SELECT * FROM users WHERE name = '' OR '1'='1' -- '; Ako se taj kôd koristi u postupku autentifikacije, onda se na ovaj način može na silu odabrati valjano korisničko ime, jer je izjava '1 '= '1' uvijek istinita. Sljedeća vrijednost varijable "userName" u niže navedenoj izjavi će uzrokovati brisanje baze "users" kao i dohvaćanje svih podataka iz baze "userinfo" (u suštini otkriva podatke o svakom korisniku), koristeći API koji dozvoljava višestruke izraze: a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't S ovim unosom, konačna SQL naredba je definirana kao: SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't'; Dok većina implementacija SQL servera omogućuje višestruke izjave koje se izvršavaju iz jednog poziva na ovaj način, neki SQL API-ji kao što je PHP-ova funkcija mysql_query(); to ne dopuštaju iz sigurnosnih razloga. Na taj način napadača se sprječava pri ubrizgavanju potpuno odvojenih upita, ali ne zaustavlja ih se od modificiranja upita. Primjer 2: Nepravilno rukovanje tipovima podataka Ovaj oblik SQL umetanja događa se kada se ne provjerava tip podataka unesen u korisničko polje. To bi se moglo dogoditi kada se u SQL izjavi koristi brojčano polje, ali programer ne provjerava da bi potvrdio da je korisnikov unos numerički. Na primjer: statement := "SELECT * FROM userinfo WHERE id = " + a_variable + ";" Iz ove izjave je jasno da je autor namjeravao koristiti a_variable kao broj koreliran s poljem "id". Međutim, ako je to u stvari string onda krajnji korisnik može manipulirati izjavom kako želi, zaobilazeći tako potrebu za znakom „escape“. Na primjer, postavljanje a_variable na: 1;DROP TABLE users će izazvati brisanje tablice „users“ iz baze podataka, jer bi SQL izjava bila izvedena kao: SELECT * FROM userinfo WHERE id=1;DROP TABLE users; Primjer 3: Slijepo SQL umetanje Slijepo SQL umetanje se koristi kada je web aplikacija ranjiva na SQL umetanje, ali rezultati umetanja nisu vidljivi napadaču. Stranica sa prepoznatom ranjivosti možda neće prikazati podatke, ali će prikaz biti drugačiji ovisno o rezultatima logičke izjave umetnute u legitimnu SQL izjavu koja se poziva na toj stranici. Ova vrsta napada može postati vremenski intenzivna jer nova izjava mora biti izrađena za svaki otkriveni dio. Postoji nekoliko alata kojima se ovi napadi mogu automatizirati jednom kada je otkriveno mjesto ranjivosti i meta napada. Jedna vrsta slijepog SQL umetanja prisiljava bazu podataka da procjeni logičnu izjavu na običnom zaslonu aplikacije. SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND '1'='1'; će rezultirati normalnom stranicom dok će SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND '1'='2'; vjerojatno dati drugačiji rezultat, ako je stranica ranjiva na SQL umetanje. Ovakvo umetanje može usmjeriti napadača da je slijepo SQL umetanje moguće, ostavljajući napadaču mogučnost da razlikuje izjave koje su dale kao rezultat istinu ili laž, ovisno o sadržaju drugog stupca ili tablice izvan stupca naredbe SELECT. SELECT 1/0 FROM users WHERE username='ooo'; Druga vrsta slijepog SQL umetanja koristi uvjetno vrijeme kašnjenja koje napadača navodi na zaključak je li SQL naredba rezultirala istinitim ili lažnim stanjem. [3] 2.2. Izbjegavanje napada umetanjem Za izbjegavanje napada umetanjem koriste se parametrizirani izrazi, izbjegavanje umetanja, provjera uzoraka, te dozvole za baze podataka. [3] 2.2.1. Parametrizirani izrazi Kod većine razvojnih platformi, mogu se koristiti parametrizirani izrazi u radu s parametrima (ponekad se nazivaju vezivne varijable) umjesto ugrađivanja korisničkog unosa u izraz. Takvi parametri mogu samo pohraniti vrijednost danog tipa, a ne i proizvoljni SQL fragment. Stoga bi SQL umetanje jednostavno bilo tretirano kao čudna (a vjerojatno i nevažeća) vrijednost parametra. U mnogim slučajevima, SQL je fiksiran, a svaki parametar je skalar, ne tablica. Korisnički unos je tada pridijeljen (vezan) za parametar. 2.2.2. Izbjegavanje Jednostavan, iako neprecizan, način da se spriječi umetanje je izbjegavanje znakova koji imaju posebno značenje u SQL-u. Priručnik za SQL DBMS objašnjava koji znakovi imaju posebno značenje, što omogućava stvaranje sveobuhvatne crne liste znakova koji trebaju translaciju. Na primjer, svaka pojava jednog jednostrukog navodnika (') u izrazu mora biti zamijenjena s dva jednostruka navodnika ('') da se formira valjan SQL string. Na primjer, u PHP-u je uobičajeno izbjegavanje parametara pomoću funkcije mysql_real_escape_string(); prije slanja SQL upita: $query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'", mysql_real_escape_string($Username), mysql_real_escape_string($Password)); mysql_query($query); Funkcija mysql_real_escape_string () poziva MySQL-ovu biblioteku mysql_real_escape_string, koja na početak dodaje znakove '\': \x00, \n, \r, \', \" i \x1a. Ova funkcija se uvijek (uz nekoliko iznimaka) mora koristiti kako bi podaci bili sigurni prije slanja upita MySQL-u. Postoje i druge funkcije za ostale vrste baza podataka u PHP-u poput pg_escape_string() za PostgreSQL. Postoji također jedna funkcija koja se koristi za izbjegavanje znakova, a koristi se posebno za upite bazama podataka koje nemaju funkcije za izbjegavanje u PHP-u. Ta funkcija je: addslashes (string $str). Ona vraća string sa znakovima '\' prije znakova koje treba staviti pod navodnike u upitima bazama podataka, itd. Ti znakovi su jednostruki navodnici ('), dvostruki navodnici ("), backslash (\) i NUL. Rutinska pretraga stringova za izbjegavanje u SQL-u može lako dovesti do pogrešaka, jer je lako zaboraviti izbjeći određeni string. Stvaranje transparentnog sloja koji bi osigurao unos može smanjiti broj pogrešaka, ako ne i u potpunosti ih eliminirati. 2.2.3. Provjera uzoraka Parametri tipa integer, float ili boolean se mogu provjeriti (da li njihova vrijednost odgovara tom tipu). Za stringove koji moraju biti određenog formata (datum, samo alfanumerički znakovi, itd.) se može provjeriti da li odgovaraju tom formatu. 2.2.4. Dozvole za bazu podataka Ograničavanje dozvola kod prijave na bazu podataka koju koristi web aplikacija na samo ono što je potrebno može pomoći smanjiti učinkovitost bilo kakvih napada umetanjem SQL-a koji iskorištavaju greške u web aplikaciji. Na primjer za SQL Server, prijava na bazu podataka može biti ograničena na odabir samo nekih stupaca u sustavu kako bi se ograničila eksploatacija kojom se pokušava ubaciti JavaScript u sve tekstualne stupce u bazi podataka. deny deny deny deny SELECT SELECT SELECT SELECT ON ON ON ON sys.sysobjects TO webdatabaselogon; sys.objects TO webdatabaselogon; sys.TABLES TO webdatabaselogon; sys.views TO webdatabaselogon; 3. Cross-site scripting Cross-site scripting (XSS) je vrsta ranjivosti koja se obično nalazi u web aplikacijama kao što su web preglednici, a očituje se kroz povrede sigurnosti preglednika, te omogućuje napadačima da na strani klijenta unesu skripte koje će biti vidljive drugim korisnicima. Ovu ranjivost napadač može iskoristiti da bi zaobišao kontrolu pristupa. Cross-site scripting na web stranicama čini oko 84% svih sigurnosnih propusta dokumentiranih od strane Symanteca 2007. godine. Njihov učinak može biti na razini od sitne neugodnosti do značajnog sigurnosnog rizika, ovisno o osjetljivosti podataka kojima ranjiva stranica barata kao i o prirodi implementiranih metoda izbjegavanja/umanjivanja ranjivosti. Sigurnost na webu se temelji na različitim mehanizmima, ali većina se temelji na konceptu politike istog podrijetla. Takvo se povjerenje bazira na tome, da ako se vjeruje da je sadržaju iz https://mybank.example dano dopuštenje za pristup resursima na nekom sustavu, onda će bilo koji sadržaj s te stranice imati ta dopuštenja, dok će sadržaju s druge stranice https://othersite.example dopuštenje trebati biti dodijeljeno zasebno. Cross-site scripting koristi poznate ranjivosti u web aplikacijama, njihovim serverima ili ostalim sustavima na koja se aplikacije oslanjaju. Iskorištavanjem jednog od njih, napadači umeću zlonamjeran sadržaj u sadržaj koji se isporučuje s kompromitirane stranice. Kada kombinirani sadržaj stigne na klijentsku stranu web preglednika, sav je dostavljen iz pouzdanog izvora, a time djeluje pod dozvolama odobrenima tom sustavu. Pronalaženjem načina za umetanje zlonamjernih skripti na web stranicama, napadač može steći povišeni pristup ovlaštenja za osjetljivi sadržaj stranice, sjednične cookieje i razne druge informacije koje preglednik vodi u ime korisnika. Cross-site scripting napadi su ustvari poseban slučaj umetanja kôda. Izraz "cross-site scripting"se izvorno odnosio na čin učitavanja napadnute web aplikacije od strane stranice koja nije povezana s napadom, na način da se izvršava JavaScript fragment koji je napadač pripremio u sigurnosnom kontekstu ciljane domene (reflektirana ili nepostojana XSS ranjivost). Definicija se postupno proširila te obuhvaća i druge oblike umetanja kôda, uključujući i postojane i ranjivosti nevezane uz Javascript (uključujući Java, ActiveX, VBScript, Flash ili čak čisti HTML i SQL upite). XSS ranjivost je poznata i iskorištavana još od 1990-tih godina. Ugledne stranice koje su u prošlosti imale ovu ranjivost uključuju društvene stranice Twitter, Facebook, MySpace i Orkut. U posljednjih nekoliko godina, cross-site scripting je nadmašio probleme sa prepunjavanjem spremnika te postala sigurnosna ranjivost o kojoj se najčešće javno izviještava. Prema nekim istraživačima u 2007. pregledavanje čak 68% web stranica je osjetljivo na XSS napade. [4] 3.1. Tipovi XSS ranjivosti Ne postoji niti jedna standardizirana klasifikacija cross-site scripting ranjivosti, ali većina stručnjaka razlikuje barem dvije osnovne vrste XSS ranjivosti: nepostojana i postojana. Neki izvori dodatno dijele ove dvije skupine u tradicionalne (uzrokovana propustima u kôdu na strani servera) i one utemeljene na kôdu na klijentskoj strani. Tradicionalne cross-site scripting ranjivosti će se pojaviti na strani servera nadležnog za pripremu HTML odgovora koji mora biti poslužen korisniku. Ranjivosti temeljene na kôdu na klijentskoj strani javljaju se u fazi obrade sadržaja koja se provodi na strani klijenta, obično na klijentskoj strani JavaScript-a. 3.1.1. Nepostojana XSS ranjivost Nepostojana (ili reflektirajuća) cross-site scripting ranjivost je najčešći tip ove ranjivosti. Ove manjkavosti se pojavljuju kada podatke koje pruža web klijent, najčešće u parametrima HTTP upita ili HTML obrascima, odmah koriste skripte na strani poslužitelja za generiranje rezultantne stranice za tog korisnika, bez ispravne obrade zahtjeva. HTML dokumenti imaju serijsku strukturu u kojoj se kombiniraju kontrolne naredbe, one za formatiranje i stvarni sadržaj, te će bilo koji neprovjereni sadržaj dobiven od korisnika biti sadržan u rezultantnoj stranici bez odgovarajućeg HTML kodiranja što može dovesti do umetanja. Klasičan primjer potencijalnog problema je stranica nekog pretraživača: ako se traži neki niz, traženi niz će obično biti doslovno označen na pronađenoj stranici kako bi se naznačilo ono što je traženo. Ako ta rezultantna stranica neispravno odbacuje HTML-ove kontrolne znakove, iskoristit će se cross-site scripting ranjivost. Reflektirajući napad se obično izvodi putem e-maila ili neutralne web stranice. Mamac je URL ispravnog izgleda, koji ukazuje na pouzdano mjesto, ali sadrži XSS vektor. Ako je pouzdana stranica ranjiva na vektor, klikom na link žrtvin preglednik može pokrenuti umetnute skripte. 3.1.2. Postojana XSS ranjivost Postojana (ili pohranjena) XSS ranjivost je razornija varijanta cross-site scripting ranjivosti. Pojavljuje se kada se podaci koje je napadač pripremio spremaju na poslužitelju, a zatim trajno prikazuju na "normalnim" stranicama koje se vraćaju drugim korisnicima tijekom redovitog pregledavanja, bez odgovarajućeg izbjegavanja HTML-a. Klasičan primjer ove ranjivosti se javlja na javnim online forumima gdje korisnici mogu postavljati HTML formatirane poruke koje čitaju ostali korisnici. Na primjer, pretpostavimo da postoji web stranica za romantično uparivanje na kojoj članovi mogu pregledavati profile drugih članova te izabrati one koji im izgledaju zanimljivo. Zbog zaštite privatnosti ova stranica skriva stvarno ime i e-mail adrese svojih članova. Ti su tajni podaci čuvani na poslužitelju. Pravo ime i e-mail adresa člana su u pregledniku jedino kada je član prijavljen, a te podatke ne može vidjeti nitko drugi. Pretpostavimo da se napadač, pridružuje stranici i želi saznati stvarna imena ljudi čije profile vidi na stranici. Da bi si to omogućio, sastavlja skriptu koja se pokreće iz preglednika ženskih članova kada posjete neki muški profil. Skripta zatim šalje brzu poruku napadačevom serveru, koji prikuplja ove podatke. Da bi to učinio, na pitanje "Opišite vaš idealan prvi izlazak" napadač daje kratki odgovor (kako ne bi izazvao sumnje), ali na kraju svog odgovora dodaje skriptu koja će ukrasti imena i e-mail adrese. Ako je skripta zatvorena unutar <script> elementa, ona neće biti prikazana na zaslonu. Pretpostavimo da neka članica ove stranice pregleda napadačev profil koji sadrži ovaj odgovor na pitanje o prvom izlasku. Preglednik će automatski pokrenuti njegovu skriptu i ukrasti njeno pravo ime i e-mail adresu direktno s njezinog računala. Postojani XSS može imati veći utjecaj od drugih vrsta, jer se napadačeva zlonamjerna skripta prenosi automatski, bez potrebe za individualnim ciljanjem žrtava ili njihovim mamljenjem na web stranicu treće strane. Osobito u slučaju socijalnih mreža, kôd može biti dodatno dizajniran tako da se autonomno širi s računa na račun stvarajući neku vrstu crva na klijentskoj strani. Načini umetanja se mogu vrlo mnogo razlikovati. U nekim slučajevima, napadač čak ne mora izravno komunicirati sa samom funkcionalnosti web-a kako bi iskoristio ovu ranjivost. Svi podaci koje web aplikacija zaprimi (putem e-maila, sustava za prijavu itd.) a koje napadač može kontrolirati mogu postati vektor umetanja. [4] 3.2. Primjeri iskorištavanja XSS ranjivosti Napadači koji namjeravaju iskoristiti cross-site scripting ranjivost moraju drugačije pristupiti svakoj vrsti ranjivosti. Ovdje je opisan specifičan način napada za svaku vrstu. [4] Primjer nepostojane XSS ranjivosti: 1. Ana često posjećuje određenu web stranicu, koju objavljuje Marko. Markova web stranica omogućuje Ani da se prijavi pomoću para korisničko ime/lozinka i pohrani osjetljive podatke kao što su podaci o naplati računa. 2. Marija primjećuje da je Markova web stranica osjetljiva na XSS ranjivost. 3. Marija kreira URL koji će iskoristiti ovu ranjivost, te šalje Ani e-mail kojim je potiče da klikne na link za URL pod lažnim izlikama. Ovaj URL će biti usmjeren na Markovu web stranicu, ali će sadržavati Marijin zlonamjerni kôd koji će web stranica reflektirati. 4. Ana posjećuje URL koji joj je Marija poslala dok je prijavljena na Markovu web stranicu. 5. Zlonamjerna skripta ugrađena u URL se izvršava u Aninom pregledniku, kao da je došla izravno s Markovog poslužitelja (to je stvarna XSS ranjivost). Skripta se može koristiti za slanje Aninog sjedničnog cookieja Mariji. Marija tada može iskoristiti sjednični cookie i ukrasti povjerljive informacije koje su dostupne Ani (autentifikacijske podatke, podatke o naplati itd.) bez da Ana sazna za to. Primjer postojane XSS ranjivosti: 1. Marija objavljuje poruku sa zlonamjernim kôdom na društvenoj mreži. 2. Kad Marko čita poruke, Marijin XSS krade Markov sjednični cookie. 3. Marija sada može oteti Markovu sjednicu i imitirati ga. 3.3. Smanjivanje prijetnje Postoji nekoliko načina za smanjivanje prijetnje od cross-site scripting napada: 3.3.1. Kontekstualno kodiranje/provjera ulaznog niza Primarni obrambeni mehanizam za zaustavljanje XSS napada je kontekstualno kodiranje/provjera korisničkog unosa. Postoji nekoliko različitih shema koje se moraju koristiti ovisno o tome gdje je nepouzdani string smješten unutar HTML dokumenta, uključujući HTML kodiranje entiteta, iznjegavanje JavaScript-a, izbjegavanje CSS-a i URL kodiranje. Većina web aplikacija koje ne trebaju prihvatiti složene podatke mogu na ovaj način u velikoj mjeri eliminirati rizik od XSS napada na prilično jednostavan način. Važno je napomenuti da, iako se obično preporuča, jednostavno entitetsko HTML kodiranje na pet XML-u značajnih znakova nije uvijek dovoljno kako bi se spriječilo mnoge oblike XSS napada. Kodiranje može biti nezgodno, a pritom se preporuča korištenje biblioteke sigurnosti kodiranja. 3.3.2. Sigurnosna provjera nepouzdanog HTML unosa Mnogi operateri pojedinih web aplikacija (npr. forumi i webmail) žele omogućiti korisnicima da koriste neke od značajki koje HTML pruža, kao što je ograničeni podskup HTML oznaka. Kada prihvaćaju korisnički HTML unos (na primjer <b> vrlo </b> velik), samo njegovo kodiranje (na primjer <b>vrlo</b> velik) neće biti dovoljno jer korisnički unos treba biti predan pregledniku kao HTML (kako bi se prikazao kao "vrlo velik", umjesto "<b> vrlo </ b> velik"). Zaustavljanje XSS napada prilikom prihvaćanja korisničkog HTML ulaza je u ovom slučaju puno složenije. Nepouzdani HTML unos mora se uskladiti sa HTML politikom kako bi se osiguralo da ne sadrži XSS. HTML alati za pročišćavanje kao što su OWASP AntiSamy i http://htmlpurifier.org/ ostvaruju taj zadatak. 3.3.3. Sigurnost cookieja Osim filtriranja sadržaja, često se koriste i druge nesavršene metode za ublažavanje cross-site scriptinga. Jedan primjer je korištenje dodatnih sigurnosnih kontrola pri rukovanju korisničkom autentifikacijom baziranom na cookiejima. Mnoge web aplikacije se oslanjaju na sjednične cookieje za autentifikaciju između pojedinih HTTP zahtjeva, te budući da klijentske skripte generalno imaju pristup tim cookiejima, jednostavni XSS napadi ih mogu ukrasti. Za ublažavanje ovog tipa prijetnji (iako ne i XSS problema općenito), mnoge web aplikacije vežu sjednične cookieje za IP adresu korisnika kojom se u početku prijavio, te dozvoljavaju samo toj IP adresi korištenje tog cookieja. Ta je metoda u većini situacija učinkovita (ako je napadaču cilj ukrasti cookie), ali ne djeluje u situacijama u kojima napadač prisvoji tuđu IP adresu. Druga metoda ublažavanja koja je prisutna u Internet Exploreru (od verzije 6), Firefoxu (od verzije 2.0.0.5), Safariju (od verzije 4), Operi (od verzije 9.5) i Google Chromeu je zastavica HttpOnly koja omogućuje web serveru postavljanje cookieja koji nisu dostupni klijentskim skriptama. Iako se pokazala korisnom, ova metoda ne spriječava krađu cookieja u potpunosti niti može spriječiti napade unutar preglednika. 3.3.4. Onemogućavanje skripti Dok dizajneri Web 2.0 i Ajaxa preferiraju korištenje JavaScripta, neke web aplikacije su pisane (ponekad opcionalno) tako da nemaju nikakve potrebe za klijentskim skriptama. To omogućuje korisnicima, ako se odluče na to, da onemoguće skripte u svojim preglednicima prije korištenja aplikacije. Na taj način, čak i potencijalno zlonamjerne klijentske skripte mogu biti umetnute na stranici bez ikakvih provjera, a korisnici neće biti ranjivi na XSS napade. Neki preglednici ili njihovi dodaci mogu biti konfigurirani tako da onemogućavaju klijentske skripte ovisno o pojedinoj domeni. Ako je skriptiranje inicijalno postavljeno kao dozvoljeno, tada ovaj pristup ima ograničen uspjeh, jer se blokira loše stranice tek nakon što korisnik zna da su loše kada je već prekasno. Funkcionalnost da se inicijalno blokiraju sve skripte i vanjski dodaci, a zatim omogući korisniku da ih omogući za pojedinu domenu je učinkovitiji. Ova mogućnost postoji u Internet Exploreru od verzije 4 postavljanjem takozvanih "sigurnosnih zona", te u Operi od verzije 9 korištenjem postavke "Site Specific Preferences". Rješenje za Firefox i druge preglednike bazirane na Gecko-u je open source dodatak NoScript koji, uz mogućnost da se omogućava korištenje skripti za pojedine domene, daje neke zaštite od XSS napada čak i kada su omogućene skripte. Najznačajniji problem s blokiranjem svih skripti na svim stranicama je značajno smanjenje funkcionalnosti i brzine (klijentske skripte mogu biti puno brže nego serverske jer ne trebaju spajanje na udaljeni poslužitelj pa se stranica ne treba iznova učitavati). Drugi problem s blokiranjem skripti je u tome da ga mnogi korisnici ne razumiju i ne znaju kako pravilno osigurati svoje preglednike. Još jedan nedostatak je da mnoge web stranice ne rade bez klijentskih skripti, prisiljavajući tako korisnike da si onemoguće zaštitu za tu domenu i tako otvaraju svoj sustav ranjivostima. Firefoxov dodatak NoScript omogućuje korisnicima selektivno omogućavanje skripti na određenoj stranici dok ostale istovremeno ostaju blokirane na istoj stranici. Primjerice, skripte iz example.com mogu biti dopuštene, dok skripte iz advertisingagency.com koje se pokušavaju pokrenuti na istoj stranici mogu biti onemogućene. 3.3.5. Nadolazeće obrambene tehnologije Postoje tri kategorije XSS obrane koje su u nastajanju. To uključuje Mozilla-in „Content Security Policy“, Javascript Sandbox alati i predlošci za automatsko izbjegavanje XSS napada. Ti mehanizmi se još uvijek razvijaju, ali obećavaju budućnost sa znatno umanjenim mogućnostima XSS napada. [4] 4. Loša autentifikacija i upravljanje sjednicama 4.1. Autentifikacija Autentifikacija je proces provjere da je pojedinac ili subjekt ono što tvrdi da je. Obično se izvodi tako da korisnik da korisničko ime ili identifikacijsku oznaku te jednu ili više privatnih informacija koje bi samo korisnik trebao znati. [5] 4.1.1. Smanjivanje prijetnje kod autentifikacije Preporuke za smanjivanje prijetnje kod autentifikacije odnose se na pravilan izbor korisničkog imena, te pravilo provođenje provjere snage zaporke. 4.1.1.1. Odabir korisničkog imena Preporuča se ne razlikovati mala i velika slova u korisničkom imenu. Mnoge stranice koriste e-mail adrese kao korisnička imena te one već same po sebi ne razlikuju velika i mala slova. Bilo bi naime vrlo čudno da korisnička imena 'Ivan' i 'ivan' pripadaju različitim korisnicima. U tom bi slučaju moglo doći do ozbiljnih zabuna. 4.1.1.2. Pravilno provođenje provjere snage zaporke Ključna briga kod korištenja lozinke kao metode autentifikacije je snaga zaporke. Politika "jake" lozinke otežava ili čak potpuno onemogućava pogađanje lozinke bilo ručno ili automatskim putem. Sljedeće karakteristike definiraju snažnu lozinku: - duljina lozinke Dulje lozinke pružaju veću kombinaciju znakova, te time otežavaju pogađanje napadaču. Minimalnu duljinu lozinke treba provjeravati aplikacija. Lozinke kraće od 10 znakova smatraju se slabima. Minimalna dužina lozinke može uzrokovati probleme s pamćenjem lozinki među nekim korisnicima, pa ih aplikacije trebaju potaknuti da ih postave kao fraze (rečenice ili kombinacije riječi) koje mogu biti puno dulje od uobičajenih lozinki a opet mnogo lakše za zapamtiti. Maksimalna duljina lozinke ne bi trebala biti postavljena prenisko, jer će spriječiti korisnika da za lozinku postavi frazu. Tipično je maksimalna duljina 128 znakova. Lozinke kraće od 20 znakova se obično smatra slabima ako se sastoje samo od malih latiničnih slova. Treba se pobrinuti da svaki znak koji korisnik upiše bude uključen u lozinku. Neki sustavi skrate lozinku koju je korisnik upisao (npr. Korisnik je unio 20 znakova što je skraćeno na 15 znakova). Ovo se obično rješava postavljanjem duljine svih lozinki na točno maksimalnu duljinu lozinke. To je osobito važno ako je maksimalna dužina lozinke mala. - složenost lozinke Aplikacije bi trebale nametati složenost lozinki kako bi smanjile broj lozinki koje je lako pogoditi. Mehanizmi lozinki bi trebali omogućiti upis gotovo bilo kojeg znaka kao dijela korisničke lozinke, uključujući razmak. Lozinke bi trebale razlikovati velika i mala slova u cilju povećanja njihove složenosti. Povremeno se mogu pronaći sustavi gdje se u lozinkama ne razlikuju velika i mala slova. Mehanizam promjene lozinke treba zahtijevati minimalnu razinu složenosti koja ima smisla za određenu primjenu i tip korisnika. Na primjer: Lozinka mora zadovoljiti barem tri od sljedeća četiri pravila složenosti barem 1 veliko slovo (A-Z) barem 1 malo slovo (a-z) barem 1 znamenka (0-9) barem jedan poseban znak ("£ $% & ...!) Mora imati najmanje 10 znakova. Mora imati najviše 128 znakova. Ne smije imati više od dva identična znaka u nizu (npr. Niz 111 nije dopušten) Što veći stupanj složenosti lozinke aplikacija zahtjeva, to zahtjevi moraju biti jasnije naglašeni. Potrebna politika mora biti izričito navedena na stranici promjene lozinke (trebalo bi navesti svaki poseban znak koji je dozvoljen kako bi korisniku pravila bila jasna). U idealnom slučaju, aplikacija bi trebala ukazivati korisniku na to koliki stupanj složenosti zadovoljava njegova nova lozinka. Aplikacija ne bi trebala prihvatiti unos nove lozinke dok nova lozinka ne zadovolji politiku složenosti lozinke i dok drugi primjerak nove lozinke ne odgovara prvom. Tako će korisnik lakše razumjeti i prilagoditi složenost svoje lozinke. Ako nova lozinka nije usklađena sa politikom složenosti, poruka o pogrešci treba opisati sva pravila složenosti s kojima nova lozinka nije u skladu, a ne samo prvo pravilo. Promjena lozinke bi ponajprije trebala biti jednostavan postupak. 4.1.1.3. Osiguranje sigurnog mehanizma za oporavak lozinke Uobičajeno je imati mehanizam koji osigurava pristup korisnika svom računu u slučaju da zaboravi svoju lozinku. 4.1.1.4. Zahtijevanje ponovne autentifikacije za osjetljive značajke Kako bi se ublažili utjecaji CSRF napada i otmice sjednice, važno je zahtijevati trenutne autentifikacijske podatke vezane za račun prije otkrivanja osjetljivih podataka o računu kao što su korisnikova lozinka ili korisnikov e-mail, ili prije osjetljivih radnji kao što je slanje pošiljke na neku novu adresu. Bez te protumjere, napadač može biti u mogućnosti izvršiti osjetljive transakcije kroz CSRF ili XSS napade bez potrebe da zna korisnikove trenutne autentifikacijske podatke. Osim toga, napadač može dobiti privremeni fizički pristup korisnikovom pregledniku ili ukrasti njegov ID sjednice te preuzeti korisnikovu sjednicu. 4.1.1.5. Korištenje višefaktorske autentifikacije Višefaktorska autentifikacija koristi više od jednog autentifikacijskog faktora za prijavu ili obradu transakcije: - Nešto što korisnik zna (pojedinosti računa ili lozinki) - Nešto što korisnik ima (token ili mobilni telefon) - Nešto što korisnik je (biometrija) Autentifikacijska shema kao što je jednokratna lozinka (eng. One time password, OTP) provedena pomoću hardverskog tokena također može biti ključna u borbi protiv napada poput CSRF i zlonamjernog kôda s klijentske strane. Velik broj hardverskih tokena pogodnih za višefaktorsku autentifikaciju i dostupnih na tržištu omogućuju dobru integraciju s web aplikacijama. 4.1.1.6. Pravilno postavljene poruke o pogreškama pri autentifikaciji Pogrešno postavljene poruke o pogreškama pri autentifikaciji mogu se iskoristiti za potrebe pobrojavanja korisničkih imena i pripadnih lozinki. Na zahtjev za autentifikacijom treba odgovoriti na generički način bez obzira je li netočno korisničko ime ili lozinka. Odgovor nikako ne bi trebao dati naznake o statusu postojećeg korisničkog računa. Autentifikacijski zahtjev može vratiti drugačiji HTTP error code ovisno o odgovoru na pokušaj autentifikacije. Može odgovoriti sa 200 za pozitivan rezultat a 403 za negativan rezultat. Iako se korisniku prikaže stranica sa generičkom pogreškom, HTTP response code se može razlikovati te može odati informacije o valjanosti računa. 4.1.1.7. Prijenos lozinke samo preko TLS-a Stranici prijave i svim kasnijim autentificiranim stranicama mora se pristupiti isključivo preko TLS-a. Nekorištenje TLS-a za pristup stranici prijave omogućuje napadaču promjenu obrasca prijave, te slanje korisničkih podataka i njihovu objavu na proizvoljnom mjestu. Nekorištenje TLS-a za ostale autentificirane stranice nakon stranice prijave omogućuje napadaču da vidi nekriptirani ID sjednice te kompromitira autentificiranu korisničku sjednicu. 4.1.1.8. Implementacija blokiranja računa Ako je napadač u stanju pogoditi lozinku prije nego korisnički račun postane blokiran zbog neuspjelih pokušaja autentifikacije, napadač ima priliku nastaviti s „brute force“ napadom dok račun ne postane kompromitiran. Automatiziranje napada nagađanja lozinke na web aplikacijama je trivijalan izazov. Mehanizam blokiranja lozinke treba biti korišten tako da blokira račun ako je napravljeno više od određenog broja neuspjelih pokušaja prijave. Mehanizmi blokiranja lozinke imaju logičku slabost. Napadač koji izvede veliki broj pokušaja autentifikacije na poznatim imenima računa može uzrokovati blokiranje cijelih blokova korisničkih računa. S obzirom da je svrha sustava blokiranja lozinke zaštitita od „brute force“ napada, dobra strategija je blokiranje računa na određeno vremensko razdoblje (npr. 20 minuta). Time se značajno usporava napadače, a legitimni korisnici svojim računima mogu ponovno pristupiti. [5] 4.2. Upravljanje sjednicama Upravljanje sjednicom je proces kojim poslužitelj održava stanje subjekta s kojim je u interakciji. Ono je potrebno kako bi poslužitelj zapamtio kako reagirati na naknadne zahtjeve u cijeloj sjednici. Sjednice se održavaju na poslužitelju pomoću varijable SESSION ID koja se može prenositi više puta između klijenta i poslužitelja kod slanja i primanja zahtjeva. Sjednica bi trebala biti jedinstvena po korisniku i računski vrlo teška za predvidjeti. Web sjednica je slijed HTTP transakcija zahtjeva i odgovora povezanih s istim korisnikom. Moderne i složene web aplikacije zahtijevaju zadržavanje informacija ili statusa o svakom korisniku za vrijeme trajanja višestrukih zahtjeva. Dakle, sjednice pružaju mogućnost uspostave varijabli - kao što su prava pristupa i lokalizirane postavke - koje će se primijeniti na svaku interakciju korisnika sa web aplikacijom za vrijeme trajanja sjednice. Web aplikacije mogu kreirati sjednice za praćenje anonimnih korisnika nakon prvog zahtjeva od strane korisnika (primjerice za pamćenje odabranih jezičnih postavki). Dodatno, web aplikacije će koristiti sjednice nakon autentifikacije korisnika. Time se osigurava sposobnost identifikacije korisnika za naknadne zahtjeve, kao i mogućnost primjene sigurnosne kontrole pristupa, ovlaštenog pristupa privatnim podacima korisnika, te povećanje iskoristivosti aplikacije. Stoga današnje web aplikacije mogu osigurati primjenu sjednica i prije i poslije autentifikacije. Nakon uspostavljanja autentificirane sjednice, ID sjednice (ili tokena) je privremeno ekvivalentan najjačoj metodi autentifikacije koju koristi aplikacija, kao što je korisničko ime i lozinka, jednokratna lozinka, klijentski digitalni certifikat, pametna kartica ili neka biometrijska metoda (otisak ili šarenica oka). HTTP je protokol koji ne zadržava stanje, u kojem je svaki par zahtjev i odgovor neovisan od drugih web interakcija. Zbog toga je za uvesti pojam sjednice, potrebno uvesti sposobnost upravljanja sjednicama kojom se povezuje i modele autentifikacije i modele kontrole pristupa koji su obično dostupni u web aplikacijama kako je prikazano na slici 1. Autentifikacija Upravljanje sjednicama Kontrola pristupa Slika 1. Povezivanje modela autentifikacije i kontrole pristupa ID ili token sjednice veže podatke za korisničku autentifikaciju (u obliku korisničke sjednice) s HTTP prometom korisnika uz odgovarajuće kontrole pristupa koje nameće web aplikacija. Kompleksnost ove tri komponente (autentifikacija, upravljanje sjednicama i kontrola pristupa) u modernim web aplikacijama, uz činjenicu da njihova provedba i povezivanje ovisi o programeru, čini izvedbu sigurnog modula za upravljanje sjednicama vrlo izazovnom. Otkrivanje, hvatanje, predviđanje, pogađanje ili fiksacija identifikatora sjednice će dovesti do napada otimanja sjednice, gdje je napadač u mogućnosti u potpunosti imitirati žrtvu korisnika te web aplikacije. Napadači mogu obavljati dvije vrste napada otimanja sjednice, ciljane ili općenite. Kod ciljanog napada napadaču je cilj utjeloviti točno određenog korisnika web aplikacije. Kod općenitog napada napadaču je cilj utjeloviti bilo kojeg legitimnog korisnika web aplikacije. [6] 4.2.1. Svojstva identifikatora sjednice Kako bi se pratilo autentificirano stanje te kretanje korisnika unutar web aplikacije, aplikacija pridružuje korisniku identifikator sjednice (ID ili token sjednice) koji se dodjeljuje prilikom započinjanja sjednice, a dijele ga i razmjenjuju strana korisnika i strana web aplikacije za čitavo vrijeme trajanja sjednice (šalje se sa svakim HTTP zahtjevom). Identifikator sjednice je par „ime = vrijednost“. Radi osiguranja sigurnog identifikatora sjednice, generiranje identifikatora (ID-a ili tokena) mora ispunjavati sljedeća svojstva: - Naziv identifikatora sjednice Naziv koji koristi identifikator sjednice ne bi trebao biti opisan niti otkrivati nepotrebne pojedinosti o svrsi i značenju identifikatora. Imena identifikatora sjednica koja koriste najčešći alati za razvoj web aplikacija mogu se lako prepoznati, primjerice PHPSESSID (PHP), JSESSIONID (J2EE), CFID & CFTOKEN (ColdFusion), ASP.NET_SessionId (ASP. NET) itd.. Prema tome imena identifikatora mogu otkriti tehnologije i programske jezike koje koriste web aplikacije. Preporuča se promijeniti zadani naziv identifikatora sjednice u neko generičko ime kao što je "ID". - Duljina identifikatora sjednice Identifikator sjednice mora biti dovoljno dug kako bi se spriječilo „brute force“ napade, gdje napadač može proći kroz cijeli niz mogućih vrijednosti i provjeriti postojanje važećih sjednica s tim identifikatorom. Duljina identifikatora sjednice mora biti najmanje 128 bita (16 bajtova). - Entropija identifikatora sjednice Identifikator sjednice mora biti nepredvidljiv (dovoljno slučajan) kako bi se spriječilo napade nagađanja, gdje je napadač u stanju pogoditi ili predvidjeti identifikator valjane sjednice kroz tehniku statističke analize. U tu svrhu mora se koristiti dobar pseudo generator slučajnih brojeva. Vrijednost identifikatora sjednice mora osigurati najmanje 64 bita entropije (ako se koristi dobar pseudo generator slučajnih brojeva, ova vrijednost se procjenjuje na pola duljine identifikatora sjednice). Napomena: na entropiju identifikatora sjednice uvelike utječu vanjski i teško mjerljivi faktori, kao što je uobičajen broj istodobnih aktivnih sjednica web aplikacije, apsolutno vrijeme isteka sjednice, broj nagađanja identifikatora sjednice koje napadač može napraviti a ciljana web aplikacija podržati, itd. Ako se koristi identifikator sjednice sa 64 bita, napadaču će trebati barem 292 godine da uspješno pogodi valjani identifikator sjednice, pod pretpostavkom da napadač može pokušati 10.000 puta u sekundi sa 100.000 valjanih istovremenih sjednica dostupnih u web aplikaciji. - Sadržaj (ili vrijednost) identifikatora sjednice Sadržaj (ili vrijednost) identifikatora sjednice mora biti besmislen kako bi spriječio napade za otkrivanje informacija, gdje je napadač u mogućnosti dekodirati sadržaj identifikatora i razotkriti podatke o korisniku, sjednici ili unutarnjem ustroju web aplikacije. Na strani klijenta identifikator sjednice jednostavno mora biti identifikator, a njegova vrijednost nikada ne smije sadržavati osjetljive podatke. Značenje i uloga povezana s identifikatorom sjednice mora biti pohranjena na strani poslužitelja, u sjedničnim objektima ili u bazi podataka za upravljanje sjednicom. Pohranjeni podaci mogu uključivati IP adresu klijenta, e-mail, korisničko ime, korisnički ID, ulogu, razinu privilegija, prava pristupa, jezične postavke, ID računa, trenutno stanje, posljednju prijavu, istek vremena sjednice i druge detalje. Ako sjednični objekt i svojstva sadrže osjetljive informacije kao što su brojevi kreditnih kartica, potrebno je propisno šifrirati i zaštititi repozitorij upravljanja sjednicom. Preporučljivo je stvoriti kriptografski jaki identifikator sjednice korištenjem kriptografskih hash funkcija kao što je SHA1 (160 bita). [6] 4.2.2. Implementacija upravljanja sjednicama Implementacija upravljanja sjednicama definira mehanizam razmjene koji će se koristiti za dijeljenje i kontinuirano razmjenjivanje identifikatora sjednice između korisnika i web aplikacije. Postoje brojni mehanizmi dostupni u HTTP za održavanje stanja sjednice unutar web aplikacije, kao što su cookieji (standardno HTTP zaglavlje), URL parametri, URL argumenti za zahtjeve GET, argumenti tijela na zahtjeve POST, kao što su skrivene HTML forme ili obavezna HTTP zaglavlja. Korišteni mehanizam razmjene identifikatora sjednice bi trebao omogućiti definiranje naprednih svojstava tokena, kao što je istek datuma i vremena tokena ili korištenje ograničenja. To je jedan od razloga zašto su cookieji (RFC 2109 i 2965 i 6265) jedan od najčešće korištenih mehanizama razmjene identifikatora sjednice. Oni nude napredne mogućnosti koje nisu dostupne u drugim metodama. Korištenje nekih mehanizama razmjene identifikatora sjednice, kao što su oni u kojima je identifikator uključen u URL, može otkriti identifikator sjednice (u web linkovima i logovima, povijesti web preglednika i zabilježbama, zaglavljima ili tražilicama), kao i olakšati druge napade kao što su manipulacije identifikatorom ili napadi fiksiranja sjednica. - Ugrađene implementacije upravljanja sjednicama Alati za razvoj web sučelja kao što su J2EE, ASP. NET, PHP nude svoje vlastite implementacije za upravljanje sjednicama. Preporuča se koristiti ova ugrađena sučelja (više nego ona samostalno napravljena) budući da se ona koriste u cijelom svijetu na više web okruženja, te je njihova sigurnost istestirana tijekom vremena od strane brojnih stručnjaka za razvoj i sigurnost. Međutim, treba imati na umu da su i na tim sučeljima također pronađene ranjivosti i slabosti u prošlosti, te se stoga uvijek preporuča korištenje najnovije dostupne verzije koja potencijalno popravlja sve poznate ranjivosti, kao i pregledavanje i promjena početne konfiguracije kako bi se poboljšala njena sigurnost. Baza podataka ili repozitorij za upravljanje sjednicom koji se koristi za privremenu pohranu identifikatora sjednice mora biti siguran, štititi identifikator od slučajnog odavanja bilo lokalno bilo na daljinu ili od neovlaštenog pristupa. - Prihvaćeni i korišteni mehanizmi razmjene identifikatora sjednice Neka web aplikacija može koristiti određeni mehanizam razmjene ID-a sjednice po defaultu, kao što su primjerice cookieji. Međutim, ako korisnik pošalje identifikator sjednice kroz drugi mehanizam razmjene, kao što je primjerice URL parametar, web aplikacija ga možda prihvati. Web aplikacija može koristiti oba mehanizma, cookieje i URL parametre, ili čak prebacivati s jednog na drugi (automatsko URL prepisivanje) ako su ispunjeni određeni uvjeti (na primjer postojanje web klijenata bez potpore cookiejima ili kada cookieji nisu prihvatljivi zbog privatnih postavki korisnika). Iz tog razloga, bitno je razlikovati mehanizme koje koriste web aplikacije inicijalno za razmjenu identifikatora sjednica i mehanizme koje prihvati web aplikacija za obradu i upravljanje identifikatorima sjednica. Web aplikacije moraju ograničiti prihvaćene mehanizme za praćenje sjednice samo na one odabrane i korištene pri dizajnu. - Sigurnost transportnog sloja Radi zaštite razmjene identifikatora sjednice od aktivnog prisluškivanja i pasivnog odavanja mrežnog prometa, obavezno je koristiti enkriptiranu HTTPS (SSL/TLS) vezu za cijelo vrijeme trajanja web sjednice, a ne samo pri autentifikacijskom procesu gdje se razmjenjuju povjerljivi korisnički podaci. Osim toga mora se koristiti opcija „siguran“ cookie kako bi se osiguralo da se ID sjednice razmjenjuje samo kriptiranim kanalom. Korištenje kriptiranog komunikacijskog kanala također štiti sjednicu protiv nekih napada fiksiranja sjednice gdje je napadač u stanju presresti web promet i manipulirati njime kako bi uveo (ili popravio) ID sjednice žrtve na web pregledniku. Sljedeći skup savjeta najbolje prakse vezani uz HTTPS (SSL/TLS) usmjereni su na zaštitu identifikatora sjednice (posebno kada se koriste cookieji) te pomažu kod integracije HTTPS-a unutar web aplikacije: Web aplikacije nikada ne bi trebale prebaciti sjednicu iz HTTP u HTTPS ili obrnuto, jer će se tada identifikator sjednice objaviti u čistom obliku na mreži. Web aplikacije ne bi trebale miješati kriptirani i nekriptirani sadržaj (HTML stranice, slike, CSS, Javascript datoteke itd.) na istom hostu (ili čak i domeni), jer bi zahtjev za bilo kojim web objektom preko nekriptiranog kanala mogao otkriti identifikator sjednice. Web aplikacije općenito ne bi trebale davati javne nekriptirane sadržaje i one privatne kriptirane s istog hosta. Preporuča se umjesto toga koristiti dva različita hosta kao što je primjerice www.example.com preko HTTP-a za javne sadržaje i secure.example.com preko HTTPS-a (kriptiran) za privatne i osjetljive sadržaja (gdje postoje sjednice). Prvi host ima otvoren samo port TCP/80, a drugi samo port TCP/443. Web aplikacije bi trebale izbjegavati iznimno česta preusmjeravanja s HTTP-a na HTTPS na početnoj stranici, jer tada napadač može iskoristiti samo jednu nezaštićenu razmjenu HTTP zahtjev/odgovor da bi otkrio (ili popravio) valjani identifikator sjednice. Web aplikacije bi trebale koristiti „HTTP Strict Transport Security (HSTS)“ za primjenu HTTPS veze. Važno je naglasiti da SSL/TLS (HTTPS) ne štiti od predviđanja identifikatora sjednice, napada grubom silom, napada na strani klijenta ili fiksacija. Ipak, otkrivanje identifikatora sjednice iz mrežnog prometa je još uvijek jedan od najčešćih napada. [6] 4.2.3. Životni ciklus identifikatora sjednice 4.2.3.1. Generiranje i verifikacija identifikatora sjednice Postoje dvije vrste mehanizama za upravljanje sjednicama web aplikacija s obzirom na ranjivosti fiksiranja sjednice, popustljivi i strogi. Popustljivi mehanizmi dopuštaju web aplikacijama da u početku prihvate bilo koju vrijednost identifikatora sjednice postavljenu od strane korisnika kao valjanu, stvarajući za njega novu sjednicu. S druge strane strogi mehanizam dozvoljava samo da web aplikacija prihvati vrijednosti identifikatora sjednice koju je prethodno generirala web aplikacija. Najčešći mehanizam koji se danas koristi je onaj strogi (sigurniji je). Pri razvoju web aplikacija mora se osigurati da se pod raznim okolnostima ne koriste popustljivi mehanizmi. Web aplikacija nikada ne bi trebala prihvatiti identifikator sjednice koji ona nikada nije generirala, a u slučaju zaprimanja takvog identifikatora trebala bi generirati i ponuditi korisniku novi valjani identifikator sjednice. Ovaj scenarij bi svakako trebalo prepoznati kao sumnjivu aktivnost te izdati upozorenje. 4.2.3.2. Upravljanje identifikatorom sjednice Identifikator sjednice mora se smatrati nepouzdanim, kao i svaki drugi korisnički unos kojeg web aplikacija obrađuje, te se mora temeljito provjeriti i potvrditi. Ovisno o korištenom mehanizmu upravljanja sjednicom, identifikator sjednice će biti primljen u GET ili POST parametru, u URL ili HTTP zaglavlju (npr. cookie). Ako web aplikacija ne provjeri i filtrira nevažeće vrijednosti identifikatora sjednice prije nego ih obradi, one se mogu iskoristiti za iskorištavanje drugih web ranjivosti, kao što je SQL umetanje ako su identifikatori sjednice pohranjeni na relacijskoj bazi podataka ili trajni XSS ako web aplikacija identifikatore sjednice pohrani i takve pošalje natrag. 4.2.3.3. Obnavljanje identifikatora sjednice nakon bilo koje promjene razine privilegija Web aplikacija mora obnoviti ili ponovno kreirati identifikator sjednice nakon svake promjene razine privilegija pridružene korisniku sjednice. Najčešći scenarij u kojem je obvezno obnavljanje identifikatora sjednice je tijekom procesa autentifikacije, budući da se tada razina privilegija korisnika mijenja iz neprovjerenog (ili anonimnog) stanja u autentificirano (provjereno) stanje. Druge česte scenarije također treba uzeti u obzir, kao što je promjena lozinke, promjena dozvola ili prebacivanje iz redovne korisničke uloge u ulogu administratora unutar web aplikacije. Zbog svih tih kritičnih stranica web aplikacije, prethodni identifikatori sjednice moraju biti zanemareni, a svakom novom zahtjevu za kritičan resurs mora biti dodijeljen novi identifikator sjednice, a stari identifikator sjednice mora biti uništen. Najčešći alati za razvoj web aplikacija pružaju funkcije sjednice i metode za obnavljanje identifikatora sjednice kao što su „request.getSession (true) & HttpSession.invalidate ()“ (J2EE), „Session.Abandon () & Response.Cookies.Add (new...)“ (ASP. NET) ili „session_start() & session_regenerate_id(true)“ (PHP). Obnavljanje identifikatora sjednice je obavezno kako bi se spriječili napadi fiksiranja sjednice, gdje napadač postavlja identifikator sjednice na korisničkom web pregledniku žrtve umjesto skupljanja identifikatora sjednice žrtve kao u većini drugih napada temeljenih na sjednicama, neovisno o tome koristi li se HTTP ili HTTPS. Ova zaštita ublažava utjecaj drugih ranjivosti web-a koje se također mogu koristiti za pokretanje napada fiksiranja sjednice, poput HTTP cijepanja odgovora ili XSS napada. Uz ovo se preporuča i korištenje različitog identifikatora sjednice ili imena tokena (ili niz identifikatora sjednice) prije i poslije autentifikacije, tako da web aplikacija može pratiti anonimne korisnike i one autentificirane bez rizika od izlaganja ili povezivanja korisničke sjednice između ta dva stanja. 4.2.3.4. Upotreba višestrukih cookieja Ako web aplikacija koristi cookieje kao mehanizam razmjene identifikatora sjednice, a za pojedinu sjednicu su postavljeni višestuki cookieji, web aplikacija mora provjeriti sve cookieje (i kontrolirati odnose između njih) prije nego dopusti pristup korisničkoj sjednici. Uobičajeno je za web aplikaciju postaviti korisnički cookie prije provjere autentičnosti preko HTTP-a radi praćenja neprovjerenih (anonimnih) korisnika. Nakon što se korisnik autentificira u web aplikaciji, novi post-autentifikacijski cookie se postavlja preko HTTPS-a, a uspostavlja se poveznica između tih cookieja. Ako web aplikacija ne potvrdi oba cookieja za autentificiranu sjednicu, napadač može iskoristiti nezaštićeni cookie prije autentifikacije kako bi dobio pristup autentificiranoj korisničkoj sjednici. Web aplikacije trebaju pokušati izbjeći isti naziv cookieja za različite puteve ili domene unutar iste web aplikacije, jer se time povećava složenost rješenja i potencijalno uvodi pitanje djelokruga. 4.2.4. Istek sjednice Kako bi se smanjilo vremensko razdoblje u kojem napadač može pokrenuti napad na aktivne sjednice i oteti ih, obavezno je postaviti vremenski period u kojem će sjednica biti aktivna. Nedovoljno malo vrijeme isteka sjednice će povećati izloženost web aplikacije drugim napadima temeljenima na sjednicama, budući da sjednica da bi napadač mogao iskoristiti valjani identifikator sjednice i preoteti sjednicu, mora još uvijek biti aktivna. Što je vremenski period aktivnosti sjednice kraći, to napadač manje vremena ima za iskoristiti valjani identifikator sjednice. Vrijeme isteka sjednice mora biti postavljeno u skladu sa svrhom i prirodom web aplikacije, te dati ravnotežu između sigurnosti i upotrebljivosti, tako da korisnik stigne komotno završiti operacije unutar web aplikacije bez čestih isteka njegovih sjednica. I vremenski period mirovanja i apsolutno vrijeme isteka sjednice su vrijednosti koje su vrlo ovisne o kritičnosti web aplikacije i podataka koje ona koristi. Uobičajeno vrijeme mirovanja kreće se u rasponu od 2 do 5 minuta za aplikacije visoke vrijednosti i 15-30 minuta za aplikacije niskog rizika primjene. Kad sjednica istekne, web aplikacija mora poduzeti aktivne mjere poništavanja sjednice na objema stranama, klijentskoj i poslužiteljskoj. Najvažnije je poništiti sjednicu na strani poslužitelja što je obavezno iz sigurnosnih razloga. Za većinu mehanizama razmjene sjednice, aktivnosti na strani klijenta za poništenje identifikatora sjednice se temelje na poništavanju vrijednosti tokena. Na primjer, za poništavanje cookieja je preporučljivo dati prazan (ili nevažeću vrijednost) identifikator sjednice, te postaviti atribut „Expires“ (ili „Max-Age“) na datum iz prošlosti (kada se koristi trajni cookie): Set-Cookie: id=; Expires=Friday, 17-May-03 18:45:00 GMT Kako bi se zatvorila i poništila sjednica na strani poslužitelja, web aplikacija je obavezna poduzeti aktivne mjere pri isteku sjednice ili odjavi aktivnog korisnika, pomoću funkcija i metoda koje nude mehanizami upravljanja sjednicom, kao "HttpSession.invalidate ()" (J2EE), "Session.Abandon ()" (ASP.NET) ili "session_destroy()/unset()" (PHP). 4.2.4.1. Automatski istek sjednice Za sve sjednice treba definirati vrijeme isteka mirovanja ili neaktivnosti. To vrijeme definira vremenski period u kojem će sjednica ostati aktivna u slučaju da ne postoji aktivnost na sjednici. Ako je toliko vremena prošlo od posljednjeg HTTP zahtjeva kojeg je web aplikacija primila za određeni identifikator sjednice, sjednica se zatvara i poništava. Vrijeme isteka mirovanja ograničava mogućnosti napadača pri pogađanju i iskorištavanju valjanog identifikatora sjednice drugog korisnika. Međutim, ako je napadač u stanju oteti određenu sjednicu, vrijeme isteka mirovanja ne ograničava aktivnosti napadača, budući da on tada može periodički generirati aktivnost na sjednici te držati sjednicu aktivnom dugi vremenski period. Upravljanje vremenima isteka sjednice mora se provoditi na strani poslužitelja. Ako bi klijent određivao vrijeme isteka sjednice, primjerice pomoću tokena sjednice ili drugih klijentskih parametara za praćenje vremenskih referenci (npr. broj minuta od vremena prijave), napadač bi mogao manipulirati tim vremenima radi produženja trajanja sjednice. Za sve sjednice treba definirati apsolutno vrijeme isteka koje je neovisno o aktivnosti sjednice. Ovo vrijeme isteka definira maksimalan vremenski period u kojem sjednica može biti aktivna. Nakon što istekne tako definirani vremenski period od trenutka kada je web aplikacija stvorila sjednicu, sjednica se zatvara i poništava. Nakon ukidanja sjednice, korisnik je prisiljen ponovno se autentificirati u web aplikaciji te uspostaviti novu sjednicu. Apsolutno vrijeme isteka sjednice ograničava količinu vremena u kojem napadač može iskoristiti ukradenu sjednicu i utjeloviti korisnika žrtvu. 4.2.4.2. Ručni istek sjednice Web aplikacija treba osigurati mehanizme koji omogućuju korisnicima svjesnima sigurnosti aktivno zatvaranje njihove sjednice nakon što su završili s korištenjem web aplikacije. Web aplikacije moraju osigurati vidljivu lako dostupnu tipku za odjavu koja je dostupna na zaglavlju web aplikacije ili njenom izborniku, te je dohvatljiva iz svake stranice web aplikacije tako da korisnik može u bilo kojem trenutku ručno zatvoriti sjednicu. 4.2.5. Dodatne zaštite za upravljanje sjednicom na klijentskoj strani Web aplikacije mogu nadopuniti prethodno opisane zaštitne mjere upravljanja sjednicom s dodatnim protumjerama na klijentskoj strani. Zaštitne mjere na klijentskoj strani, obično u obliku JavaScript provjera, nisu neprobojne i stručni napadač ih može lako probiti, ali mogu biti uvod u drugi sloj obrane kojeg uljezi moraju zaobići. 4.2.5.1. Vrijeme isteka prijave Web aplikacije mogu koristiti JavaScript kôd za stranicu prijave kako bi procjenile i izmjerile vrijeme od učitavanja stranice i odobravanja identifikatora sjednice. Ako se pokušala prijava nakon definiranog vremenskog perioda, klijentski kôd može obavijestiti korisnika da je prošao maksimalni vremenski period za prijavu te ponovno učitati stranicu za prijavu, čime će korisnik dobiti novi identifikator sjednice. Ovaj dodatni mehanizam zaštite pokušava prisiliti obnavljanje identifikatora sjednice prije autentifikacije, te izbjegavanje scenarija gdje se ranije korišteni (ili ručno postavljeni) identifikator sjednice ponovno koristi kada sljedeća žrtva koristi isto računalo, primjerice prilikom napada fiksiranja sjednice. 4.2.5.2. Tjeranje na odjavu sjednice prilikom zatvaranja prozora web preglednika Web aplikacije mogu koristiti JavaScript kôd kako bi uhvatile svako zatvaranje kartice ili prozora web preglednika (ili čak i vraćanje na prethodnu stranicu) te poduzele odgovarajuće mjere kako bi zatvorile trenutnu sjednicu prije zatvaranja web preglednika, kao da je korisnik ručno zatvorio sjednicu pomoću tipke za odjavu. 4.2.5.3. Onemogućavanje sjednica između kartica Web aplikacije mogu koristiti JavaScript kôd nakon što je korisnik prijavljen a sjednica uspostavljena kako bi se prisililo korisnika na ponovnu autentifikaciju ako se otvara nova kartica ili prozor web preglednika a odnosi se na istu web aplikaciju. Web aplikacija ne želi dopustiti više kartica ili prozora web preglednika koji dijele istu sjednicu. Stoga, aplikacija pokušava prisiliti web preglednik da ne dijeli isti identifikator sjednice istovremeno između njih. 4.2.5.4. Automatska odjava klijenta Web aplikacija može koristiti JavaScript kôd u svim (ili samo kritičnim) stranicama za automatsku odjavu klijenta sjednice nakon isteka vremena mirovanja, primjerice preusmjeravanjem korisnika na stranicu odjave (kao da je korištena tipka za odjavu). Korist jačanja funkcionalnosti vremena isteka mirovanja na serverskoj strani sa onom na strani klijenta je da korisnik može vidjeti da je sjednica završila zbog neaktivnosti ili čak može biti unaprijed obaviješten da sjednica uskoro ističe kroz odbrojavanje i poruke upozorenja. Ovakav pristup pomaže pri izbjegavanju gubitka obavljenog posla u web stranicama koje zahtijevaju opsežne unose ulaznih podataka nasuprot tihom isteku sjednice sa strane poslužitelja. 4.2.6. Otkrivanje napada na sjednicu 4.2.6.1. Pogađanje identifikatora sjednice i „brute force“ napad Ako napadač pokušava pogoditi ili grubom silom otkriti valjani identifikator sjednice, on treba pokrenuti više uzastopnih zahtjeva prema ciljnoj web aplikaciji pomoću različitih identifikatora sjednice iz jednog (ili skupa) IP adresa. Osim toga, ako napadač pokuša analizirati predvidljivost identifikatora sjednice (npr. koristeći statističku analizu), on također treba pokrenuti više uzastopnih zahtjeva iz jednog (ili skupa) IP adresa prema ciljanoj web aplikaciji radi prikupljanja novih valjanih identifikatora sjednice. Web aplikacije moraju biti u mogućnosti otkriti oba navedena scenarija na temelju broja pokušaja prikupljanja (ili korištenja) različitih identifikatora sjednice i upozorti i/ili blokirati napadačeve IP adrese. 4.2.6.2. Otkrivanje anomalija identifikatora sjednice Web aplikacije trebaju obratiti pažnju na otkrivanje anomalija povezanih s identifikatorom sjednice, kao što su manipulacije njime. OWASP AppSensor Project daje okvir i metodologiju za korištenje ugrađenih sposobnosti za otkrivanje upada u web aplikacije koje su usmjerene na otkrivanje anomalija i neočekivanih ponašanja u obliku točaka otkrivanja i rezultantnih odgovora. Umjesto korištenja vanjskih slojeva zaštite, ponekad su detalji poslovne logike i napredna inteligencija dostupni samo iz unutrašnjosti web aplikacije, gdje je moguće uspostaviti više točaka detekcije vezanih za sjednicu (primjerice prilikom mijenjanja ili brisanja postojećeg cookieja, te dodavanja novog cookieja, identifikator sjednice drugog korisnika se ponovno koristi ili kada se lokacija korisnika promijeni usred sjednice). 4.2.6.3. Povezivanje identifikatora sjednice s drugim postavkama korisnika S ciljem otkrivanja anomalija u ponašanju korisnika i otmica sjednice, preporuča se vezati identifikator sjednice za neke druge korisničke postavke, kao što su IP adresa klijenta ili klijentski digitalni certifikat. Ako web aplikacija otkrije bilo kakvu promjenu ili anomaliju među tim svojstvima usred uspostavljene sjednice, što je vrlo dobar pokazatelj manipulacija sjednicom i pokušaja otmice, ta se jednostavna činjenica može iskoristiti za upozorenje i/ili prekid sumnjive sjednice. Iako web aplikacija ta svojstva ne može iskoristiti za učinkovitu obranu protiv napada na sjednicu, ona će znatno povećati sposobnosti aplikacije za njihovo otkrivanje. Vješti napadač može zaobići ove kontrole tako da koristi istu IP adresu koja je dodijeljena žrtvi dijeleći istu mrežu (vrlo često u NAT okruženjima, kao što su mjesta s javnim Wi-Fi-jem), koristeći isti izlazni web proxy (što je vrlo često u korporativnim okruženjima) ili mijenjanjem svog korisničkog agenta da izgleda točno kao žrtva. 4.2.6.4. Praćenje životnog ciklusa sjednice Web aplikacija bi trebala povećati svoje sposobnosti praćenja uključujući u zapisnike informacije vezane za cijeli životni ciklus sjednice. Ovo se preporuča za snimanje događaja povezanih sa sjednicama poput stvaranja, obnove i uništavanja identifikatora sjednica, kao i detalje oko njihovog korištenja između operacija prijave i odjave, promjena razine privilegija unutar sjednice, vremena isteka, nedozvoljenih djelatnosti sjednice (kada se otkriju) te kritičnih poslovnih operacija tijekom sjednice. Zapisani detalji mogu uključivati vremenski žig, izvornu IP adresu, tražene resurse (koji su uključeni u rad sjednice), HTTP zaglavlja, GET i POST parametre, identifikatore i poruke o pogreškama, korisničko ime (ili korisnički ID), identifikator sjednice (cookieje, URL, GET, POST...). Osjetljivi podaci poput identifikatora sjednice ne bi trebali biti uključeni u zapisnicima kako bi se sjednični zapisnici zaštitili od lokalnog ili udaljenog otkrivanja identifikatora sjednice ili neovlaštenog pristupa identifikatoru. Međutim, neke informacije specifične za pojedinu sjednicu moraju biti uključene u zapisnik radi korelacije zapisnika sa pripadnim sjednicama. Preporučuje se zapisati hash identifikatora sjednice umjesto samog identifikatora kako bi se omogućila korelacija sjednice i pripadnog zapisa bez izlaganja identifikatora sjednice. Web aplikacije moraju temeljito zaštititi administrativna sučelja koja imaju mogućnost upravljati svim trenutno aktivnim sjednicama. Ta sučelja često koriste osobe zadužene za davanje podrške pri rješavanju problema sa sjednicama ili čak općih problema, pritom se lažno predstavljajući kao korisnik i gledajući na web aplikaciju iz korisnikove perspektive. Zapisnici o sjednici postali su jedan od glavnih izvora za otkrivanje upada u web aplikacije, a također ih mogu koristiti sustavi zaštite od upada za automatsko prekidanje sjednice i/ili onemogućavanje korisničkih računa kada su napadi otkriveni. Ako se koriste aktivne mjere zaštite, te obrambene akcije također moraju biti zabilježene. 4.2.6.5. Istovremene prijave sjednica Na dizajnu web aplikacije ostaje odluka hoće li višestruke istovremene prijave istog korisnika biti dozvoljene s iste ili različitih IP adresa klijenta. Ako web aplikacija ne želi dopustiti istovremene prijave sjednica, ona mora poduzeti djelotvorne mjere nakon svakog novog događaja autentifikacije, implicitno prekidajući ranije dostupnu sjednicu ili pitajući korisnika (preko stare, nove ili obje sjednice) o tome koja sjednica treba ostati aktivna. Preporuča se za web aplikacije dodati korisničke mogućnosti provjere podataka o aktivnim sjednicama u bilo koje vrijeme, praćenje i upozoravanje korisnika o istovremenim prijavama, pružanje korisniku mogućnosti ručnog prekidanja sjednice na daljinu, te praćenje aktivnosti korisničkog računa kroz dnevnik zapisivanjem višestrukih detalja o klijentu, kao što su IP adrese, datumi i vremena prijave, vrijeme mirovanja itd. [6] 5. Nesigurne reference na objekte Izravna referenca na objekt nastaje kada programer izloži referencu objektu unutarnje implementacije kao što je datoteka, direktorij, zapis u bazi podataka ili ključ. Napadač može manipulirati izravnim referencama na objekte kako bi pristupio drugim objektima bez odobrenja osim kada je implementirana provjera kontrole pristupa na odgovarajućem mjestu. Primjerice, u aplikacijama za internet bankarstvo uobičajeno je koristiti broj računa kao primarni ključ. Iz tog je razloga primamljivo koristiti broj računa izravno na web sučelju. Čak i ako su programeri koristili parametrizirane SQL upite kako bi se spriječilo SQL umetanje, ako ne postoji dodatna provjera da je trenutni korisnik stvarni vlasnik računa i da je ovlašten za promatranje tog računa, napadač koji manipulira parametrom s brojem računa može vidjeti ili promijeniti sve račune. Ova vrsta napada dogodila se 2000. godine na stranici austalskog poreznog ureda kada je legitiman ali zlonamjeran korisnik jednostavno promijenio porezni broj tvrtke prisutan u URL-u. Korisnik je došao do detaljnih podataka o 17 000 tvrtki u sustavu. Ova vrsta ranjivosti je vrlo česta, ali je uglavnom slabo istestirana u trenutnim aplikacijama. Mnoge aplikacije izlažu korisnicima svoje unutarnje reference na objekte. Napadači koriste te parametre kako bi promijenili reference te prekršili predviđenu politiku kontrole pristupa. Često su te reference povezane sa datotekama i bazama podataka, pa bilo kakvo izlaganje aplikacije može pokazati ranjivost. Na primjer, ako kôd omogućuje korisniku unos imena datoteka ili path-ova, to može omogućiti napadačima prelazak iz direktorija aplikacije te tako dobivanje pristupa drugim resursima. <select name="language"><option value="fr">Français</option></select> … require_once ($_REQUEST['language’]."lang.php"); Takav kôd može biti napadnut pomoću stringa ".. /.. /.. /.. /etc/passwd% 00" pomoću umetanja praznog bajta za pristup bilo kojoj datoteci web-poslužitelja. Isto tako su često izložene reference na ključeve baza. Napadač može napasti te parametre jednostavnim nagađanjem ili potragom za drugim valjanim ključem. Često su ključevi u svojoj prirodi sekvencijalni. U niže navedenom primjeru, čak i ako aplikacija ne dozvoli pristup neovlaštenim sadržajima, a nije ni moguće SQL umetanje, napadač još uvijek može promijeniti parametar cartID u koji god želi. [7] int cartID = Integer.parseInt( request.getParameter( "cartID" ) ); String query = "SELECT * FROM table WHERE cartID=" + cartID; 5.1. Primjer ranjivosti Aplikacija koristi neprovjerene podatke u SQL pozivu kojim se pristupa računu: String query = "SELECT * FROM accts WHERE account = ?"; PreparedStatement pstmt = connection.prepareStatement(query , ... ); pstmt.setString( 1, request.getParameter("acct")); ResultSet results = pstmt.executeQuery(); Napadač jednostavno mijenja parametar 'acct' u žrtvinom pregledniku kako bi poslao koji god broj računa on želi. Ako nije provjereno, napadač može pristupiti bilo kojem korisničkom računu, umjesto samo onom kojem namjerava. [8] http://example.com/app/accountInfo?acct=notmyacct 5.2. Provjera ranjivosti na nesigurne reference na objekte Najbolji način da bi se provjerila ranjivost aplikacije na nesigurne reference na objekte je provjera da li sve reference na objekte imaju odgovarajuću zaštitu. Da bi se to provjerilo potrebno je razmotriti: - Za izravne reference na ograničene resurse, aplikacija treba potvrditi je li korisnik ovlašten za pristup upravo tom resursu koji traži. - Ako je referenca neizravna, mapiranje do izravne reference mora biti ograničeno na vrijednosti za koje trenutni korisnik ima ovlasti. [8] Cilj je provjeriti da aplikacija ne dopušta napadaču manipulaciju izravnim referencama na objekte - Automatizirani pristupi: alati za traženje ranjivosti će imati poteškoća pri utvrđivanju koji su parametri osjetljivi na manipulacije te je li manipulacija uspjela. Statički alati za analizu nikako ne mogu znati za koje se parametre mora napraviti provjera kontrole pristupa prije njihove upotrebe. - Ručni pristupi: Provjerom kôda mogu se pratiti kritični parametri te utvrditi jesu li oni podložni manipulacijama u mnogim slučajevima. Penetracijska testiranja mogu potvrditi da je manipulacija moguća. Međutim obje navedene tehnike zahtjevaju mnogo vremena i nisu dosljedne. [7] 5.3. Zaštita od nesigurnih referenci na objekte Radi sprječavanja nesigurnih referenci na objekte zahtijeva se odabir pristupa za zaštitu svakog objekta dostupnog korisniku (npr. broj objekta, ime datoteke): - Korištenje indirektnih referenci na objekte za pojedinog korisnika ili sjednicu. Tako će napadač biti sprječen u izravnom napadu na neovlaštene resurse. Na primjer, umjesto korištenja ključa baze podataka koristi se padajuća lista od šest stavki koje su autorizirane za trenutnog korisnika koja može koristiti brojeve od 1 do 6 kojima se označava vrijednost koju je korisnik odabrao. Aplikacija mora povezati neizravnu korisničku referencu natrag do stvarnog ključa baze podataka na poslužitelju. ESAPI uključuje i slijedni i slučajni pristup referentnoj mapi koju programeri mogu koristiti kako bi uklonili izravne reference na objekte. - Pristup s provjerama - Svaka upotreba izravne reference na objekt iz nepouzdanog izvora mora uključivati provjeru kontrole pristupa kako bi se osigurala autorizacija korisnika za pristup željenom objektu. [8] Najbolja zaštita je izbjegavanje izlaganja izravnih referenci na objekte korisnicima pomoću indeksa, neizravne mape referenci ili drugog neizravnog načina koji je lako provjeriti. Ako se mora koristiti izravna referenca na objekt, potrebno je provjeriti da je korisnik ovlašten prije njezine upotrebe. [7] Važno je uspostaviti standardni način korištenja objekata: - Kad god je moguće izbjegavati izlaganje privatnih referenci na objekte kao što su primarni ključevi ili nazivi datoteka korisnicima - Detaljno provjeriti sve privatne reference na objekte u skladu s pristupom „prihvati dobro poznato“ - Provjeriti autorizaciju za sve korištene objekte Najbolje rješenje je korištenje indeksa ili mape referenci kako bi spriječili napade manipuliranja parametrima. Primjerice: http://www.example.com/application?file=1 Ako se moraju izložiti izravne reference na strukture baze podataka, potrebno je osigurati da SQL izjave i druge metode pristupa bazama podataka dopuštaju prikaz samo ovlaštenih zapisa: int cartID = Integer.parseInt( request.getParameter( "cartID" ) ); User user = (User)request.getSession().getAttribute( "user" ); String query = "SELECT * FROM table WHERE cartID=" + cartID + " AND userID=" + user.getID(); 6. Krivotvorenje zahtjeva na drugom sjedištu Krivotvorenje zahtjeva na drugom sjedištu (eng. Cross Site Request Forgery, CSRF) je napad u kojem se krajnji korisnik namami na izvršavanje neželjene radnje na ranjivoj web aplikaciji za koju je dobio ovlaštenje. Pomoću socijalnog inženjeringa (kao što je slanje linka putem elektroničke pošte ili chata), napadač može navesti korisnika web aplikacije na izvršavanje akcije koju je napadač odabrao. Uspješan CSRF napad može ugroziti podatke i radnje krajnjih korisnika kada se radi o standardnom korisniku. Ako je ciljani krajnji korisnički račun administratorski, napad može ugroziti cijelu webaplikaciju. CSRF je napad u kojem se žrtva prijevarom navodi na učitavanje stranice koja sadrži zlonamjerni zahtjev. Zahtjev je zlonamjeran u smislu da nasljeđuje identitet i privilegije žrtve radi izvođenja neželjene funkcije u ime žrtve, kao što je primjerice promjena e-mail adrese žrtve, njene kućne adrese ili lozinke, kupnje nečega itd. CSRF napad uglavnom cilja na funkcije koje uzrokuju promjenu stanja na poslužitelju, ali se također može koristiti za pristupanje osjetljivim podacima. Na većini internet stranica, preglednici automatski uključuju u zahtjeve neke povjerljive podatke, kao što su korisnikov sjednični kolačić, osnovni podaci za autorizaciju, IP adresa, autentifikacija na Windows domenu itd. Prema tome, ako je korisnik u tom trenutku autenticiran za tu stranicu, stranica neće nikako moći razlikovati napadačev od legitimnog zahtjeva korisnika. Na taj način napadač može natjerati žrtvu na obavljanje radnji koje nije namjeravala (kao što je odjava, kupovina artikala, promjena podataka o računu, dohvat podataka o računu ili bilo koja druga funkcija koja je omogućena na toj ranjivoj web stranici). Ponekad je moguće pohraniti CSRF napad na samu ranjivu stranicu. Takva ranjivost se zove pohranjeni CSRF nedostatak. Ovo se može ostvariti jednostavnim pohranjivanjem jedne IMG ili IFRAME oznake u polju koje prihvaća HTML ili složenijim cross-site scripting napadom. Ako se napad može pohraniti na stranici, on će biti jači. Tada se vjerojatnost napada povećava, jer je veća vjerojatnost da žrtva vidi stranicu koja sadrži napad nego neku slučajnu stranicu na internetu. Vjerojatnost je također povećana, jer će žrtva sigurno do tada biti autenticirana. [9] 6.1. Primjer napada Postoje brojni načini na koje se krajnji korisnik može namamiti na očitavanje podataka iz ili njihovo slanje na web aplikaciju. Kako bi se izvršio napad, prvo treba znati generirati zlonamjerni zahtjev koji žrtva treba izvršiti. Na primjer: Ana želi prenijeti 100kn sa svog računa na Markov pomoću aplikacije bank.com. Ana generira slijedeći zahtjev: POST http://bank.com/transfer.do HTTP/1.1 ... ... ... Content-Length: 21; acct=MARKO&amount=100 Međutim Marija primjećuje da će ista web aplikacija izvršiti isti taj prijenos pomoću URL parametara kako slijedi: GET http://bank.com/transfer.do?acct=MARKO&amount=100 HTTP/1.1 Marija sada odlučuje iskoristiti ovu ranjivost koristeći Anu kao svoju žrtvu. Marija prvo konstruira sljedeći URL koji će prenijeti 100.000 kuna sa Aninog računa na njezin: http://bank.com/transfer.do?acct=MARIJA&amount=100000 Sada kada je generirala zlonamjeran zahtjev, Marija mora navesti Anu da pošalje taj zahtjev. Uobičajeni način je poslati Ani HTML e-mail koji sadrži sljedeće: <a href="http://bank.com/transfer.do?acct=MARIA&amount=100000">View my Pictures!</a> Ako će Ana biti autenticirana unutar aplikacije u trenutku kada klikne na link, doći će do prijenosa 100.000 kuna na Marijin račun. Međutim Marija shvaća da će Ana, ako klikne na link, primijetiti da je došlo do prijenosa. Stoga Marija odlučuje sakriti napad u sliku veličine nula bajtova: <img src="http://bank.com/transfer.do?acct=MARIA&amount=100000" width="1" height="1" border="0"> Ako bi ovaj zapis slike bio uključen u e-mail, Ana bi vidjela samo mali okvir koji pokazuje da preglednik nije mogao prikazati sliku. Međutim preglednik će i dalje podnijeti zahtjev prema bank.com bez vizualne naznake da se prijenos dogodio. [9] 6.2. Sprječavanje napada Pojedinačni korisnici koji koriste nemodificirane verzije najpopularnijih preglednika vrlo malo mogu učiniti kako bi se spriječilo krivotvorenje zahtjeva na drugom sjedištu. Odjava sa web aplikacija i izbjegavanje njihove opcije za pamćenje podataka za prijavu mogu ublažiti CSRF rizik. Pomaže i izbjegavanje prikaza vanjskih slika, klikanja linkova u spam pošiljkama ili nepouzdanoj elektoničkoj pošti. Proširenja preglednika poput police „RequestPolicy“ (za preglednik Mozilla Firefox) može spriječiti CSRF napade politikom automatskog odbijanja zahtjeva sa drugog sjedišta. Ta opcija međutim može značajno utjecati na normalan rad mnogih web stranica. Proširenje „CsFire“ (također za Firefox) može ublažiti utjecaj CSRF napada na normalno pregledavanje uklanjanjem autentifikacijskih podataka iz zahtjeva s drugog sjedišta. Proširenje „NoScript“ ublažava CSRF prijetnje razlikovanjem pouzdanih i nepouzdanih web stranica, te uklanjanjem suvišnih podataka iz POST zahtjeva poslanih od nepouzdanih web stranica prema pouzdanima. Web stranice imaju različite CSRF protumjere na raspolaganju: - Zahtjevati tajnu (token) specifičan za korisnika u svim zahtjevima te time i URL-u za sprječavanje CSRF napada. Napadačeva stranica neće moći dodati ispravan token u svojim zahtjevima. - Zahtjevati od klijenta slanje podataka za autentikaciju u istom HTTP zahtjevu koji se koristi za obavljanje bilo kakve operacije sa sigurnosnim implikacijama (prijenos novca itd.) - Ograničavanje trajanja sjedničnih kolačića - Osigurati da nema datoteke clientaccesspolicy.xml za dodjelu neovlaštenog pristupa Silverlight kontrolama - Osigurati da nema datoteke crossdomain.xml za dodjelu neovlaštenog pristupa flash filmovima Jednostavno i učinkovito rješenje je korištenje CSRF filtera kao što je OWASP-ov CSRFGuard. Filter presreće odgovore, detektira radi li se o HTML dokumentu te umeće token u dokumente i opcionalno umeće skripte za umetanje tokena u funkciju ajax. Filter također presreće zahtjeve kako bi provjerio je li u njima prisutan token. [10] 7. Pogrešno postavljene sigurnosne postavke Pogrešno postavljene sigurnosne postavke mogu se dogoditi na bilo kojoj razini aplikacije, uključujući platformu, web-poslužitelja, aplikacijskog poslužitelja, prilagođeni kôd... Razvojni inženjeri i mrežni administratori trebaju surađivati kako bi se osiguralo da je svaka razina ispravno konfigurirana. Automatizirani skeneri su korisni za otkrivanje nedostataka, pogrešnih postavki, načina korištenja korisničkih računa, nepotrebnih usluga itd. [11] Konfiguracije web i aplikacijskog poslužitelja igraju ključnu ulogu u sigurnosti web aplikacija. Ti poslužitelji su odgovorni za posluživanje sadržaja i pozivanje aplikacija koje stvaraju sadržaj. Osim toga, mnogi aplikacijski poslužitelji pružaju niz usluga koje web aplikacije mogu koristiti, uključujući i pohranu podataka, usluge direktorija, poruke i još mnogo toga. Neuspjeh u upravljanju pravilnom konfiguracijom servera može dovesti do raznih sigurnosnih problema. Često su osobe zadužene za web razvoj odvojene od onih koje upravljaju stranicom. Često postoji jaz između onih koji su napisali aplikaciju i onih koji su odgovorni za njeno operativno okruženje. Radi sigurnosti web aplikacija potrebno je premostiti taj problem te zahtijevati suradnju obiju strana kako bi se osigurala sigurnost aplikacije. Postoji širok raspon problema sa konfiguracijom poslužitelja koji mogu ugroziti sigurnost web aplikacije. On uključuje: - Sigurnosni propusti u softveru poslužitelja koji nisu zakrpani - Nedostatci u kôdu servera ili njegovoj konfiguraciji koji dopuštaju ispisivanje direktorija i omogućavaju s time povezane napade - Nepotrebne inicijalne ili datoteke s primjerima, uključujući skripte, aplikacije, konfiguracijske datoteke i web-stranice - Neprikladne dozvole pristupa datotekama i direktorijima - Omogućavanje pristupa nepotrebnim uslugama uključujući upravljanje sadržajem i administraciju s udaljenog mjesta - Inicijalni korisnički računi s njihovim inicijalnim lozinkama - Administrativne funkcije ili funkcije ispravljanja pogrešaka koje su omogućene ili dostupne - Pretjerano informativne poruke o pogreškama - Pogrešno konfigurirani SSL certifikati i postavke kriptiranja - Korištenje inicijalnih certifikata - Neprikladna autentifikacija s vanjskim sustavima Neki od ovih problema mogu biti otkriveni pomoću lako dostupnih sigurnosnih skenera. Nakon što su otkriveni, ovi problemi mogu lako biti iskorišteni i rezultirati kompromitiranjem čitave web stranice. Uspješni napadi također mogu ugroziti i krajnji sustav, uključujući baze podataka i korporativne mreže. Oboje, siguran kôd i sigurna konfiguracija, su potrebni kako bi se napravila sigurna web aplikacija. Ako web i aplikacijski server nisu zaključani, aplikacija je najvjerojatnije ranjiva. Malo je servera, ako uopće postoje, koji su inicijalni sigurni. Sigurna konfiguracija platforme mora biti dokumentirana i redovito ažurirana. Redovito se treba raditi pregled dokumentacije o konfiguraciji kako bi se osiguralo da je aktualna i ažurirana. Također se preporuča usporedba sa stvarnim sustavom. Osim toga, postoji niz proizvoda za skeniranje sustava koji će izvana skenirati web ili aplikacijski poslužitelj na poznate ranjivosti. Te bi alate trebalo redovito koristiti. Preporuča se koristiti ih barem jednom mjesečno, kako bi se problemi pronašli što je prije moguće. Alate bi trebalo pokrenuti i iznutra i izvana. Vanjsko skeniranje se pokreće na hostu koji je lociran izvan mreže ciljanih poslužitelja. Unutarnje skeniranje treba pokrenuti iz iste mreže na kojoj su ti poslužitelji. [12] 7.1. Primjeri pogrešno postavljenih sigurnosnih postavki Primjer 1: Neka aplikacija se oslanja na snažan framework kao što je Struts ili Spring. U njegovim komponentama na koje se aplikacija oslanja pronađene su XSS ranjivosti. Pušteno je ažuriranje kojim se popravljaju ti nedostaci, ali ne ažuriraju se biblioteke aplikacije. Dok se to ne učini, napadači mogu lako pronaći i iskoristiti ove nedostatke u aplikaciji. Primjer 2: Administratorska konzola aplikacijskog servera se automatski instalira i ne uklanja. Inicijalni računi nisu promijenjeni. Napadač otkriva standardne administratorske stranice na tom poslužitelju, prijavljuje sa inicijalnom lozinkom i preuzima upravljanje. Primjer 3: Popisivanje direktorija nije onemogućeno na nekom poslužitelju. Napadač otkriva da jednostavno može popisati direktorije kako bi pronašao datoteku koju želi. Napadač pronalazi i preuzima sve kompajlirane dokumente Java klase, iz kojih reverznim inženjeringom dobiva njen izvorni kôd. Napadač tada nalazi ozbiljan nedostatak kontrole pristupa u aplikaciji. Primjer 4: Konfiguracija aplikacijskog poslužitelja dozvoljava vraćanje korisniku logova sa stoga, time potencijalno izlažući temeljne nedostatke. Napadači koriste sve dodatne podatke o pogreškama koje im se pružaju. [11] 7.2. Sprječavanje pogrešno postavljenih sigurnosnih postavki Primarne preporuke su utvrditi sljedeće stavke: - Ustanoviti ponovljivi proces konfiguriranja koji će omogućiti brzo i jednostavno implementiranje drugog okruženja koje je pravilno osigurano. Razvojno, testno i proizvodno okruženje bi trebali biti konfigurirani identično. Ovaj proces bi trebao biti automatiziran kako bi se smanjio napor potreban za konfiguriranje novog sigurnog okruženja. - Utvrditi postupak za održavanje i implementaciju svih novih ažuriranja kôda kao i zakrpa pravodobno na svakom okruženju koje se koristi. To treba uključiti i sve biblioteke što se često previdi. - Napraviti jaku arhitekturu aplikacije koja pruža dobro odvajanje i sigurnost između komponenata. - Dogovoriti povremena skeniranja i revizije pomoću kojih bi se mogla otkriti buduća pogrešna postavljanja sigurnosnih postavki ili nedostatak zakrpa. [11] 8. Nesigurna pohrana šifriranih podataka Zaštita osjetljivih podataka pomoću kriptografije postala je ključni dio većine web aplikacija. Vrlo je uobičajeno da se osjetljivi podaci jednostavno ne uspiju šifrirati. Aplikacije koje koriste šifriranje često imaju loše napisan kôd za šifriranje. Ili koriste neprimjerene metode šifriranja ili uzrokuju ozbiljne pogreške koristeći snažne metode šifriranja. Ovi nedostaci mogu dovesti do otkrivanja osjetljivih podataka i povrede ovlaštenja. [13] 8.1. Primjeri nesigurne pohrane šifriranih podataka Primjer 1: Aplikacija šifrira podatke o kreditnim karticama u bazu podataka kako bi se spriječilo njihovo izlaganje krajnjim korisnicima. Međutim, baza je konfigurirana tako da automatski dešifrira upite vezane za stupce podataka o kreditnim karticama, omogućujući tako da se pomoću SQL injekcije dohvaćaju svi podaci o kreditnim karticama kao čisti tekst. Sustav bi trebao biti konfiguriran tako da dopušta samo pozadinskim upitima aplikacije dešifriranje tih podataka, a ne izravnim upitima web aplikacija. Primjer 2: Napravljena je dodatni (backup) medij na kojem su spremljeni svi šifrirani zdravstveni podaci iz evidencije, ali ključ za šifriranje pohranjen je na istom mediju.On nikada ne stigne na lokaciju za dodatnu pohranu (backup) podataka. Primjer 3: Baza podataka za pohranu lozinki koristi sažetke bez dodatnog parametra salt za pohranu svih lozinki. Ranjivost pri slanju dokumenta omogućuje napadaču preuzimanje datoteke lozinki. Svi sažeci bez parametra salt mogu „brute force“ napadom biti otkriveni u četiri tjedna, dok bi za one s ispravnim parametrom salt trebalo 3000 godina. [14] 8.2. Sprečavanje kriptografskih nedostataka Za sprečavanje kriptografskih nedostataka potrebno je pomno planiranje. Najčešći problemi su: - Nekriptiranje osjetljivih podataka - Korištenje samostalno napravljenih algoritama - Nesigurno korištenje snažnih algoritama - Nastavljanje s korištenjem dokazano slabih algoritama (MD5, SHA-1, RC3, RC4...) - Pohranjivanje ključeva unutar kôda, te njihovo nezaštićeno pohranjivanje Načini provjere da bi se potvrdilo da aplikacija ispravno šifrira osjetljive informacije za pohranu dijele se na automatizirane i ručne. - Automatizirani pristupi: alati za skeniranje ranjivosti ne mogu uopće provjeriti pohranu kriptografskih podataka. Oni mogu otkriti korištenje poznatih kriptografskih algoritama, ali ne mogu otkriti koriste li se oni ispravno ili da li se kodiranje izvodi na vanjskoj komponenti. - Ručni pristupi: Kao i skeniranje, testiranje ne može apsolutno provjeriti pohranu kriptografskih podataka. Pregled kôda je najbolji način da se provjeri da li aplikacija šifrira osjetljive podatke te ima ispravno implementiran mehanizam šifriranja i upravljanja ključevima. Ovo u nekim slučajevima može uključivati ispitivanje konfiguracije vanjskih sustava. [13] 8.3. Zaštita od kriptografskih nedostataka Najvažniji zadatak je osigurati da sve ono što bi trebalo biti šifrirano, zapravo i bude šifrirano. Osim toga potrebno je osigurati ispravno provođenje kriptografije. Budući da postoji toliko mnogo načina nepravilnog korištenja kriptografije, sljedeće preporuke treba uzeti u obzir prilikom testiranja ove ranjivosti kako bi se osiguralo sigurno rukovanje kriptografskim materijalom: - Ne stvarati svoje kriptografske algoritme. Trebalo bi koristiti samo odobrene javne algoritme kao što su AES, RSA kriptografija javnog ključa, te SHA-256 ili neki bolji algoritam za sažimanje. - Ne koristiti slabe algoritme, kao što su MD5 ili SHA1. Radije koristiti sigurnije alternative kao što je SHA-256. - Generirati ključeve offline, a privatne ključeve pohraniti s izuzetnom pažnjom. Nikada ne prenositi privatne ključeve preko nesigurnih kanala. - Osigurati da su autorizacijski podaci za primjerice baze podataka pravilno osigurani (pomoću strogih kontrola i dozvola pristupa) ili sigurno šifrirani i teški za dešifriranje bilo lokalnim ili udaljenim korisnicima. - Pobrinuti se da šifrirane podatke pohranjene na disk nije lako dešifrirati. Primjerice šifriranje baze podataka nema svrhe ako je bazi podataka osiguran nešifrirani pristup. - Prema trećem zahtjevi PCI Data Security standarda, moraju se zaštititi podaci vlasnika kartice. Usklađenost s PCI DSS standardom je obavezna od 2008. za trgovce i sve druge koji rukuju kreditnim karticama. Dobra praksa je da se nikada ne pohranjuju nepotrebni podaci, kao što su podaci s magnetne trake ili primarni brojevi računa (PAN, inače poznat kao broj kreditne kartice). Ako se pohranjuje PAN, moraju se poštivati PCI DSS zahtjevi. Na primjer, nikada se ne smije pohraniti CVV broj (tri znamenke na poleđini kartice) ni pod kojim okolnostima. [13] 9. Nezaštićeni pristup URL-ovima Najčešće je jedina zaštita za URL-ove da poveznice na tu stranicu ne budu prikazane neovlaštenim korisnicima. Međutim čak i tada motiviran, vješt ili jednostavno sretan napadač može biti u mogućnosti pronaći način za pristupiti ovim stranicama, pozivati funkcije i pregledavati podatke. Sigurnost postignuta skrivanjem nije dovoljna kako bi se zaštitile osjetljive aplikacijske funkcije i podaci. Provjere kontrole pristupa moraju se obaviti prije odobrenja zahtjeva za osjetljivom funkcijom što osigurava ovlašten pristup korisniku za tu funkciju. Osnovna metoda napada za ovu ranjivost zove se "prisilno pregledavanje", koje obuhvaća nagađanje poveznica i tehnike „brute force“ napada kako bi se pronašle nezaštićene stranice. Aplikacije obično dozvoljavaju širenje kôda za kontrolu pristupa po cijelom kôdu, što rezultira složenim modelom kojega teško razumiju i programeri i stručnjaci za sigurnost. Ova složenost čini vjerojatnijim pojavu pogrešaka i propusta na nekim stranicama koje onda ostaju izložene. Neki uobičajeni primjeri tih nedostataka su: - "Skriveni" ili "posebni" URL-ovi, dodjeljeni samo administratorima ili privilegiranim korisnicima u prezentacijskom sloju, ali su dostupni svim korisnicima ako oni znaju za njihovo postojanje kao što su /admin/adduser.php ili /approveTransfer.do. Ovo je posebno rasprostranjeno u kôdu izbornika. - Aplikacije često omogućuju pristup "skrivenim" datotekama, kao što su statički XML ili sustavno generirani izvještaji, vjerujući u sigurnost skrivanjem. - Postoji kôd koji provodi politiku kontrole pristupa, ali je zastario ili nedovoljan. Primjerice, neka je /approveTransfer.do nekad bio dostupan svim korisnicima, ali su nove kontrole donijele odluku da bi on trebao biti dostupan samo određenima. Nadogradnja aplikacije je možda uvela da ga se ne prezentira neovlaštenim korisnicima, ali ne i kontrolu pristupa koja se nužno provodi kada se zatraži baš tu stranica. - Postoji kôd koji procjenjuje ovlasti kod klijenta, ali ne i na poslužitelju, kao u napadu na MacWorld 2007. koji je odobrio „platinaste“ ulaznice vrijedne 1700 dolara putem JavaScripta na pregledniku a ne na poslužitelju. [15] 9.1. Primjer nezaštićenog pristupa URL-ovima Napadač jednostavno na silu pretražuje kako bi došao do ciljanih URL-ova. Neka su to primjerice sljedeći URL-ovi koji su oboje trebali zahtijevati autentikaciju. Za pristup stranici "admin_getappInfo" su također potrebna administratorska prava: http://example.com/app/getappInfo http://example.com/app/admin_getappInfo Ako napadač nije autentificiran, a odobren mu je pristup bilo kojoj od ovih stranica, tada mu je bio dopušten neovlašten pristup. Ako je autentificiranom korisniku koji nije administrator dopušten pristup „admin_getappInfo“ stranici, to je mana koja može dovesti napadača na više nedovoljno zaštićenih administratorskih stranica. Takvi nedostaci se često javljaju kada se poveznice i tipke ne prikazuju neovlaštenim korisnicima, ali aplikacija ne uspjeva zaštititi ciljane stranice. [16] 9.2. Provjera sigurnosti pristupa URL-ovima Cilj je provjeriti da se kontrola pristupa dosljedno provodi u prezentacijskom sloju i poslovnoj logici za sve URL-ove u aplikaciji. - Automatizirani pristupi: Oboje, i skeneri ranjivosti i alati za statičku analizu, imaju poteškoća s provjerom kontrole pristupa URL-ovima, ali iz različitih razloga. Skeneri za provjeru ranjivosti imaju poteškoća pri traženju skrivenih stranica i određivanja koje stranice bi trebale biti dopuštene za kojeg korisnika, dok alati za statičku analizu imaju poteškoća pri identifikaciji korisniku prilagođenih kontrola pristupa u kôdu i povezivanju prezentacijskog sloja s poslovnom logikom. - Ručni pristupi: Najučinkovitiji i najprecizniji pristup je korištenje kombinacije pregledavanja kôda i testiranja sigurnosti kako bi se potvrdio mehanizam kontrole pristupa. Ako je mehanizam centraliziran, provjera može biti vrlo učinkovita. Ako je distribuiran preko cijelog kôda, provjera može oduzeti jako puno vremena. Ako se mehanizam provodi izvana, konfiguracija mora biti ispitana i testirana. [15] 9.3. Zaštita pristupa URL-ovima Ključni korak u ostvarivanju zaštite protiv nezaštićenog pristupa URL-ovima je uzeti dovoljno vremena za planiranje autorizacije stvaranjem matrice za mapiranje uloga i funkcija aplikacije. Web aplikacije moraju provoditi kontrolu pristupa na svakom URL-u i poslovnoj funkciji. Nije dovoljno napraviti kontrolu pristupa u prezentacijskom sloju i ostaviti poslovnu logiku nezaštićenom. Također nije dovoljno samo jednom tokom procesa provjeriti ima li korisnik ovlaštenje, a onda ne provjeravati ima li korisnik ovlaštenje za naredne korake. Inače napadač može jednostavno preskočiti korak kada se provjerava autorizacija i krivotvoriti vrijednosti parametara potrebne za nastaviti na sljedećem koraku. Uvođenje kontrole pristupa URL-ovima zahtjeva pažljivo planiranje. Neka od najvažnijih pravila su: - Osigurati da matrica kontrole pristupa bude dio funkcije, arhitekture i dizajna aplikacije - Osigurati da svi URL-ovi i poslovne funkcije budu zaštićeni učinkovitim mehanizmom kontrole pristupa koji provjerava ulogu korisnika i dodijeljena prava prije nego se obavi ikakva obrada. Pobrinite se da se ova provjera obavlja tijekom svakog koraka, a ne samo jednom na početku procesa koji zahtjeva više koraka. - Napraviti penetracijsko testiranje prije aktiviranja ili isporuke kôda kako bi se osiguralo da motivirani sposoban napadač ne može zloupotrijebiti aplikaciju. - Obratiti pozornost na datoteke i biblioteke uključene u aplikaciju, pogotovo ako imaju izvršnu ekstenziju kao što je primjerice .php. Tamo gdje je to moguće, one bi trebale biti izvan početnog web-a. Trebalo bi potvrditi da im se ne može izravno pristupiti npr. provjerom konstante koja se može obaviti samo pozivanjem biblioteke - Ne smije se pretpostaviti da korisnici neće biti svjesni posebnog ili skrivenog URL-a ili API-ja. Uvijek treba osigurati da su administrativne i akcije za koje je potrebna visoka privilegija zaštićene. - Blokirati pristup svim vrstama datoteka koje aplikacija nikada izravno ne koristi. U idealnom slučaju, ovaj filter bi trebao slijediti pristup „prihvati dobro poznato“ i dopustiti samo vrste datoteka koje se namjeravaju koristiti (primjerice .html, .pdf,.php). Na taj način bi se blokirali bilo koji pokušaji pristupa log datotekama, XML datotekama itd. kojima se nikada ne namjerava izravno pristupati. - Redovito održavati zaštitu od virusa i zakrpe komponenata kao što su XML procesori, procesori slika itd. koje obrađuju podatke koje korisnik isporučuje. [15] 10. Nedovoljna zaštita na transportnom sloju Aplikacije često ne uspijevaju kodirati mrežni promet kada je to nužno za zaštitu osjetljive komunikacije. Šifriranje (obično SSL) se mora koristiti za sva autentificirana povezivanja, posebno na web stranicama koje su pristupačne na internetu, ali također i na pozadinskim vezama. Inače će autentifikacija ili sjednični token aplikacije biti izloženi. Šifriranje treba koristiti svaki put kad se prenose osjetljivi podaci kao što su brojevi kreditnih kartica ili zdravstvene informacije. Aplikaciju koja prestaje koristiti šifrirani način rada napadač može lako zloupotrijebiti. PCI standard zahtijeva da svi podaci o kreditnim karticama koji se prenose preko interneta moraju biti kodirani. Neuspjeh pri šifriranju osjetljive komunikacije omogućuje napadaču njuškanje mrežnog prometa te mu daje mogućnost prisluškivanja razgovora, uključujući i sve povjerljive ili osjetljive informacije koje se prenose. Treba uzeti u obzir da su različite mreže više ili manje osjetljive na njuškanje. Međutim važno je shvatiti da će takav sustav biti ugrožen na gotovo svakoj mreži, a napadači će moći brzo uhvatiti povjerljive podatke drugih sustava. Korištenje SSL-a za komunikaciju s krajnjim korisnicima je nužno, budući da oni vrlo vjerojatno koriste nesigurne mreže za pristup aplikacijama. Budući da HTTP uključuje provjeru autorizacijskih podataka ili sjedničnog tokena u svaki pojedini zahtjev, sav autenticirani promet treba ići preko SSL-a, a ne samo zahtjev za prijavu na sustav. Šifriranje komunikacije sa pozadinskim poslužiteljima je također važno. Iako su ove mreže vjerojatno sigurnije, informacije i podaci za autorizaciju koje one prenose su osjetljiviji i opširniji. Stoga je upotreba SSL-a na pozadinskom prometu također nužna. Šifriranje osjetljivih podataka, kao što su podaci o kreditnim karticama i brojevi socijalnog osiguranja, postalo je dio regulacije privatnosti i financijskih propisa u mnogim organizacijama. Zanemarivanje korištenja SSL-a za rukovanje vezama kojima se prenose takvi podaci stvara rizik usklađenosti. [17] 10.1. Primjer nedovoljne zaštite na transportnom sloju Primjer 1: Stranica jednostavno ne koristiti SSL za sve stranice koje zahtijevaju autentikaciju. Napadač jednostavno prati mrežni promet (kao na otvorenoj bežičnoj mreži ili susjednoj žičanoj modemskoj mreži), te prati autentificiran sjednični cookie žrtve. Napadač tada iskorištava taj cookie i preuzima korisničku sjednicu. Primjer 2: Stranica ima nepropisno konfiguriran SSL certifikat koji uzrokuje upozorenja preglednika svojim korisnicima. Korisnici moraju prihvatiti takva upozorenja i nastaviti, kako bi se mogli koristiti tom stranicom. Posljedica ovakvih pojava je navikavanje korisnika na takva upozorenja. Kriminalna prijevara (eng. phishing) usmjerena protiv korisnika ove web stranice mami korisnike na drugu stranicu koja izgleda kao originalna stranica ali nema valjani certifikat, pa pritom generira slična upozorenja preglednika. Budući da su korisnici navikli na takva upozorenja, oni nastavljaju koristiti stranicu koja može poslužiti za krađu identiteta, odavanje lozinki ili drugih privatnih podataka. Primjer 3: Stranica jednostavno koristi ODBC/JDBC standard za povezivanje baza podataka, ne shvaćajući da se sav promet prenosi kao čisti tekst. [18] 10.2. Provjera sigurnosti na transportnom sloju Cilj je potvrditi da aplikacija ispravno šifrira svu povjerljivu i osjetljivu komunikaciju. - Automatizirani pristupi: alati za skeniranje ranjivosti mogu potvrditi da li se SSL koristi pri komunikaciji s korisnikom, te mogu pronaći mnoge nedostatke vezane za SSL. Međutim, ovi alati nemaju pristup pozadinskoj komunikaciji i ne mogu potvrditi da li je ona sigurna. Alati za statičku analizu mogu pomoći pri analizi nekih poziva prema pozadinskim sustavima, ali vjerojatno neće razumjeti prilagođenu logiku potrebnu za sve vrste sustava. - Ručni pristupi: Testiranje može potvrditi da se SSL koristi i pronaći mnoge nedostatke vezane za SSL pri direktnoj komunikaciji s korisnikom, ali automatizirani pristupi su u tome vjerojatno učinkovitiji. Pregled kôda je prilično učinkovit za utvrđivanje pravilnog korištenja SSL-a za svu pozadinsku komunikaciju. [17] 10. 3. Zaštita na transportnom sloju Najvažnija je zaštita korištenje SSL-a za svu autenticiranu komunikaciju ili pri svakom prijenosu osjetljivih podataka. Postoji niz detalja koji su važni pri ispravnom konfiguriranju SSL-a za web aplikaciju, tako da je vrlo važno razumijevanje i analiziranje okoline u kojoj se pokreće aplikacija. Na primjer, IE 7.0 daje zelenu oznaku za SSL certifikate od visokog povjerenja, ali to nije prikladna kontrola za dokazivanje sigurnog korištenja kriptografije. Dobro bi bilo slijediti sljedeće preporuke: - Koristiti SSL za svu autentificiranu komunikaciju, te pri prijenosu svih osjetljivih podataka kao što su autentifikacijski podaci, podaci o kreditnim karticama, zdravlju kao i druge privatne informacije - Osigurati da je komunikacija između infrastrukturnih elemenata, kao na primjer između web poslužitelja i baze podataka sustava, primjereno zaštićena korištenjem sigurnosti transportnog sloja ili šifriranja na razini protokola za autentifikacijske podatke i podatke koji predstavljaju veliku vrijednost za sustav - Postaviti zastavicu „secure“ na svim osjetljivim cookiejima - Konfigurirati davatelja SSL-a tako da podržava samo snažne algoritme (koji zadovoljavaju FIPS 140-2) - Osigurati valjan certifikat, koji nije istekao, nije povučen i odgovara svim domenima korištenima u aplikaciji - Prema četvrtom zahtjevu PCI standarda za podatkovnu sigurnost (PCI DSS), moraju se zaštititi podaci o karticama pri njihovom prijenosu. Usklađenost s PCI DSS standardom je obavezna za trgovce i sve ostale koji se bave kreditnim karticama. U principu svaki (klijentski, partnerski, administrativni) pristup sustavu mora biti šifriran koristeći SSL ili sličnu zaštitu. [17] 11. Neprovjerena preusmjeravanja i proslijeđivanja Aplikacije često preusmjeravaju korisnike na druge stranice ili koriste unutarnja prosljeđivanja na sličan način. Ponekad je ciljna stranica navedena u parametru koji nije valjan čime se napadačima daje mogućnost odabira odredišne stranice. Da bi se utvrdilo da li aplikacija ima neka neprovjerena preusmjeravanja ili prosljeđivanja potrebno je napraviti sljedeće provjere: 1. Pregledati kôd za sva korištenja preusmjeravanja ili prosljeđivanja (u .NET se nazivaju transferi). Za svaku upotrebu, identificirati je li ciljni URL uključen u bilo koju vrijednost parametra. Ako je tako, potrebno je provjeriti jesu li parametari valjani tako da sadrže samo dozvoljeno odredište ili element odredišta. 2. Potrebno je pregledati cijelu stranicu kako bi se vidjelo generira li neka preusmjeravanja (HTTP kodovi odgovora 300-307, obično 302). Također, pogledati parametre predane prije preusmjeravanja kako bi vidjeli mogu li oni biti ciljni URL ili dio takvog URL-a. Ako mogu, treba promijeniti ciljni URL i promatrati je li stranica preusmjerena na novi cilj. 3. Ako kôd nije dostupan, treba provjeriti sve parametre da bi se vidjelo izgledaju li oni kao dio URL odredišta za preusmjeravanje ili prosljeđivanje i testirati one koji tako izgledaju. 11.1. Primjeri neprovjerenih preusmjeravanja i proslijeđivanja Primjer 1: Aplikacija ima stranicu pod nazivom "redirect.jsp" koja uzima samo jedan parametar pod nazivom "url". Napadač kreira zlonamjerni URL koji preusmjerava korisnike na zlonamjernu stranicu koja obavlja kriminalnu prijevaru i instalira zlonamjerni kôd. http://www.example.com/redirect.jsp?url=evil.com Primjer 2: Aplikacija koristi prosljeđivanje za usmjeravanje zahtjeva između različitih dijelova stranice. Da bi se usmjeravanje olakšalo, neke stranice koriste parametar koji označava gdje treba preusmjeriti korisnika ako transakcija bude uspješna. U ovom slučaju, napadač kreira URL koji će preskočiti aplikacijsku provjeru prava pristupa te zatim proslijediti napadača na administrativnu funkciju kojoj inače ne bi bio u mogućnosti pristupiti. http://www.example.com/boring.jsp?fwd=admin.jsp 11.2. Sprječavanje neprovjerenih preusmjeravanja i proslijeđivanja Sigurna upotreba preusmjeravanja i prosljeđivanja može biti osigurana na nekoliko načina: - Jednostavnim izbjegavanjem korištenja preusmjeravanja i prosljeđivanja. - Ako se koriste preusmjeravanja i prosljeđivanja, ne smiju se uključivati korisnički parametri u izračun odredišta. Ovo se obično može primjeniti. - Ako se iz odredišta ne mogu izbaciti korisnički parametri, potrebno je osigurati da je dobivena vrijednost valjana i ovlaštena za tog korisnika. Preporuča se da svaki takav odredišni parametar ima neku mapiranu vrijednost umjesto stvarnog URL-a ili njegovog dijela, te da kôd na strani poslužitelja prevede ovaj mapirani parametar u ciljni URL. Aplikacije mogu koristiti ESAPI kako bi nadjačale metodu sendRedirect () čime bi osigurale da su sve destinacije preusmjeravanja sigurne. Izbjegavanje takvih propusta je izuzetno važno jer oni su omiljena meta prevaranata koji pokušavaju steći povjerenje korisnika. [19] 12. Popis literature 1. https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project 2. https://www.owasp.org/index.php/Top_10_2010-A1 3. http://en.wikipedia.org/wiki/SQL_injection 4. http://en.wikipedia.org/wiki/Cross-site_scripting 5. https://www.owasp.org/index.php/Authentication_Cheat_Sheet 6. https://www.owasp.org/index.php/Session_Management_Cheat_Sheet 7. https://www.owasp.org/index.php/Top_10_2007-Insecure_Direct_Object_Reference 8. https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References 9. https://www.owasp.org/index.php/CSRF 10. http://en.wikipedia.org/wiki/Cross-site_request_forgery#_note-1 11. https://www.owasp.org/index.php/Top_10_2010-A6-Security_Misconfiguration 12. https://www.owasp.org/index.php/A10_2004_Insecure_Configuration_Management 13. https://www.owasp.org/index.php/Top_10_2007-Insecure_Cryptographic_Storage 14. https://www.owasp.org/index.php/Top_10_2010-A7-Insecure_Cryptographic_Storage 15. https://www.owasp.org/index.php/Top_10_2007-Failure_to_Restrict_URL_Access 16. https://www.owasp.org/index.php/Top_10_2010-A8-Failure_to_Restrict_URL_Access 17. https://www.owasp.org/index.php/Top_10_2007-Insecure_Communications 18. https://www.owasp.org/index.php/Top_10_2010-A9Insufficient_Transport_Layer_Protection 19. https://www.owasp.org/index.php/Top_10_2010-A10-Unvalidated_Redirects_and_Forwards
© Copyright 2024 Paperzz