OWASP Top 10
Co je OWASP?
OWASP (Open Web Application Security Project) je komunita, která mapuje zranitelnosti webových aplikací a vytváří otevřené bezpečnostní standardy. V této kapitole si ukážeme v zjednodušené podobě tzv. OWASP Top 10 list, který obsahuje 10 nejčastějších zranitelností ve webových aplikacích.
A01:2021-Broken Access Control
Access Control neboli řízení přístupu zajišťuje, že uživatelé nemohou konat mimo jejich definované oprávnění. Například že se nepřihlásíme na cizí účet bez znalosti hesla. Pokud tyto pravidla nejsou správně implementována, může docházet k úniku dat, neoprávněným úpravám nebo smazáním dat apod. Mezi nejčastější zranitelnosti v této kategorii patří:
Ve výchozím nastavení nejsou oprávnění zamítnuta, tedy všichni uživatelé, i neoprávnění mají plná oprávnění
Možnost obejít daná oprávnění za pomocí úpravy URL, HTML nebo manipulace s aplikací
Možnost přístupu k cizímu účtu bez autorizace
API bez vymezených oprávnění pro metody
POST, PUT, DELETE
EoP - Elevation of privilege, zvýšení oprávnění
Možnost přistupovat na stránky vyžadující zvýšená oprávnění, bez těchto oprávnění při znalosti přímé cesty
Manipulace s JWT nebo cookie
Jak se bránit?
Kromě veřejných zdrojů zamítnout ve výchozím nastavení přístup
Každý zdroj by měl mít svého vlastníka
Politika řízení přístupu by měla být implementována jednou a poté používána napříč aplikací
Všechny incidenty logovat, aby se mohly případné chyby rychle identifikovat a odstranit
Invalidovat session po odhlášení
Příklady
Scénář #1
Například máme uživatelský panel na stránce /panel
a pro administrátora /adminpanel
, pokud ale náš administrátorský panel neověřuje oprávnění uživatele, může útočník jednoduše navštívit /adminpanel
a získá přístup k celému systému.
Scénář #2
Aplikace používá neověřený parametr acct
při přístupu na uživatelský účet. Pokud útočník jednoduše tento parametr změní, může získat přístup k jakémukoliv účtu. Například pomocí této URL může získat přístup k účtu administrátora.
https://nasestranka.cz/app/accountInfo?acct=admin
A02:2021-Cryptographic Failures
V této kategorii se nachází zranitelnosti, které souvisí s bezpečností ukládání a přenosu dat. Při přenosu a ukládání důvěrných dat jako hesla, čísla kreditních karet apod. je nutné tyto data šifrovat a také zvolit správný šifrovací standard pro danou úroveň důvěrnosti. Mezi nejčastější zranitelnosti v této kategorii patří:
Důvěrná data uložená nezašifrovaná
Využívání zastaralých šifrovacích standardů
Nevynucování šifrování
Neověřování certifikátů
Špatná implementace šifrování
Jak se bránit?
Identifikujte důvěrná data a ty šifrujte
Ukládejte důvěrná data pouze nezbytně dlouhou dobu
Nepoužívejte nešifrované protokoly jako HTTP, FTP apod. pro přenos důvěrných dat
Hesla ukládejte zahashovaná silnými standardy
Nepoužívejte zastaralé šifrovací standardy
A03:2021-Injection
V této kategorii nalezneme zranitelnosti, ve kterých je možné manipulovat s webovou aplikací za pomocí neošetřených uživatelských vstupů. Patří sem například SQL injection, OS command injection, Cross-site scripting (XSS) a další mnohé druhy injection.
Jak se bránit?
Nikdy nevěřte uživatelskému vstupu, pro každý uživatelský vstup je nutné zvolit správnou metodu ošetření daného vstupu.
SQL injection
SQL injection je druh útoku napadení SQL databáze vsunutím kódu do neošetřeného vstupu a vykonání vlastní akce na databázi (např. DELETE, ALTER apod.)
Například takto může vypadat zranitelná část kódu
SELECT * FROM uzivatele WHERE jmeno = '" + zadaneJmeno + "';
Pokud uživatel zadá svoje jméno, v databázi se normálně vybere daný uživatel. Pokud však například zadá nějakou podmínku, třeba ' or '1'='1
podmínka bude splněna vždy a vypíšou se všichni uživatelé v tabulce.
OS command injection
Jedná se o identický princip jako u SQL injection, akorát místo změny SQL příkazu, injection upravuje příkaz terminálu. K tomu se využívají například znaky | &
apod.
Cross-site scripting (XSS)
Cross-site scripting (XSS) je zranitelnost založena na možnosti vsunout do dynamické webové stránky vlastní skript pomocí neošetřeného uživatelského vstupu. Díky tomu můžeme ovlivnit chod webové stránky, ale i například krást citlivá data jako například session cookies dalších uživatelů.
Typy XSS
Non-persistent (reflected)
Tento typ XSS je založen na úpravě části URL, která se interpretuje do stránky jako její součást. Naše příkladová stránka poskytuje vyhledávání za pomocí parametru ?q
, při vyhledání se vyhledané heslo ukáže na stránce. Naše stránka nemá žádnou orchanu a tím pádem můžeme tento vstup využít, jelikož se skript do stránky umístí stejně jako vyhledané heslo. Naše URL by pak mohla vypadat například takto:
https://nasestranka.cz/priklad.html?q=Test<script>alert(‘Úspěšné XSS’);</script>
Persistent
V tomto případě se uživatelský vstup ukládá na stránku dlouhodobě, například jako komentáře v diskusích na novinkách. Toho opět můžeme využít pro naše XSS, pokud do nezabezpečené stránky umístíme například tento komentář:
Náš úžasný komentář<script>alert(‘Úspěšné XSS’);</script>
Tím přidáme do stránky nejen komentář, ale i skript, který se spustí pokaždé, když si někdo danou diskusi otevře.
DOM based
Tento typ XSS je specifický tím, že funguje kompletně na straně klienta. Je velmi podobný reflected XSS, ale kód je reflektovaný v JavaScriptu umístěného na stránce.
A04:2021-Insecure Design
Tato kategorie popisuje zranitelnosti týkající se samotné architektury aplikace. Například, že eshop dovoluje masivní skupování grafických karet za pomocí robotů což může značně poškodit jméno firmy.
A05:2021-Security Misconfiguration
Do této kategorie se řadí zranitelnosti způsobené špatnou konfigurací. Nejčastěji se jedná o:
Zbytečně otevřené porty
Povolené/nainstalované nepoužívané služby
Nezměněná výchozí hesla
Zobrazování příliš informativní znění chyb uživateli
Při vylepšení infrastruktury nejsou použity nejnovější bezpečností funkce
Bezpečnostní funkce nejsou povoleny nebo nejsou správně nastaveny
Jak se bránit?
Instalujte pouze nezbytně nutné komponenty
Pravidelně auditujte nastavení týkající se bezpečnosti aplikace
A06:2021-Vulnerable and Outdated Components
Jak název napovídá, tato kategorie obsahuje zranitelnosti týkající se neaktualizovaných komponent, nebo komponent se známými chybami. Naše aplikace je pravděpodobně zranitelná, pokud:
Neznáme verze komponent použitých v aplikaci
Víme, že používáme zranitelnou, neaktualizovanou komponentu nebo komponentu s ukončenou podporou
Aplikaci pravidelně neskenujeme pro zranitelnosti
Jak se bránit?
Odstraňte nepotřebné závislosti, funkce, komponenty, soubory a dokumentaci
Mějte přehled o instalovaných komponentech
Komponenty získávejte pouze z ověřených zdrojů
Monitorujte komponenty pro zranitelnosti, obzvlášť ty, které nejsou již podporovány
A07:2021-Identification and Authentication Failures
Zde nalezneme zranitelnosti týkající se ověřování identity uživatele. Aplikace je zranitelná pokud:
Dovoluje automatické zkoušení hesel nebo prolamování hesel hrubou silou
Dovoluje používání slabých hesel (např. admin, heslo apod.)
Používá slabé metody resetování přihlašovacích údajů (např. pomocí bezpečností otázky)
Nepoužívá vůbec nebo používá slabé dvoufázové ověření
Ukládá hesla nehashovaná nebo slabě hashovaná
Špatně nakládá se sessions (Neinvaliduje se při odhlášení, používá se vícekrát, je součástí URL)
Jak se bránit?
Kde je to možné používejte multifázové ověření
Nepoužívejte výchozí hesla
Používejte kontroly pro slabá hesla
Limitujte počet neplatných pokusů při přihlašování
Používejte bezpečný správce sessions
A08:2021-Software and Data Integrity Failures
Tato kategorie obsahuje zranitelnosti způsobené porušením datové nebo software integrity. Je to především důsledkem neověřování digitálních podpisů, používání neověřených zdrojů nebo nedostatečné či chybějící procesy kontroly software.
Jak se bránit?
Používejte digitální podpisy nebo podobné mechaniky pro ověření integrity software a dat.
Zkontrolujte, že používáte důvěryhodné zdroje
Používejte procesy pro kontrolu integrity software ve vývoji
A09:2021-Security Logging and Monitoring Failures
Zde nalezneme zranitelnosti způsobené nedostatečným nebo chybějícím monitoringem a logováním. Mezi nedostatečné řadíme:
Události důležité pro bezpečnostní audit nejsou logovány
Záznamy nejsou dostatečně podrobné nebo dostatečně jasné
Aplikace a API nejsou monitorovány pro podezřelé aktivity
Pro důležité události nejsou nastaveny upozornění
Aplikace nedokáže detekovat útoky v reálném čase
Jak se bránit?
Logujte všechny přihlášení, přístupy a ověřování vstupů
Logujte v jednotném srozumitelném formátu
Na důležité akce nastavte upozornění
Zajistěte, aby důležité akce byly auditovatelné
A10:2021-Server-Side Request Forgery
Tato zranitelnost nastává když aplikace načítá externí zdroj a nevaliduje URL zadanou uživatelem. To dovoluje útočníkovi donutit aplikaci odeslat neočekávaný požadavek, i přesto, že je chráněna pomocí firewallu nebo pomocí jiného ACL (Access control list, seznam pro řízení přístupu).