🕷️ Zabezpečení webových aplikací (OWASP)

Nevěř vstupu

O čem to je

E-shop, školní systém, internetové bankovnictví – všechno jsou webové aplikace. Přijímají data od kohokoli na internetu. Stačí, aby programátor jednou zapomněl, že vstup může poslat útočník, a ten ovládne databázi nebo účty ostatních uživatelů.

Zlaté pravidlo celého tématu: nikdy nevěř vstupu od uživatele.

Nové pojmy

Webová aplikaceProgram, který běží na serveru a uživatel ho ovládá přes prohlížeč. Data obvykle ukládá do databáze.Elektronická žákovská knížka.
VstupCokoli, co do aplikace přijde zvenku: pole formuláře, parametry v URL, cookies, hlavičky požadavku, nahrané soubory.?hledat=boty v adrese e-shopu.
SQLJazyk, kterým aplikace mluví s databází: hledá, vkládá, mění a maže záznamy.SELECT * FROM uzivatele WHERE jmeno = 'eva'
OWASP a OWASP Top 10OWASP je nezisková komunita pro bezpečnost webových aplikací. Její Top 10 je žebříček nejzávažnějších druhů zranitelností webů, který se aktualizuje po několika letech.Ve vydání 2021 je na 1. místě chybné řízení přístupu, na 3. místě injection (včetně XSS).

Injection: když se data stanou příkazem

SQL injectionÚtočník vloží do vstupu kus SQL. Aplikace ho slepí s vlastním dotazem a databáze ho provede jako příkaz.Do pole jméno napíše ' OR '1'='1.
Aplikace skládá dotaz: "SELECT * FROM uzivatele WHERE jmeno = '" + jmeno + "' AND heslo = '" + heslo + "'". Co se stane, když útočník do jména napíše admin' --?
Vznikne SELECT * FROM uzivatele WHERE jmeno = 'admin' --' AND heslo = '…'. Znaky -- v SQL začínají komentář, takže kontrola hesla zmizí a útočník se přihlásí jako admin. Oprava: parametrizovaný dotaz, např. WHERE jmeno = ? AND heslo_hash = ?, kde data databáze nikdy neprovede jako příkaz.

XSS: cizí skript na tvé stránce

XSS (Cross-Site Scripting)Útočník dostane do stránky vlastní JavaScript, který se pak spustí v prohlížeči jiných uživatelů. Může jim ukrást přihlášení nebo dělat akce jejich jménem.Komentář <script>…</script> uložený v diskusi se spustí každému, kdo ji otevře.
Escapování výstupuPřevedení znaků se zvláštním významem v HTML na neškodné zápisy (< na &lt;, > na &gt;, " na &quot;). Prohlížeč je pak zobrazí jako text, nespustí je.Komentář se zobrazí jako text „<script>…“, ale neprovede se.
Diskuse ukládá komentáře a vypisuje je přes innerHTML. Jak útok funguje a jak ho opravit?
Útočník uloží komentář se skriptem (uložené XSS). Každý návštěvník ho dostane do stránky a jeho prohlížeč skript spustí. Oprava: výstup escapovat podle kontextu (šablonovací systém to dělá automaticky), v JS používat textContent místo innerHTML a navíc nastavit Content Security Policy, která zakáže nepovolené skripty.

Roztřiď příklady a obrany k útoku, kam patří. Pamatuj: SQL injection míří na databázi, XSS na prohlížeče ostatních.

✗Do formuláře jsem dal JavaScriptovou kontrolu, takže nebezpečné znaky na server nepřijdou.
✓Kontrolu musí udělat server. Útočník pošle požadavek přímo, mimo formulář, a kontrolu v prohlížeči obejde.

Vše, co běží v prohlížeči, má útočník pod kontrolou. Kontrola v prohlížeči je jen pohodlí pro poctivé uživatele.

Nikdy nevěř vstupu. Proti SQL injection pomáhají parametrizované dotazy, proti XSS escapování výstupu, textContent a Content Security Policy. Přehled nejčastějších chyb dává OWASP Top 10.

Kontrolní seznam

O čem to je

Máš zkontrolovat aplikaci, kterou napsal spolužák, než ji škola nasadí. Kde začít? Pomůže přehled nejčastějších chyb a ke každé jedno hlavní opatření.

Nové pojmy

ZranitelnostPřipomenutí: slabé místo, které může útočník využít ke škodě.Chybějící kontrola oprávnění v aplikaci.
OWASP Top 10Žebříček nejzávažnějších druhů zranitelností webových aplikací od komunity OWASP. Slouží jako kontrolní seznam pro vývojáře a testery.Vydání 2021 vede chybné řízení přístupu (Broken Access Control).
Autentizace a autorizacePřipomenutí: autentizace ověří, kdo jsi; autorizace rozhodne, co smíš.Přihlásíš se jako žák (autentizace) a smíš vidět jen své známky (autorizace).
Session a cookiePo přihlášení server vytvoří session (relaci) a prohlížeči pošle její identifikátor v cookie. Prohlížeč ho pak posílá s každým požadavkem; kdo ho ukradne, vydává se za uživatele.Cookie session=8f2a… s příznaky HttpOnly; Secure; SameSite=Lax.

Hlavní chyby a obrana

ChybaPříkladHlavní obrana
chybné řízení přístupuzměním v URL /znamky?zak=1024 na 1025 a vidím cizí známkykontrola oprávnění na serveru u každého požadavku
injection (SQL, příkazy OS)' OR '1'='1 v přihlášeníparametrizované dotazy, validace vstupu
XSSskript v komentářiescapování výstupu, Content Security Policy
slabá autentizaceneomezený počet pokusů o hesloMFA, omezení pokusů, bezpečné ukládání hesel (hash se solí)
chybná konfiguracezapnutý ladicí výpis chyb na produkci, výchozí heslo adminazabezpečená výchozí konfigurace, revize nastavení
zastaralé komponentyknihovna se známou zranitelnostíaktualizace, sledování závislostí
CSRFcizí web odešle formulář tvým jménem, když jsi přihlášenýCSRF tokeny, cookie SameSite
Najdi všechny vstupy aplikace (formuláře, URL, cookies, API, nahrávání souborů).
U každého ověř validaci na serveru (typ, délka, povolené hodnoty).
Zkontroluj, že dotazy do databáze jsou parametrizované.
Zkontroluj, že výstup do HTML se escapuje.
U každé stránky a akce ověř oprávnění: smí to tento uživatel?
Zkontroluj přihlašování: hashovaná hesla, omezení pokusů, MFA, bezpečné cookies.
Zkontroluj konfiguraci a verze knihoven.
Nálezy sepiš s prioritou a doporučenou opravou.
V aplikaci je odkaz /faktura?id=5521. Přihlášený zákazník změní číslo na 5522 a uvidí cizí fakturu. Jaká je to chyba a jak ji opravit?
Chybné řízení přístupu (konkrétně tzv. IDOR, přímý odkaz na cizí objekt). Server ověřil, kdo uživatel je, ale ne, zda smí vidět fakturu 5522. Oprava: u každého požadavku na serveru ověřit, že faktura patří přihlášenému zákazníkovi; jinak vrátit 403 nebo 404.
Proč má cookie se session mít příznaky HttpOnly, Secure a SameSite?
HttpOnly – JavaScript na stránce cookie nepřečte, takže ji případné XSS hůř ukradne. Secure – pošle se jen přes HTTPS. SameSite – prohlížeč ji nepošle s většinou požadavků z cizích webů, což brání CSRF.
  • Kde musí být validace vstupu? – Na serveru (v prohlížeči jen navíc pro pohodlí).
  • Obrana proti SQL injection? – Parametrizované dotazy.
  • Obrana proti XSS? – Escapování výstupu, textContent, Content Security Policy.
  • Obrana proti CSRF? – CSRF token, cookie SameSite.
  • Uživatel změní id v URL a vidí cizí data? – Chybné řízení přístupu – chybí kontrola oprávnění na serveru.

Zkus odpověď říct dřív, než kartu otočíš.

✗Odkaz na administraci jsem z menu odstranil, takže se tam běžný uživatel nedostane.
✓Server musí u adresy /admin ověřit, že je uživatel administrátor. Skrytý odkaz nic nechrání.

Útočník adresu uhodne nebo najde v kódu stránky. Bezpečnost nesmí stát na tom, že něco není vidět.

Kontroluj vstupy na serveru, používej parametrizované dotazy, escapuj výstup, u každého požadavku ověřuj oprávnění, chraň přihlášení a session cookies, udržuj konfiguraci a knihovny. Kontrolním seznamem je OWASP Top 10.