Slijede razlike između dviju inačica stranice.
Starije izmjene na obje strane Starija izmjena Novija izmjena | Starija izmjena | ||
racfor_wiki:cross_site_request_forgery_napadi [2021/01/17 14:48] sbrkic Adaptacija prvih nekoliko poglavlja |
racfor_wiki:cross_site_request_forgery_napadi [2024/12/05 12:24] (trenutno) |
||
---|---|---|---|
Redak 1: | Redak 1: | ||
===== Cross Site Request Forgery napadi ===== | ===== Cross Site Request Forgery napadi ===== | ||
- | ===== Sažetak | + | ==== Sažetak ==== |
- | CSRF napadi vrsta su mrežnih napada u kojima napadač zloupotrebom HTTP protokola i implementacija web preglednika nastoji postići da žrtva koristeći svoj web preglednik podnese HTML formu bez vlastite privole, a često i bez znanja da je forma uopće podnesena. U ovom radu obradjeno | + | CSRF napadi vrsta su mrežnih napada u kojima napadač zloupotrebom HTTP protokola i implementacija web preglednika nastoji postići da žrtva koristeći svoj web preglednik podnese HTML formu bez vlastite privole, a često i bez znanja da je forma uopće podnesena. U ovom radu obrađeno |
- | ===== Uvod ===== | + | ==== Uvod ==== |
- | Ispunjavanje formi (formulara) | + | Ispunjavanje formi (formulara) |
- | ===== Osnove HTTP kolačića (engl. cookies) | + | ==== Osnove HTTP kolačića (engl. cookies) ==== |
- | Protokol HTTP u svojim inicijalnim verzijama nije imao nikakvu mogućnost pohrane stanja (engl. stateless), odnosno svi klijentski zahtjevi na poslužitelju su se obrađivali anonimno, pri čemu poslužitelj nije mogao odrediti identitet korisnika koji je uputio pojedini zahtjev. | + | Protokol HTTP u svojim inicijalnim verzijama nije imao nikakvu mogućnost pohrane stanja (engl. stateless), odnosno svi klijentski zahtjevi na poslužitelju su se obrađivali anonimno, pri čemu poslužitelj nije mogao odrediti identitet korisnika koji je uputio pojedini zahtjev |
Kolačići (engl. cookies) najkorištenija su metoda identifikacije korisnika. Razvijeni su u kompaniji Netscape, a njihovo korištenje ubrzo je standardizirano i implementirano od strane svih većih web preglednika. | Kolačići (engl. cookies) najkorištenija su metoda identifikacije korisnika. Razvijeni su u kompaniji Netscape, a njihovo korištenje ubrzo je standardizirano i implementirano od strane svih većih web preglednika. | ||
- | Kolačići su implementirani koristeći zaglavlja, odnosno postojeću infrastukturu protokola HTTP. Nakon što poslužitelj korištenjem posebnog zaglavlja | + | Kolačići su implementirani koristeći zaglavlja, odnosno postojeću infrastukturu protokola HTTP. Nakon što poslužitelj korištenjem posebnog zaglavlja |
- | {{: | + | {{: |
Redak 28: | Redak 28: | ||
Na poslijetku, u slučaju C prikazan je idući zahtjev koji klijent upućuje prema istom poslužitelju, | Na poslijetku, u slučaju C prikazan je idući zahtjev koji klijent upućuje prema istom poslužitelju, | ||
- | ==== Konfiguracija kolačića | + | === Konfiguracija kolačića === |
- | Poslužitelj | + | Poslužitelj |
- | Korištenjem ključa '' | + | Korištenjem ključa '' |
Ključ '' | Ključ '' | ||
Redak 41: | Redak 41: | ||
+ | === Autentifikacija putem kolačića === | ||
+ | Danas se kolačići često koriste za autentifikaciju korisnika uz tzv. poslužiteljske sjednice. Za svakog klijenta se na poslužitelju generira sjednica, koja se najčešće pohranjuje u bazu podataka. Identifikator sjednice zapisuje se u kolačić na klijentu. U svim zahtjevima prema poslužitelju klijent šalje kolačić sa identifikatorom sjedince koji poslužitelju koristi za daljnju obradu zahtjeva. Ovom metodom u kolačiću se ne pohranjuju osjetljive vrijednosti sjednice, već samo identifikator koji poslužitelju služi za dohvat iste. | ||
- | ===== Zaključak ===== | + | Iako ova metoda autentifikacije nije preduvjet za CSRF napade, danas se vrlo često koristi u praksi. |
+ | ==== Osnove HTML formi ==== | ||
+ | |||
+ | HTML forme jedan su od načina na koji korisnik može podatke prenijeti na poslužitelj. Koncipirane su kao parovi vrijednosti ključ-vrijednost, | ||
+ | |||
+ | Jednostavan primjer koda HTML forme prikazan je u nastavku: | ||
+ | |||
+ | < | ||
+ | <form action=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Navedena forma ima dva para ključ-vrijednost, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Detalji funkcioniranja i konfiguracije HTML formi nisu bitni u kontekstu CSRF napada, no bitan aspekt | ||
+ | |||
+ | |||
+ | === Prijenos HTML formi korištenjem GET zahtjeva === | ||
+ | |||
+ | Prvi pristup je korištenjem GET zahtjeva. Nakon što je korisnik ispunio formu, sadržaj forme se enkapsulira u URL (engl. Uniform Resource Locator). URL specifikacija definira generalnu shemu URL-a u idućem formatu: | ||
+ | |||
+ | < | ||
+ | scheme:// | ||
+ | </ | ||
+ | |||
+ | Segment '' | ||
+ | Primjer URL-a koji koristi segment '' | ||
+ | |||
+ | < | ||
+ | www.example.com? | ||
+ | </ | ||
+ | |||
+ | Prikazani URL prenosi dva para ključ-vrijednost ('' | ||
+ | |||
+ | U slučaju HTML formi, ključ poprima vrijednost naziva pojednog ključa u formi, dok se u vrijednost pridjeljenoj ključu upisuje korisnikov unos. | ||
+ | |||
+ | Vrlo bitna karakteristika ovog pristupa prijenosu HTML formi na poslužitelj je ta što je gore navedeni primjer URL-a moguće distribuirati kao običnu poveznicu (engl. link). Svaki korisnik koji bi u svojem web pregledniku kliknuo na navedenu poveznicu bi na poslužitelj poslao | ||
+ | |||
+ | === Prijenos HTML formi korištenjem POST zahtjeva === | ||
+ | |||
+ | Ukoliko HTML forma koristi POST zahtjev za prijenos na poslužitelj, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Korisnik je u pregledniku u polje '' | ||
+ | |||
+ | |||
+ | ==== Ideja i tijek CSRF napada ==== | ||
+ | |||
+ | CSRF (engl. Cross-Site Request Forgery) napadi temelje se na korištenju kolačića za autentifikaciju korisnika, te na načinu na koji se HTML forme s klijenta šalju poslužitelju [2]. | ||
+ | |||
+ | Zamislimo da neka banka ima mrežnu stranicu na kojoj svojim korisnicima nudi opciju uplate novca na neki drugi račun, primjerice za plaćanje režija. Jednostavan primjer HTML forme za ostvarivanje navedene funkcionalnosti prikazan je u nastavku. | ||
+ | |||
+ | < | ||
+ | <form action=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Forma se sastoji od dva para ključ-vrijednost. U prvom se specificira broj računa na koji se vrši uplata, dok se u drugom specificira iznos uplate. Također je vidljivo da se za slanje forme koristi GET zahtjev. | ||
+ | |||
+ | Pretpostavimo da navedena stranica banke koristi kolačiće za autentifikaciju korisnika. Kako je opisano u prošlim poglavljima, | ||
+ | |||
+ | Bitno je uočiti kako je i slanje HTML forme na poslužitelj zapravo običan HTTP zahtjev, te će korisnikov preglednik automatski u zaglavlje zahtjeva dodati vrijednost kolačića. Primjerice, ako je legitiman korisnik bankarske stranice odlučio na račun `1234` uplatiti `100` kuna, klikom na gumb " | ||
+ | |||
+ | < | ||
+ | GET / | ||
+ | Host: example.com | ||
+ | Cookie: id_sjednice=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | Poslužitelj će prvo pročitati vrijednost kolačića iz odgovarajućeg zaglavlja zahtjeva, te će zatim pokušati autentificirati korisnika. Nakon uspješne autentifikacije poslužitelj iz putanje resursa čita parove vrijednosti '' | ||
+ | |||
+ | **Međutim, navedeni zahtjev moguće je napraviti i najobičnijim klikom na URL**: | ||
+ | < | ||
+ | example.com/ | ||
+ | </ | ||
+ | |||
+ | bez ikakvog ispunjavanja formi, i to je najčešća metoda izvođenja CSRF napada. Ukoliko korisnik koji **nije** prijavljen u bankarsku stranicu otvori | ||
+ | |||
+ | |||
+ | === CSRF napadi uz korištenje prijenosa HTML forme POST zahtjevom === | ||
+ | |||
+ | |||
+ | CSRF napad moguće je izvesti i ukoliko se forma s klijenta šalje POST zahtjevom. U tom slučaju više nije moguće izvesti napad jednim klikom korisnika, jer se vrijednosti forme ne zapisuju u URL nego se šalju u tijelu zahtjeva. HTML forma za ostvarivanje navedene funkcionalnosti prikazana je u nastavku: | ||
+ | |||
+ | < | ||
+ | <form action=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Forma je vrlo slična onoj iz prethodnog poglavlja gdje se koristio GET zahtjev za slanje forme, a jedina razlika je u tome što je u '' | ||
+ | |||
+ | < | ||
+ | POST /uplata HTTP/1.1 | ||
+ | Host: example.com | ||
+ | Cookie: id_sjednice=" | ||
+ | |||
+ | broj_racuna=1234& | ||
+ | </ | ||
+ | |||
+ | U slučaju slanja forme poslužitelju korištenjem POST zahtjeva napadač mora konstruirati specifičnu " | ||
+ | |||
+ | < | ||
+ | <form action=" | ||
+ | <!-- sakriveni dio forme --> | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <!-- benigni dio forme | ||
+ | <input type=" | ||
+ | | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | U prikazanom primjeru zloupotrebljava se atribut '' | ||
+ | |||
+ | Osim činjenice da ovu varijantu napada, za razliku od GET varijante, nije vrlo jednostavno izvesti, dodatna manjkavost ove varijante je u tome što se u zahtjevu prema poslužitelju banke šalje i dodatna vrijednost u formi, odnosno ključ '' | ||
+ | |||
+ | === CSRF napadi maskirani u HTML slike === | ||
+ | |||
+ | Ukoliko se za slanje forme koristi GET zahtjev, napad je moguće dodatno ubrzati na način da se eliminira potreba da žrtva klikne, odnosno otvori napadačev URL. | ||
+ | |||
+ | Web preglednici od samih početaka podržavaju opciju prikazivanja slika korištenjem '' | ||
+ | |||
+ | Web preglednik automatski (bez ikakve intervencije korisnika) dohvaća sliku s URL-a specificiranog u '' | ||
+ | |||
+ | < | ||
+ | example.com/ | ||
+ | </ | ||
+ | |||
+ | žrtvin web preglednik otvaranjem napadačeve web stranice u svrhu dohvata slike automatski šalje GET zahtjev na bankarski poslužitelj | ||
+ | |||
+ | ==== Prevencija CSRF napada ==== | ||
+ | |||
+ | Postoje dva osnovna načina zaštite od CSRF napada [3], a oba se temelje na nasumično generiranoj tajnoj vrijednosti koju poslužitelj šalje legitimnom klijentu, a klijent primljenu vrijednost prenosi poslužitelju kao dodatni parametar HTML forme. Poslužitelj zatim provjerava jednakost poslane i primljene tajne vrijednosti. Taj se tajni ključ naziva CSRF token ili sinkronizacijski token. | ||
+ | |||
+ | Ideja je da napadač ne moze izvršiti CSRF napad jer ne može pogoditi tajnu vrijednost koju je poslužitelj poslao legitimnom klijentu, ako je vrijednost uopće poslana. | ||
+ | |||
+ | === Prevencija korištenjem dodatnog polja forme === | ||
+ | |||
+ | U ovom pristupu poslužitelj ugrađuje CSRF token dikretno u HTML formu, te pamti zadnju vrijednost tokena koju je poslao korisniku. Primjer ovako generirane forme prikazan je u nastavku: | ||
+ | |||
+ | < | ||
+ | <form action=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | | ||
+ | <input type=" | ||
+ | |||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Klikom na gumb " | ||
+ | |||
+ | === Prevencija korištenjem | ||
+ | |||
+ | Ovom metodom poslužitelj u klijentu zapisuje dodatni parametar u kolačić, primjerice '' | ||
+ | |||
+ | |||
+ | ==== Zaključak ==== | ||
+ | |||
+ | CSRF napadi vrlo su opasni jer ih je u nekim slučajevima moguće izvesti a da žrtva toga nije svjesna. Radi svestranih primjena HTML formi u različite svrhe, poslijedice napada mogu biti od velikog utjecaja za žrtvu. Na sreću, CSRF napadi otkriveni su rano, a iako ranjivosti koje napadi zloupotrebljavaju nije moguće eliminirati, | ||
+ | |||
+ | |||
+ | |||
+ | ==== Literatura ==== | ||
+ | |||
+ | [1] [[ https:// | ||
+ | |||
+ | [2] [[https:// | ||
+ | |||
+ | [3] [[https:// | ||
+ | |||
+ | ==== Izvori slika ==== | ||
+ | |||
+ | Sve slike preuzete su iz knjige [1]. | ||
- | ===== Literatura ===== |