Cross-Site Request Forgery (zkráceně CSRF, Microsoft používá také označení One-Click attack) je druh útoku na předem známí cíl, u kterého útočník zná, anebo dokáže odhadnout, strukturu a ví jaký požadavek na tuto strukturu zaslat. Nejčastějším cílem jsou rozšířené open source systémy (CMS).
Příklad útoku
Dejme tomu, že máme veřejný open source blog. Útočník jej dokonale zná a ví, že soubor zmenprava.php v adresáři /admin/ obstarává změnu práv jednotlivých uživatelů. Na blogu je registrován jako redaktor s id 666 a právy 5 (může posílat články ke schvalování) a rád by získal práva 1 (administrátor). Pro aktivaci skriptu mu stačí následující požadavek poslaný přes parametr GET:
http://blog.tld/admin/zmenprava.php?id=666&prava=1
Jenomže k aktivaci tohoto příkazu potřebuje být přihlášený jako administrátor, protože pouze on může provádět tento příkaz.
Asi nejjednodušší by bylo poslat administrátorovi html email s odkazem „Klikni zde“, kde bude URL. Ovšem to by bylo poněkud nápadné. Je třeba to udělat chytře a právě zde poslouží obrázek.
<img src="http://blog.tld/admin/zmenprava.php?id=666&prava=1" width="1" height="1" border="0">
Teď už jen stačí, aby administrátor, který bude přihlášen ke svému účtu se dostal na stránku, kde se tento „obrázek“ objeví. Ideální by asi bylo využít kombinaci s XSS. Popřípadě mu poslat email. Mimochodem to je také jeden z důvodů proč emailový klienti automaticky nestahují obrázky.
Jak se útoku CSRF bránit
Dříve se proti Cross-Site Request Forgery doporučovalo používat místo GET metodu POST. Ovšem jak sami uznáte stačí vytvořit něco následujícího:
POST http://blog.tld/admin/zmenprava.php ... Content-Length: 14; id=666&prava=1
Takže rozhodně nemá cenu proti útoku CSRF používat POST.
V současné době se za bezpečné proti tomuto druhu útoků považuje použití takzvaného autorizačního tokenu. Princip je jednoduchý. Při vygenerování stránky kam zadáváte změny do formuláře, se například do session a databáze zapíše náhodně vygenerovaný kód. Po odeslání formuláře skript otestuje zdali sedí kód session s tím v databází (popřípadě místo databáze jej lze vložit přímo do formuláře jako hidden). Tato metoda je dostatečná pro ochranu proti CSRF útokům z venčí.
Mezi další metody obrany patří testování hlavičky referer. Tento druh testu se zároveň hodí i k zjištění odkud útok jde a uložení informací do logu, popřípadě zaslání varování.
Tento článek byl byl přečten 10056 krát