Jak předejít útokům?

  • myslet na bezpečnost při návrhu
  • detekování hrozeb: logovat a sledovat logy
  • je potřeba zabezpečit všechny kanály (síť, hostitel, aplikace…)
  • dvakrát myslet na ošetření vstupu od uživatele

útok - je skutečná akce, že někdo přijde a provede útok zranitelnost - chyba v aplikaci, která je předpokladem pro hrozbu

OWASP Foundation zveřejňuje statistiky o nejčastějších útocích na webové aplikace

  • je tam hodně článků, které se věnují zabezpečení

SQL Injection

  • útočník může zjistit celou architekturu aplikace (hlavně databáze) - podle chyb, které DB vyhazuje
  • může získat nebo poškodit důležitá data (smazat tabulky)
  • ochrana
    • validovat vstupy od uživatele, kontrolovat dat. typy, escapovat správně
    • nejlépe používat předpřipravené dotazy (viz níže)

V php.ini je nastavení i o tom, jak se mají zobrazovat chyby - pro vývojáře jsou důležité podrobné informace, pro produkci nikoliv

Přepřipravené dotazy - pošle se dotaz se zástupnými znaky a pak až se pošlou data (které si tam pak ten DATABÁZOVÝ server escapuje a dosadí)

  • do zkoušky: tohle je ta nejlepší metoda, jak to udělat :))

Remote code execution

  • většinou u dynamicky typovaných jazyků
  • lze u nich spustit kód, který je ve stringu (např. funkce eval())
    • není problém ji použít, ale ne na vstupy od uživatele
  • u příkladu je častý způsob, jak zapisovat použití controlleru tak před 10 lety
    • hledání správných souborů pro include přes $GET
    • tedy přidávání knihoven za běhu (pomocí include nebo require)
  • také pozor na použití procesů (exec(), pcntl_open())
  • ochrana
    • neumožnit uživateli spouštět jeho kód
    • pokud je to nutné, tak vybrat seznam možností spuštění a nenechat ho spouštět cokoliv

Cross-Site Scripting (XSS)

  • vkládání škodlivého skriptu do aplikace, což se pak ostatním uživatelům spustí, může jim to něco (ne)zobrazit, změnit, upravit, smazat apod.
  • vkládání škodlivého JS skriptu do proměnné, která se pak zobrazí (tím pádem i spustí)
  • druh Javascript injection
  • dočasné chyby
    • většinou součástí URL, Cookie
    • ohrozí jen konkrétního uživatele
    • podvodný odkaz je na validní stránku, ale v query parametru se nachází něco, co se někam vloží (např. do vyhledávání apod.)
  • perzistentní chyby
    • uloží se do databáze a tím může ohrožovat všechny uživatele systému
  • je potřeba neošetřovat jenom vstupy, ale i výstupy (abych nezobrazil, co nechci - nějaké citlivé informace)
    • ten skript totiž může zobrazit ostatním uživatelům něco, co já nechci
    • nepoužívat echo, ale Twig apod.
  • zakázat vykonávání skriptů

CSRF

  • Cross-Site Request Forgery
  • využívá stránky, na kterých jsem přihlášený - aplikace nám věří, že jsme tím, za koho se vydáváme
    • nutí nás provést nežádoucí akce na skutečné aplikaci, kde jsme přihlášení
  • dobrá kombinace s XSS (problém i s POST metodou)
    • můžu tam místo odkazu URL dát fetch
  • server má CSRF token v session
  • je nutné, aby platil jenom omezenou dobu, např. 5min
    • problém, když nějaký formulář vyplňují uživatelé hodinu
    • pak 1. část je bez CSRF tokenu a pak např. shrnutí a jednoduché odeslání už s CSRF tokenem
  • Referer = v hlavičce, obsahuje předchozí stránku, ze které jsme přišli
    • se hodí na debug 404 - můžu se podívat, kde mám třeba nevalidní odkaz
    • kontrola této hlavičky
  • ochrana pomocí více-faktorového ověření
  • Anti-CSRF tokeny u formulářů
    • jako u prevence vícenásobného submitnutí formuláře

Session stealing

  • problém, když mám špatný session id generátor (nebo také IDčka uživatelů)
  • pozor, když musím mít ID uživatele v URL - tak je lepší použít UUID spíš
  • stealing
    • pomocí XSS JS pošle požadavek na útočníkův server se SessionID v těle
    • útočníkův server dostane SessionID
  • cooking
    • útočník vytvoří a nastaví uživateli konkrétní “session ID” a uživatel je pak nucen tohle ID používat (to samozřejmě zná i útočník)
  • ochrana
    • dlouhé náhodné hodnoty
    • obnovovat session ID pravidelně
    • pokud server SessionID nemá, zamítne a vygeneruje svoje vlastní
      • akceptovat hodnoty pouze vygenerované serverem
    • pokud není šifrovaná komunikace útok man in the middle
    • pomocí HTTPS je potřeba zabezpečit celý web (ne jenom přihlášení a objednávky)
      • protože na HTTP stránkách už se sice neposílají údaje, ale SessionID pořád
    • hlavička Referer, IP adresa, User-Agent, nonce kontrolovat

Replay attack

  • jakmile zjistím, že nějaký požadavek je validní, tak ho opakuji
  • vím, že trvá dlouho (potřebuje více zdrojů) DoS
    • firewall - detekce DDoS útoků

Sociální inženýrství

  • nejslabší článek je uživatel a na toho tyhle útoky cílí
  • nějaké obalamutění uživatele, aby sdílel citlivé údaje