Author: MDT | Added:7.5.2007 18:43 | Last update: 10.5.2007 00:00 | Readed: 3489x
Cross-Site Request Forgery neboli CSRF (XSRF) je vá?nou bezpečnostní chybou webových aplikací, která ale není je?tě tak známá jako například SQL injection, PHP injection nebo XSS, a proto nalezneme mnoho webů náchylných na tuto chybu. CSRF je často díky svým principům označováno jako webový trojský kůň, proto?e provádí nějakou skrytou zlomyslnou činnost v pozadí jménem nějakého u?ivatele (který o ničem neví). Jak u? název vypovídá, jde o zfal?ování HTTP po?adavku (dotazu).
Nejlépe si v?e předvedeme na příkladu: Příhlásíte se na nějakou stránku aprojí?díte tamní fórum a tu narazíte na nějaký odkaz, který tam vlo?il nějaký u?ivatel, pod dojmem, ?e tam najdete třeba pěkný obrazek nebo bůhví co. Vy na odkaz kliknete a on se vám skutečně uká?e nějaký pěkný obrázek, ale v pozadí proběhne zlomyslný script, který například odhlasuje v nějaké anketě, ale co je hor?í, mů?e vám pozměnit například různá data v registraci apod., proto?e jste vlastně pořád přihlá?en na tu stránku (prostřednictvím cookies, sessions apod.) a server si myslí, ?e jste to vy, kdo si chce změnit údaje v registraci (proto?e vy jste klepli na ten odkaz, ne útočník), ne ?e vám je někdo jiný tajně mění. Jediné, co útočník potřebuje znát, je stavba daného formuláře a to není problém zjistit. Říkáte si, ?e na takové odkazy radějí neklikáte, tak?e se vás to netýká? Omyl. Pokud někdo vlo?í adresu skriptu do tagu img, máte smůlu - nemusíte na nic klikat a script se automaticky provede. Celkem děsivé ne? Teď si uká?eme, jak na to.
Na nějaké fórum vlo?íte obrázek tímto způsobem (místo URL na obrázek vlo?íte URL scriptu, co? opravdu lze, jen se zobrazí typický kří?ek při nenalezení obrázku a pokud pou?ijete javascript, tak mů?ete normálně zobrazit skutečný obrázek a je?tě vlo?it script, dal?ím ře?ením je dát obrazku nulové rozměry, tak?e nic nepujde vidět):
A na stránce page.html budete mít například podobný kód (kde struktura formuláře bude okopírovaná podle skutečného formuláře na změnu registrace na dané stránce):
Timto kódem změníme email oběti na email útočníka a ten si tam pak mů?e nechat například přeposlat "zapomenuté" heslo (nebo rovnou heslo změnit, kdy? stránka nekontroluje staré heslo), přičem? obě? si ničeho nev?imne. Jediné, co je zapotřebí je, aby obě? byla příhlá?ena na daném webu, na kterém je "obrázek" zobrazen (a vzhledem k tomu, ?e vět?ina webu nabízí trvalé přihlá?ení a u?ivatelé toho hojně vyu?ívají to opravdu není problém). Je?tě hor?í je to v případě banky - útočník tak mů?e operovat s va?imi penězi. Sice se mu asi nepodaří umístit nějaký obrázek na stránky internetbankingu dané banky, ale mů?e vám poslat zfal?ovaný email tvářící se jako od dané bánky (trocha sociálního in?enýrství) s obsahem typu:
Do?lo k náhlým problémum blablabla... K vyře?ení problému se prosím přihla?te na vá? účet a klikněte na tento odkaz: http://www.banka.cz@167772161/kontrola.php
Normální u?ivatel neví, ?e znak @ přepojí stránku na 167772161, co? je zakódovaná IP adresa serveru, kde se nachází soubor kontrola.php se ?kodlivým kódem (167772161 je konkretně 10.0.0.1), přihlásí se, klikne a je v háji. Spousta stránek před změnou dat, popřípadě odeslání nějakého po?adavku, je?tě obsahuje potvrzení, jestli dotýčný člověk opravdu tuto akci chce provést. To ale není pro útočníka ?ádný problem, ten jenom stránku se ?kodlivým kódem rozděli framama na dvě a do jednoho framu dá ?kodlivý kód na odeslání a do druhé framu na jeho potvrzení. Framy pou?ijete například i kdy? chcete skrýt stránku o "úspě?ném převodu peněz" nebo o "úspě?ném zahlasování do ankety" aby dotyčný nepojal nějaké podezdření. Stačí kdy? jeden frame s takovýmto výpisem udělaté o nulové velikost a nepujde vidět a do druhého frámu o 100% velikosti dáte nějakou fale?nou stránku, aby obě? nepojala ?ádné podezdření.
Jak se bránít? Není to tak lehké, způsobů je víc, npříklad kontrola hlavičky Referer, pou?ití autorizačního tokenu (lístkový systém) atd., ale ka?dý má své mouchy... Více se o těchto metodách obrany dozvíte zde.
Tak to je pro dne?ek v?echno a pří?tě třeba něco o SQL Injection.
-------------------------------------------------------------------------------------------------------------------------