cross-site request forgeries

csrf ili xsrf (cross-site request forgeries) je ucestali propust u web aplikacijama.
naime radi se o tome da se za neke akcije, pristupacne samo autentifikovanim posjetiocima,
koriste uvjek isti parametri, ili parametri koji se mogu saznati od strane bilo koga. npr da bi posjetili
stranicu na kojoj se dodaje post na blog na blogger.ba, posjetimo

http://www.blogger.ba/mojblog.php?blog=xxxx&sekcija=novipost
. ovaj url je isti za svakoga, osim
parametra blog(id) koji se moze lahko saznati. eh sta ako postoji takav poznat url za neke druge
malo opasnije akcije kao sto je brisanje komentara, ili brisanje postova, ili cak brisanje bloga.
sada cu objasniti primjer csrf napada
da bi obrisali neki blog treba nam samo blog(id) sto se da zakljuciti iz urla za brisanje bloga
http://www.blogger.ba/mojblog.php?blog=xxxx&action=delete. kakva je onda korist ovoga ako
samo mozemo obrisati svoje blogove. da bi se blog obrisao potrebno je da url za brisanje tog
bloga posjeti autor tog bloga, naravno loginovan. kako onda natjerati autora da posjeti url za
brisanje njegovog bloga. u ovom napadu na blog zrtve potreban nam je id njegovog bloga. idovi
blogova na blogger.ba nisu skriveni tako da url za brisanje zrtvinog bloga je lahko sastaviti. da bi
"natjerali" zrtvu da posjeti taj obrisi-si-blog url, potrebo je da na svom blogu, npr napadac.blogger.ba
ubacimo u html kod
<iframe> ili <img> tag sa src atributom na url za brisanje zrtvinog bloga,
i naravno pozvati zrtvu da posjeti napadac.blogger.ba
<iframe src="http://www.blogger.ba/mojblog.php?blog=xxxx&action=delete" width='0’ …></iframe>
kada zrtva posjeti blog napadaca, posalje se http zahtjev na vrijednost atributa src, u ovom slucaju
url za brisanje bloga, cime zrtva sama sebi obrisati blog.
ovaj propust je popravljen danas, iako sam obavijestio admina blogger.ba u srijedu

isti ovakav propust moze se uociti i na blog.ba, iako originalno na blog.ba zahtjev za brisanje bloga
ide preko post forme, istu akciju moguce je izvrsiti ako parametar za brisanje bloga proslijedimo
preko urla (get)
<input name="btnDel" type="submit" class="dugme_sivo" onClick="return onDelete();" value="Obriši ovaj BLOG ! " …>
i blog.ba koristi blog id, medjutim za editovanje selektovano bloga ne treba id, sto cini url za
brisanje barem jednog bloga (selektovanog) bilo kojeg korisnika univerzalnim.

kako se ovakvi propusti odklanjaju? u slucaju blogger.ba admin je valjda poslusao moj savjet da
provjerava http-referer varijablu koja nam pokazuje odakle je url pokrenut, u slucaju da autor bloga
voljno klikne na link za brisanje bloga na blog editoru, referer je sa blogger.ba/mojblog.php?…
sto se ne moze lazirati, dok kada se obrisi-si-blog url pokrene preko <iframe> taga onda referer
kazuje da dolazimo sa napadac.blogger.ba jer je na njemu taj tag, i u tom slucaju akcija se ne treba izvrsiti.

blog.ba ima isto zanimljivu metodu, a to je post forma, medjutim omogucavaju delete akciju
cak kad se btnDel parametar proslijedi sa urlom, sto je lose. ni post forma nije sigurna jer se
submitovanje forme moze lazirati preko javascripta. i u ovom slucaju referer je najbolje rjesenje.

jos jedna metoda koja se koristi za zastitu od csrf napada je koristenje sid (session id) parametra u
generisanju svakog urla, znaci na svaki url koji vodi do neke akcije dodaje se sid koji omogucuje da
se prepozna da se ackija izvrsava od strane prave osobe. ova metoda se oslanja na to da sid vrijednost
nije poznata nikome osim
autentifikovanim korisniku, medjutim postoje i napadi za kradju sida.
a sada odoh da uradim logout da mi ne bi blog misticno nesto…

6 komentara

Komentariši