Napad falsifikovanim zahtjevima (Cross-Site Request Forgeries, CSRF)

Napad falsifikovanim zahtjevima (Cross-Site Request Forgeries, CSRF)

Napad falsifikovanim zahtjevima (eng. Cross-Site Request Forgeries, CSRF) se ogleda u slanju zahtjeva na odredišnu lokaciju, a da toga žrtva nije svjesna. Žrtva obično ima određeni nivo ovlasti (npr. moderator ili administrator) u web aplikaciji, što omogućuje napadaču da izvrši akcije koje inače ne bi mogao da izvrši.

CSRF napad ima sljedeće karakteristike:

  • Zloupotreba povjerenja koje web aplikacija ima za određenog korisnika;
  • U osnovi uključuju web aplikacije koji se oslanjaju na identitet korisnika;
  • Tipično je da identitet korisnika nosi neku teţinu;
  • HTTP zahtjev po izboru napadača.

Ukoliko se radi o forum web aplikaciji potencijale žrtve napadača su forum moderatori koji imaju ovlasti za uređivanje foruma (brisanje i izmjene tema i poruka). Realiziranje brisanja teme ili poruke je obično riješeno putem GET zahtijeva u obliku URL adrese http://primjer.ba/forum/obrisi_temu.php?id=289. Skripta obrisi_temu.php će obično provjeriti da li korisnik koji šalje zahtjev ima privilegiju za to, te da li tema koju je potrebno izbrisati zaista postoji. Ako su ispunjena ova dva uslova, tema će biti izbrisana. Međutim, ukoliko nema dodatnih provjera, onda postoji ozbiljan sigurnosni propust u vidu izvršavanja ove skripte, a da toga moderator nije svjestan (zamaskirani linkovi, izvršavanje skripte preko img taga i slično), što je zapravo osnova CSRF napada.

Da bi se izbjegli ovakvi napadi, preporuka je umjesto GET zahtijeva forsirati i koristiti POST zahtjeve, jer su teži za falsifikovanje i isključuju mogućnost da se zahtjev pošalje preko img taga. Zatim je potrebno osigurati da svi zahtjevi potiču iz okruženja originalne forme, što je moguće upotrebom tokena.

Token predstavlja jedinstveni string i zadatak programera je da odredi pravilo na koji će način biti generisan, ali ono što je važno, a to je da mora biti jedinstven i nadasve slučajan, kako napadač ne bi mogao da predvidi njegovu vrijednost. PHP za to nudi uniqid(), rand() i md5() funkcije. Token se generiše i dostavlja posebno za svaki formular, te se provjerava i poredi prije osjetljivih akcija sa ciljem da se izbjegnu CSRF napadi.

Ovaj napad nije posljedica neobrađenih ulaznih podataka, već se radi o falsifikovanim zahtjevima koje može da upućuje legitimni korisnik, a da toga nije svjestan, poput poziva skripti preko skrivenog img taga. Druga varijanta ovog napada je da napadač kroz vlastite HTML forme na svom serveru upućuje zahtjeve ka serveru na kojem se nalazi web aplikacija koja je meta napada i tako zaobilazi određene mehanizme zaštite. Zaštita od CSRF napada se svodi na upotrebu POST zahtijeva koje je teže falsifikovati i upotrebu jedinstvenih tokena koji bi trebali osigurati da svi zahtjevi upućeni ka serveru budu iz okruženja originalne web aplikacije.

Želite postati naš klijent?

Zatražite ponudu