Testovanie CSRF zraniteľnosti: Webové formuláre aj REST API

CSRF môže ovplyvniť aj moderné REST API aplikácie. V tomto článku ti ukážem, ako zraniteľnosť otestovať, aj ako sa jej brániť.

Testovanie CSRF zraniteľnosti: Webové formuláre aj REST API
Photo by Caspar Camille Rubin / Unsplash

Úvod

CSRF (Cross-Site Request Forgery) je zraniteľnosť, ktorá umožňuje útočníkovi vykonať akciu v mene prihláseného používateľa – bez jeho vedomia. Typicky sa to deje cez škodlivý odkaz alebo iframe, ktorý spustí požiadavku na server, kde je používateľ prihlásený.

Princíp útoku

Útočník odošle požiadavku cez HTML prvok (napr. <img> alebo <form>), prehliadač priloží session cookie – a server si myslí, že požiadavka je legitímna.

Krok za krokom: Testovanie cez Burp Suite alebo Caido

  1. Presmeruj prehliadač cez proxy (Burp alebo Caido)
  2. Sprav akciu v aplikácii (napr. zmeň heslo)
  3. Odošli požiadavku do Repeateru
  4. Sleduj, či obsahuje CSRF token – v tele alebo hlavičke
  5. Odstráň token, pošli požiadavku znova – ak prejde, appka je náchylná

Vytvorenie exploit stránky

<form action="https://example.com/zmena-hesla" method="POST">
  <input type="hidden" name="heslo" value="hacked123">
  <input type="submit">
</form>
<script>document.forms[0].submit();</script>

Ak stránka spracuje požiadavku aj bez overenia tokenu – si zraniteľný.

Testovanie REST API: CSRF stále hrozí

Mnohé REST API aplikácie (napr. SPA v Reacte) používajú cookie-based autentifikáciu. Prehliadač automaticky priloží cookie aj pri útoku z inej domény, čo znamená: CSRF je stále reálne riziko.

Ako testovať:

  • Skontroluj, či sa API autentifikuje cez sessionid cookie
  • Skús odoslať požiadavku z cudzích stránok cez formulár
  • Sleduj, či API kontroluje Origin alebo Referer, alebo vyžaduje CSRF token

Ochrana pred CSRF

  • Overuj Origin a Referer hlavičku
  • Používaj CSRF tokeny (generované a overované serverom)
  • V REST API používaj JWT v hlavičke, nie cookie
  • Pridaj hlavičku X-Requested-With na strane klienta
  • Nastav SameSite atribút pri cookies

SameSite=Strict znamená, že cookie sa nepošle pri žiadnej požiadavke mimo aktuálnej domény. Znie to skvele – ale má háčik.

Príklad:

Používateľ je prihlásený v appke. Klikne na odkaz z e-mailu a dostane sa späť na appku. Ak máš cookie s SameSite=Strict, prehliadač ju nepošle. Používateľ bude odhlásený alebo uvidí chybu.

Prehľad:

SameSiteUXBezpečnosť
Strict❌ Slabšie UX (odhlasovanie pri návrate)✅ Najvyššia
Lax✅ Dobré⚠️ Nechráni POST požiadavky
None + Secure✅ Úplné⚠️ Nutná ochrana tokenmi

Záver

CSRF nie je minulosť – stále sa vyskytuje v slabších implementáciách REST API, v aplikáciách bez tokenov či v microservisných systémoch, ktoré používajú cookies. Ochrana je pritom relatívne jednoduchá a existuje niekoľko overených prístupov.

V ďalšom článku sa pozrieme na CSRF ochranu v konkrétnych frameworkoch (Express.js, Django, Laravel).