Domov arrow 6. VARNOST arrow 6.3 Varnost spletnega mesta arrow 6.3.3 Ponarejanje zahtev med spletnimi mesti (ang. cross-site request forgeries - CSRF)


6.3.3 Ponarejanje zahtev med spletnimi mesti (ang. cross-site request forgeries - CSRF) Natisni E-pošta
CSRF je napad, ki povzroči žrtvi, ne da bi žrtev za to vedela, da pošlje neke http zahteve URL-jem. Zahteve se običajno pošljejo URL-jem,  ki imajo zaprt dostop in uporabljajo obstoječe seje žrtve za vstop. HTTP zahteva nato povzroči žrtvi, da izvede posebno dejanje, ki temelji na njeni stopnji pravic, kot je nakup v spletni trgovini ali spreminjanje in odstranjevanje informacij.

Medtem ko XSS napad izkorišča uporabnikovo zaupanje v aplikacijo, ponarejene zahteve izkoriščajo zaupanje aplikacije v uporabnika, ker zahteva izgleda upravičena in aplikacija težko določa, če jo je uporabnik res nameraval izvesti. S pravilnim ubežanjem izhoda lahko preprečiš, da je tvoja aplikacija uporabljena kot vozilo za CSRF napad, ne moreš pa preprečiti samih CSRF zahtev. Tako aplikacija potrebuje zmožnost določanja, če je bila zahteva namenska in upravičena ali je bila ponarejena in škodljiva.

Kako se zgodi tak napad? Npr. da imamo spletno stran, na kateri se nek uporabnik registrira in dobi uporabniški račun. Nato brska po katalogu knjig. Predvidevajmo tudi, da se tudi škodljiv uporabnik registrira in gre skozi postopek nakupa knjige na strani. Spotoma opazi naslednje:
-    za nakup se mora prijaviti,
-    po izbiri knjige za nakup, klikne na gumb za nakup, ki ga preusmeri do strani na_blagajno.php,
-    vidi, da je metoda pošiljanja podatkov do na_blagajno.php-ja POST in se sprašuje, če bi pošiljanje parametrov skozi poizvedbeni niz (GET) delovalo,
-    ko pošlje isti obrazec skozi poizvedbeni niz (npr. na_blagajno.php?id=3242457345&kol=1), ugotovi, da je uspešno kupil knjigo.

S tem znanjem lahko škodljiv uporabnik pripravi druge uporabnike k nakupu brez njihovega vedenja. Najlažji način za dosego tega je uporaba značke za vključevanje slike na neki poljubni spletni strani. V naslednjem primeru src od img značke naredi zahtevo, ko se stran naloži:

<img src=http://primer.si/na_blagajno.php?id=3242457345&kol=1 />

Čeprav je img značka vključena na drugo spletno mesto, še vedno nadaljuje z zahtevami do spletnega mesta s trgovino. Za večino ljudi bo ta zahteva padla, ker morajo biti uporabniki prijavljeni, če želijo kupiti knjige. Za tiste uporabnike, ki pa bodo prijavljeni (skozi piškotek ali aktivno sejo), bo ta napad izkoristil zaupanje spletnega mesta v tega uporabnika in jim bo povzročil, da bodo kupili izdelek. Rešitev za ta napad je enostavna: uveljavi uporabo POST namesto GET. Ta napad deluje, ker na_blagajno.php uporablja $_REQUEST superglobalno polje, da dostopa do vrednosti id in kol. Uporaba $_POST bo zmanjšala tveganje za takšen tip napada, toda ne bo zaščitila pred vsemi lažnimi zahtevami.

Drugi, bolj napredni napadi lahko naredijo tudi POST zahteve, toda enostavna metoda žetona (ang. token) lahko ustavi take poskuse in prisili uporabnike, da uporabljajo tvoj obrazec. Metoda žetona vključuje uporabo naključno ustvarjenega žetona, ki je shranjen v uporabnikovi seji, ko uporabnik dostopa do strani z obrazcem in je poleg tega žeton postavljen tudi v skrito polje obrazca. Postopkovni skript preveri vrednost žetona, ki je poslan, s tistim, ki je v uporabnikovi seji. Če se ujemata, je zahteva veljavna. Če se žetona ne ujemata, skripta javi napako uporabniku. Naslednji skupek kode prikazuje uporabo tega načina:

<?php
session_start();
$zeton = md5(uniqid(rand(), TRUE));
$SESSION[’zeton’] = $zeton;
?>
<form action="na_blagajno.php" method="post">
<input type="hidden" name="zeton" value="<php? echo $zeton; ?>" />
<!-- ostanek obrazca -->
</form>

Skripta checkout.php pa nato lahko preveri žeton:

if (isset($_SESSION[’zeton’]) && isset($_POST[’zeton’]) && $_POST[’zeton’] == $_SESSION[’zeton’])
{
// žeton je veljaven, nadaljuj z obdelavo obrazca
}

 


© 2007-2008 PHP, MySQL, XML, OOP, varnost