Nejčastější zranitelnosti webových aplikací stručně a jasně

Jen stěží bychom v dnešní době našli společnost, která by neměla vlastní internetové stránky. Často se přitom jedná nejen o statickou webovou prezentaci, ale obsaženy jsou různé dynamické funkcionality pracující s databází, jako je vyhledávání, možnost vkládání komentářů, zaslání zpětné vazby nebo přihlášení uživatele. Běžné jsou i komplexní webové aplikace, obsahující větší množství funkcionalit (např. e-shop nebo internetové bankovnictví). Takové webové aplikace mohou být vyvíjeny na míru potřebám konkrétní společnosti nebo lze využít některé hotové řešení. Při vývoji a nasazení webových aplikací však obvykle není pro vývojáře prioritou bezpečnost. To je častým důvodem úniku dat zákazníků (osobních údajů, hesel apod.). Některé zranitelnosti webových aplikací může útočník za určitých podmínek zneužít i k průniku do interní sítě nebo k získání přístupu do dalších aplikací.

Jak ale zjistit, jestli je webová aplikace, kterou vyvíjíte nebo provozujete dostatečně bezpečná? Co by v ní případný útočník mohl provést a jaká nápravná opatření učinit? Právě na tyto otázky je schopen odpovědět penetrační test zaměřený na testování webových aplikací. Penetrační test je vlastně simulovaný kybernetický útok, který prověří zabezpečení testovaného systému, v daném případě webové aplikace. Testovány mohou být jak aplikace dostupné z internetu, tak provozované v interní síti. Penetrační test se také může lišit podle množství informací, které mají etičtí hackeři k dispozici. Test může probíhat jak z pozice neautentizovaného útočníka, tak z pohledu běžného uživatele. Rovněž může být k dispozici účet s administrátorskými oprávněními k prověření autorizace (tj. ověření toho, zda běžný uživatel nemůže provádět administrátorské akce). Průběh penetračních testů webových aplikací typicky vychází z metodiky OWASP Web Security Testing Guide (aktuální verze 4.1). Organizace OWASP vydala i známý přehled nejčastějších zranitelností webových aplikací (OWASP Top Ten). V tomto článku si představíme některé běžné chyby, se kterými se setkáváme při testování webových aplikací.

SQL injection

Jedná se o poměrně starou zranitelnost, na kterou je však možno narazit i v dnešní době. Při testování se s ní setkáváme nejčastěji u starších aplikací nebo interně vyvíjených webových aplikací v jazyce PHP. Její podstatou jsou nedostatečně ošetřené uživatelské vstupy (typicky POST a GET parametry), které jsou použity při konstrukci SQL dotazu následně provedeného v databázi. Tímto způsobem je útočník schopen pozměnit databázový dotaz a získat tak libovolný uložený záznam. Níže je uveden jednoduchý příklad dotazu, do kterého je místo identifikátoru vložena další část dotazu (tučně):

SELECT name FROM users WHERE id=‘ 0 UNION SELECT password FROM users  – –   

Často bývá detekována v tzv. blind variantě, kdy nedochází přímo k navrácení požadovaného obsahu databáze. Ten je nutno získávat (hádat) po jednotlivých znacích, na základě rozdílných odpovědí serveru (rozdílné chybové stavy nebo doba odpovědi). Jedná se sice o zdlouhavý proces, nicméně je možno jej automatizovat pomocí nástroje SQLmap.

Dopad této zranitelnosti je většinou velmi závažný, neboť na jejím základě je možné získat libovolná data z databáze, mnohdy měnit její obsah nebo dokonce získat vzdálený přístup k příkazovému řádku webového serveru.

Cross-site scripting

Tato zranitelnost je také zapříčiněna neošetřenými uživatelskými vstupy. Hodnoty, které uživatel zadá jsou následně vloženy do obsahu webové stránky. Pokud je tento vstup vhodně naformátován a obsahuje kód v jazyce javascript, dojde k jeho spuštění ve webovém prohlížeči uživatele. Jednoduchý příklad, který se používá při testování a po spuštění kódu zobrazí okno s upozorněním je:

<script>alert(0)</script>

Uvedená zranitelnost může být přítomna ve více variantách. V případě tzv. reflected varianty je spuštěn kód, který je zadán jako součást webové adresy. Tuto zranitelnost je možno zneužít v rámci phishingového útoku, při kterém je uživatelům zaslán odkaz směřující na legitimní doménu, nicméně po otevření tohoto odkazu je vykonána škodlivá akce v rámci webového prohlížeče. Útočník takto může jednoduše získat session cookie a díky tomu se přihlásit do aplikace; může přímo vykonat akce ve webové aplikaci jako jiný uživatel; může získat obsah stránky v aplikaci; zobrazit uživateli výzvu k zadání přihlašovacích údajů nebo jej přesměrovat na vlastní stránky.

V případě stored varianty, která bývá méně častá, je kód uložen na webové stránce a je spuštěn ve webovém prohlížeči každého návštěvníka dané stránky. Útočník tak v tomto případě nepotřebuje zasílat upravenou adresu prostřednictvím phishingového emailu. Obzvláště nebezpečná (ale obtížněji detekovatelná) může být tzv. blind varianta , kdy dojde ke spuštění kódu v prohlížeči jiného uživatele, typicky správce.

Zranitelnosti týkající se autentizace

S přihlašováním do webových aplikací může souviset několik dalších bezpečnostních nedostatků. Mnohdy, obzvláště pak v interní síti, mohou být pro přihlášení do webové aplikace ponechány výchozí přihlašovací údaje (oblíbená kombinace je admin:admin).

Další slabinou přihlašování je, pokud aplikace reaguje rozdílně při zadání neexistujícího uživatelského jména a správného jména s nesprávným heslem. Útočník takto může zjistit větší množství používaných uživatelských jmen a následně se pokusit o hádání hesel.

Za zranitelnost webové aplikace lze považovat i možnost neomezeného zkoušení hesel. Zadávání hesla je totiž možno jednoduše automatizovat a za minutu takto ověřit až tisíce hesel. K dispozici jsou různé seznamy často používaných hesel, případně si může útočník sestavit vlastní seznam. Pokud některý uživatel používá slabé heslo, útočník tak může lehce získat přístup do aplikace.

Chyby v autorizaci

Autorizací se rozumí ověření, zda je uživatel oprávněn provést určitou akci. Pokud se na to při vývoji nemyslelo, může být běžný uživatel schopen provádět akce, které jsou vyhrazené pouze správci aplikace. V některých případech nebývají uživatelská oprávnění ověřována vůbec a některé administrátorské akce může provádět i nepřihlášený uživatel, pokud zná adresu pro provedení. Na webovém serveru se také poměrně často nacházejí různé soubory s potenciálně citlivým obsahem (např. logy nebo konfigurační soubory), které by rovněž neměly být dostupné nepřihlášeným uživatelům.

Poměrně časté jsou i chyby umožňující přístup k informacím dalších uživatelů se stejnou úrovní oprávnění. Typicky toho lze dosáhnout manipulací s hodnotou číselného identifikátoru objektu, např. pokud volání s parametrem userId=69 zobrazuje informace o aktuálně přihlášeném uživateli, při změně číselného identifikátoru mohou být zobrazeny informace o dalších uživatelích.

Path traversal

Jedná se o útok spočívající v možnosti získání souborů z disku webového serveru mimo zamýšleného adresáře prostřednictvím manipulace s názvem souboru, resp. cestou k souboru. Lze uvést jednoduchý příklad – pokud volání download.php?file=dokument.pdf stáhne zadaný dokument, pak download.php?file=../../../../etc/passwd může stáhnout soubor s přehledem uživatelů systému Linux. Tímto způsobem útočník může získat různé konfigurační soubory s hesly, zdrojový kód webové aplikace nebo další soubory s citlivými údaji.

Možnost nahrání libovolného souboru

Pokud webová aplikace umožňuje uživatelům vkládat soubory, mohou s tím souviset další zranitelnosti. Nejhorším případem je, pokud uživatel může nahrát soubor, který je následně spuštěn na straně serveru (např. .php nebo .aspx), což může vést až k ovládnutí serveru útočníkem. Ověřování typu souboru je často realizováno pouze na straně klienta a může být překonáno manipulací s odesílaným požadavkem (requestem).

Na server může být dále nahrán soubor se škodlivým kódem, který je následně stažen a spuštěn jiným uživatelem webové aplikace. Také je možno nahráním velkých souborů způsobit zablokování serveru a nedostupnost webové aplikace pro ostatní uživatele.

Chyby v šifrování

Dnes je standardem, aby webové aplikace komunikovaly prostřednictvím zabezpečeného protokolu HTTPS. V opačném případě dochází k zasílání všech informací (včetně přihlašovacích údajů) v čitelné podobě a mohou být získány případným útočníkem. Nicméně ani při použití šifrování nemusí být komunikace zcela bezpečná, záleží i na tom jaká verze protokolu SSL/TLS je používána a jaké se použijí šifrovací algoritmy.

Kryptografické algoritmy jsou rovněž využívány při ukládání hesel, ta by neměla být v databázi uchovávána v čitelné podobě ale s použitím vhodné jednosměrné (hashovací) funkce (např. Bcrypt nebo PBKDF2). Pokud by došlo k průniku do databáze, útočník nezíská přímo uživatelská hesla ale pouze jejich otisky, ze kterých je zpětné získání hesel poměrně náročné (záleží dle použité hashovací funkce). Běžné (rychlé) hashovací funkce jako je MD5 nebo SHA se k uvedenému účelu nehodí, neboť útočník může při lámání hesel zkoušet miliardy možností za sekundu.

A co s tím?

Uvedené zranitelnosti jsou jen příkladem těch nejčastějších a nejvíce závažných. Webových aplikací se týkají i další kategorie, na které se v tomto článku nedostalo, např. CSRF, SSRF, XXE, cache poisoning, request smuggling, deserializace. Mnohdy se také závažné zranitelnosti skládají z více dílčích kroků, které samostatně nepředstavují významné bezpečnostní riziko.

Pokud chcete prověřit, zda webové aplikace, jež používáte neobsahují slabá místa, které by mohl případný útočník zneužít, doporučujeme provedení specializovaného penetračního testu našimi experty.

Více o penetračním testování zde.