Penetrační testování webových aplikací

Penetrační testy provádíme na základě simulace reálného útoku etického hackingu. Poskytneme vám detailní přehled o slabých a kritických místech využitelných k průniku, odhalíme bezpečnostní nedostatky, zhodnotíme stupeň jejich závažnosti a navrhneme nápravná opatření.

 

Penetrační testování webových aplikací

Penetrační testování
Penetrační testování (anglicky Pentration Testing, nebo také Pentesting) je jeden z bezpečnostních procesů, který se pokouší o zlepšení celkové bezpečnosti testovaného aktiva (např. serveru). Penetrační testování může probíhat nezávisle, nebo se může jednat o část bezpečnostního procesu, který je součástí Software Development Life Cycle (SDLC). Účelem penetračního testu je pokus o získání přístupu k cílovému aktivu, bez požadovaného oprávnění – tedy pokusit se najít chybně implementované ochranné mechanismy, nebo potencionální bezpečnostní rizika dříve, než je někdo zneužije ke škodlivé činnosti. Aby se jednalo o penetrační test, nikoliv kybernetický útok, tester musí mít předem povolení od vlastníka cíleného aktiva. Jediným rozdílem mezi penetračním testem a reálným útokem je tedy povolení na cíl útočit.
V průběhu penetračního testu mohou být použity veškeré součásti IT infrastruktury, jako jsou aplikace, operační systémy, síťová zařízení, komunikační média a tak dále. To však neznamená, že se testování omezuje pouze na hardware a software, může zahrnovat i prvky psychologie, použité na pracovníky cílené společnosti, ve snaze získat nějaké cenné informace, které by testerovi pomohly k proniknutí do systému. Těmto prvkům útoků se také říká sociální inženýrství. Simulace reálného útoku je součástí penetračního testování, ale není to zdaleka jediná část. Tester svůj cíl analyzuje, vyhodnocuje potencionální hrozby a ty se následně snaží zneužít. Je očekáváno, že si tester v průběhu celého penetračního testu bude dělat důkladné poznámky, které vyústí ve výsledný report o stavu testovaného cíle. Je důležité si uvědomit, že i po kvalitně provedeném penetračním testu může cíl testování zůstat zranitelný. Je vcelku nepravděpodobné, že penetrační test odhalí všechny zranitelnosti. I kdyby se tak stalo, bezpečnost u software může být velmi proměnlivá – stále jsou objevovány nové zranitelnosti, jsou vydávány záplaty a nové verze, které s sebou mohou nést nové zranitelné prvky.
Terminologie
S okruhem penetračního testování je spojeno několik pojmů, které by bylo lepší si vyjasnit hned na začátku, aby se uprostřed textu neobjevovaly krkolomné vysvětlivky pojmů a aby se ustálily výrazy, které se budou v této práci používat.
Aktiva – Assets Pokud budeme hovořit o aktivech, jedná se o nějakou součást IT infrastruktury, která by měla být chráněna tak, aby s ní nikdo neoprávněný nemohl manipulovat. Nejčastěji se bude jednat o nějaké aplikace, data či zařízení.
Útok – Attack Útok na IT infrastrukturu za účelem získání přístupu k aktivům, vytvoření škody, či znemožnění správné funkčnosti služby.
Zranitelnost – Vulnerability Zranitelnost může být definována jako chyba, nebo slabina, s jejíž pomocí lze získat neoprávněný přístup k aktivům. Úspěšné zneužití zranitelnosti může vést k manipulaci s daty, které by neměly být dostupné.
Hrozba – Threat Hrozba představuje možné nebezpečí hrozící aktivům. Může se jednat o potencionální možnost útoku – tedy zneužití nějaké zranitelnosti.
Dopad – Impact Reprezentuje možný rozsah a typ škod na aktivech, ke kterým se útočníkovi podařilo získat přístup.
Riziko – Risk Existující hrozba představuje jisté riziko – tedy pravděpodobnost zneužití zranitelnosti. Riziko je také závislé na závažnosti této zranitelnosti. Vyhodnocení rizika pak může být definováno takto:
Riziko = Hrozba * Zranitelnost * Dopad
Exploit – Exploit Může se jednat o program, nebo sekvenci příkazů, která využívá určité zranitelnosti ke způsobení původně nezamýšlené činnosti – obvykle se jedná o ovládnutí systému, jinak nepovolenou instalaci software, či zvyšování oprávnění.
White Hat Někdy také nazýván Ethical Hacker. Jako tento typ hackera je často označován profesionál na poli IT bezpečnosti. Jedná se o člověka, zaměřujícího se na penetrační testování a další testy zajišťující bezpečnost v IT odvětví.
Black Hat Tento typ hackera je přesně to co si většina lidí pod slovem hacker představí. Jedná se o osobu, která zneužívá své znalosti k nelegální činnosti – útokům na servery, krádežím dat a podobně. V textu referován také jako útočník.
Gray Hat Tímto termínem je označován hacker, stojící na pomezí mezi white a black hat. Může to být například bezpečnostní specialista, který vystupuje jako white hat hacker, ale někdy porušuje etické zásady a principy – většinou však bez úmyslu škodit.
Blacklisting Jedná se o typ validace vstupu, kde se filtrují potencionálně nebezpečné znaky a známé útočné řetězce jako <script>.Obecně tato metoda validace není doporučena, protože se může na něco zapomenout a validace je tak nefunkční.
Whitelisting Uživatelem zadané vstupy se validují oproti očekávaným hodnotám (například regulárním výrazům). Hodnoty, které nesplňují podmínky whitelistu nejsou přijaty
Hodnocení zranitelností – Vulnerability Assessment Tento pojem bývá někdy zaměňován s penetračním testováním. Oba bezpečnostní procesy obsahují shromažďování informací, skenování a vyhodnocení nalezených zranitelností. A po tomto bodu se však rozcházejí – penetrační testování totiž obsahuje i fázi exploitování, kdy se snaží o reálnou kompromitaci systému, což součástí hodnocení zranitelností není.
Kategorie penetračního testování
Když je definován rozsah penetračního testu, definuje se i to, jakým způsobem se bude k testování přistupovat a co konkrétně se bude testovat. Podle možnosti přístupu jsou tu tři kategorie – Black Box, White Box a Gray Box, v závislosti na tom, co má test reprezentovat.
• Black Box – U Black Box penetračního testu je testerovi zděleno jen velmi málo informací o testovaném aktivu. V případě testování, kdy se má tester zaměřit na síťovou infrastrukturu testované společnosti, jedinou věcí, kterou bude tester na začátku testování vědět je rozsah IP adres, které má testovat. Pokud by se tedy jednalo o testování webové aplikace, tester opět dostane pouze adresu webu a žádné zdrojové kódy aplikace poskytnuty nebudou. Může se tak jednat o cílenou simulaci reálného útoku. Tento kategorie je velmi častá, jestliže se jedná o externí testování.
• White Box – White Box penetrační testování je přesným opakem Black Box kategorie. Testerovi jsou poskytnuty téměř všechny informace o testovaném cíli. To znamená, že v případě testování síťové infrastruktury jsou testerovi poskytnuty konkrétní adresy, operační systémy, na nich bežící služby s příslušnými verzemi a tak dále. U testování webové aplikace je poskytnut i samotný zdrojový kód, což umožňuje statickou i dynamickou analýzu zdrojového kódu. Tato kategorie je častá u interního penetračního testování.
• Gray Box – Jedná se penetrační testování, které stojí mezi Black Box a White Box testováním. Některé informace jsou testerovi poskytnuty, jiné zůstávají skryté. V případě testování webové aplikace tester dostane adresu webu a může dostat například jména uživatelských účtů. Tato kategorie testování může simulovat situaci, kdy uniknou určitá data na internet.
Typy penetračních testů
U penetračního testování musí být jasně specifikováno, co přesně se bude testovat a co už testu podléhat nebude. Tedy vytyčit nějaké hranice, které by tester neměl překročit. Je mnoho typů testování, avšak tyto jsou prováděny nejčastěji:
• Network Penetration Test V tomto typu penetračního testu se testuje infrastruktura počítačové sítě, neobsahuje-li zranitelnosti či potencionální bezpečnostní hrozby. Tento typ penetračního testu je možné dále rozdělit do dvou kategorií a to externí a interní testování. Externí – testerovi je poskytnut rozsah veřejných IP adres (popřípadě jedna adresa), které se budou testovat. Cíl testování je volně přístupný komukoliv z internetu. Interní – testerovi může být poskytnut přístup do firemní sítě přes VPN, nebo může testování probíhat přímo v místě určení, kde se tester bude připojovat do interní sítě testované společnosti například přes Wi-Fi.
• Web Application Penetration Test Dnes velmi běžné testování. Jak se rozšiřuje využití webových aplikací, které ukládají citlivá data uživatelů, je potřebné i jejich bezpečnostní testování. K tomu slouží právě tento typ penetračního testu, kdy tester může dostat pouze informace ve formě URL adresy webové aplikace v případě Black Box testu, nebo i zdrojové kódy aplikace a další informace ve formě White Box testu.
• Mobile Application Penetration Test Penetrační testování mobilních aplikací je jeden z novějších typů testů, avšak stejně důležitý jako jakýkoliv jiný. Mobilní zařízení se systémy Android, iOS, případně jinými jsou dnes často využívané jak ve firemním prostředí, tak pro osobní účely. Je tedy vhodné zajistit jak operačním systémům, tak i jejich aplikacím, pracujícím s citlivými daty, co nejlepší stupeň bezpečnosti, k čemuž může penetrační testování pozitivně přispět.
• Social Engineering Penetration Test Sociální inženýrství může být penetračním testem samo o sobě, nebo může být součástí jiného testování. V takovém případě se tester nesnaží zneužít slabin systému, ale jeho uživatelů, například pomocí útoku spear phishing
• Physical Penetration Test Asi nejméně častý způsob (ale stejně důležitý) penetračního testování, kdy je tester dotázán, aby se dostavil přímo do budovy testované společnosti. Hlavním cílem je otestovat fyzické bezpečnostní mechanizmy (zámky, senzory, kamery a jiné) a odhalit jejich slabá místa dříve, než tyto slabiny zneužije nějaká neautorizovaná osoba.
Standardy a metodologie
Pro potřeby bezpečnostního testování byly vytvořeny různé otevřené standardy a metodologie. Těchto standardů existuje celá řada, podílí se na nich jednotlivci, několika členné týmy či dokonce celé organizace. Od počtu osob se také odvíjí komplexnost jednotlivých standardů. V této sekci budou popsány jen některé z těch nejznámějších. Metodologie můžeme chápat jako definované sady pravidel a postupů, podle kterých by se měl celý proces testování řídit. Jedná se tedy o plán s praktickými návrhy a prokázanými praktikami, jejichž dodržováním je možné vyhodnotit bezpečnostní stav počítačové sítě, webové aplikace, serveru, nebo čehokoliv co podléhá bezpečnostnímu testování. Existuje několik organizací, které takovéto metodologie vyvíjejí a udržují. Všechny metodologie se od sebe navzájem v jistých bodech liší. Při jejich volbě je tedy potřeba přesně stanovit, co je od testování očekáváno, a následně si zvolit takovou metodologii, která bude stanovenému cíli nejlépe vyhovovat. Každé dobré penetrační testování by se mělo nějakou metodologií řídit. Poskytuje to značné výhody k pochopení a analýze jednotlivých zranitelností a obranných prostředků pro každou fázi testovacího procesu.
V této sekci je představeno několik dobře známých metodologií, u kterých budou vyzdviženy jejich klíčové vlastnosti a výhody použití, avšak k opravdu dobrému pochopení různých metodologií, je doporučeno nahlédnout do oficiálních dokumentací, které jsou dostupné na příslušných webových stránkách. Metodologie však nejsou jedinými standardy v této oblasti. Tak jako postup testování tak i samotné útoky a zranitelnosti, které se testují je nutné zařadit do určitého neměnného standardu. Nejznámějšími takovými standardy jsou projekty od společnosti Mitre, které se zabývají právě standardizací objevených zranitelností a útoků na ně. Další formou standardu, která určitě stojí za zmínění, jsou takové standardy, které umožňují vyhodnotit určitá rizika a závažnost nalezených zranitelností.
Information Systems Security Assessment Framework
ISSAF je často zmiňovaný strukturovaný rámec (framework), který kategorizuje testování bezpečnosti informačních systémů do několika oblastí, u kterých detailně specifikuje testovací kritéria. Rámec ISSAF je vytvořený a udržovaný neziskovou organizací Open Information Systems Security Group (OISSG), kde se rozhodli, neomezovat jejich materiály jakýmikoliv poplatky. Rámec ISSAF by měl být použit primárně pro testování bezpečnosti, ale může být využit i jako referenční materiál pro meetingy, konference a jiné potřeby v oblasti informační bezpečnosti. Informace v rámci ISSAF jsou organizovány do dobře definovaných testovacích kritérií, kde každé z nich bylo revidováno experty v dané oblasti. Mezi tato kritéria patří:
• popis kritérií pro testování, • cíle a záměry, • vstupní předpoklady pro provedení testu, • proces testování, • zobrazení očekávaných výsledků, • doporučené protiopatření, • reference a externí dokumenty.
Celkově je rámec velmi rozsáhlý a podrobný, protože se autoři snažili poskytnout co nejvíce informací. Hlavním důvodem je myšlenka, že je pro uživatele jednodušší materiál nevyužít, než jej sám vymýšlet. ISSAF metodologie pro penetrační testování je navrhnuta tak, aby umožňovala pokrýt všechny možné typy penetračního testování od začátku až ke konci testu. Testování se skládá ze tří hlavních fází dohromady o devíti krocích.
1. Plánování a Příprava 2. Testování 3. Reportování a úklid stop
První fáze popisuje kroky při výměně počátečních informací se zákazníkem, plánování a přípravu na testování. Kroky, ze kterých se skládá (druhá) testovací fáze jsou na obrázku 2. Třetí fáze popisuje vytváření reportu a úklid po ukončení testování. Pokud úklid není možné provést vzdáleně, je nutné o veškerých provedených změnách a přidaných souborech napsat do reportu, aby tyto změny mohly být opraveny příslušnými pracovníky.

Open-Source Security Testing Methodology Manual
OSSTMM poskytuje metodologii pro důkladné bezpečnostní testování, referované jako OSSTMM audit. Aktuální vydání je 3.0, to bylo zveřejněno v prosinci roku 2010. Pro přístup k novějšímu vydání je však zapotřebí prémiového účtu. Hlavní myšlenkou za tvorbou OSSTMM bylo poskytnout vědeckou metodologii pro přesnou charakteristiku operační bezpečnosti, skrze zkoumání a porovnávání výsledků testů v konzistentní a spolehlivé formě. A také poskytnutí příručky, podle které mohou bezpečnostní testeři a analytici uskutečnit certifikovaný OSSTMM audit. Manuál je možné použít na různé druhy bezpečnostního testování včetně penetračního testovaní, vyhodnocení zranitelností, či jiných. Neomezuje se pouze na jeden typ testovaného odvětví, je možné pomocí něj testovat fyzickou bezpečnost, síťovou infrastrukturu, nebo různé systémy či aplikace.
Metodologie udává určitou příručku, ve které jsou uvedeny body, které by měly být otestovány. Neudává však přesně způsob jejich kontroly (nástroje ani metody), to je přenecháno bezpečnostnímu testerovi. Na rozdíl od rámce ISSAF, nebo metodologie OWASP zde nejsou uvedené praktické příklady, nebo poukázání na konkrétní chyby, jsou zde uvedeny pouze oblasti testování. Metodologie určuje šest typů přístupu viz. obrázek 3. Přístupy se rozlišují pomocí dvou kriterií. První je počet informací, které má tester o aktivu k dispozici. A druhé je vědomí personálu, že bude testování probíhat.

Při použití OSSTMM pro testování je potřeba zaznamenávat co se testuje, jak se to testuje, co se podařilo díky testům najít a co se vůbec netestovalo. Důvodem celého zaznamenávání je psaní reportu, který udává přesné dotazy na průběh testu. Tento report je nazýván Security Test Audit Report (STAR).
Open Web Application Security Project
OWASP se od jiných metodologií (ISSAF, OSSTMM) liší hlavně tím, že se specializuje na testování webových aplikací. Účelem projektu OWASP je sesbírat co nejvíce testovacích technik, ty vysvětlit a udržovat jejich aktuální stav. OWASP Testing Guide je manuál, který obsahuje téměř vše, co je potřeba k otestování bezpečnosti webové aplikace. Je rozdělen do tří částí – The OWASP Testing Framework, Web Application Security Testing a Reporting. V první části je kladen důraz na zahrnutí bezpečnostního testování už v SDLC. Je doporučené testovat v každé fázi vývoje aplikace (define, design, develop, deploy, maintain). Což je jedna z dalších věcí, čím se OWASP liší od ostatních standardů. Ve druhé části je popsána metodologie pro penetrační testování. Testovací metodika OWASP je založena na Black Box přístupu k testování (ačkoliv s v dokumentaci objevují i případy, kdy se popisuje postup pro White Box a Gray Box přístupy). Tato metodologie se dělí na dvě hlavní části.
Fáze 1 – Pasivní mód V této fázi se tester snaží pochopit aplikační logiku testované aplikace. Používají se zde hlavně nástroje pro sběr informací (information gathering). Například může být použita HTTP proxy, přičemž tester může sledovat jak vypadají dané HTTP požadavky a odpovědi (requests and responses). Při dokončení této fáze testovaní, by měl tester chápat všechny přístupové body aplikace (HTTP hlavičky, parametry, cookies).
Fáze 2 – Aktivní mód V této fázi začíná penetrační testování podle OWASP metodologie s aktivním využitím různých nástrojů a technik, které zkouší odhalit známé zranitelnosti. Aktivní fáze se skládá z jedenácti podkategorií:
• určení cílů testování, • testování konfigurace a správy nasazení, • testování správy identity, • testování autentizace, • testování autorizace, • testování správy sezení, • testování validace vstupů, • testování řešení výjimek, • testování slabé kryptografie, • testování aplikační vrstvy, • testování na straně klienta.
Provedení testování je pouze polovinou z celkového procesu. V poslední části této dokumentace je popsáno, jak by se měl správně sepsat report o testování. OWASP mimo svůj Testing Guide nabízí i shrnutí TOP 10 [11], které se skládá z deseti zranitelností, vyhodnocených jako nejkritičtější v oblasti webových aplikací. Není to pouze list, který tyto zranitelnosti vyjmenovává, ale jedná se i o vysvětlení jak fungují, proč jsou do seznamu zařazené a jak je testovat, případně i opravit. Součástí projektu OWASP jsou i nástroje, vytvořené samotnou komunitou. To však neznamená, že by se měly používat pouze a právě tyto nástroje, což cílem OWASP projektu ani není. Odkazují se na velké množství jak už open-source tak komerčních nástrojů třetích stran.
Penetration Testing Execution Standard
Penetration Testing Execution Standard (PTES) je standard pro penetrační testování, skládající se ze sedmi hlavních částí. Ty pokrývají všechny důležité informace, týkající se penetračního testování – od zahájení komunikace se zákazníkem, přes sběr informací, až do vytváření reportu o celkovém průběhu testu. Tento standard je možné použít k libovolnému typu penetračního testu (testování síťové, aplikační,. . . ). Každá fáze je velmi dobře a detailně popsaná na oficiálních stránkách. Jednotlivé fáze standardu PTES jsou:
• interakce před začátkem testování, • shromažďování informací, • modelování hrozeb, • analýza zranitelností, • zneužití zranitelností, • po zneužití zranitelností, • reportování.
Tento standard udává vlastní plán, jak při testování postupovat, ale také obsahuje hodně referencí na jiné zdroje, jako třeba OWASP, pro případ testování webových aplikací.
Web Application Security Consortium – Threat Classification
„The Threat Classification je snahou klasifikovat slabiny a útoky, které mohou vést ke kompromitaci webových stránek, jejich dat, nebo uživatelů.” [27] Web Application Security Consortium – Threat Classification (WASC–TC) se stejně jako OWASP soustředí na oblast webových aplikací. Cílem tohoto projektu je společná snaha o zorganizování a vysvětlení zranitelností objevujících se u webových aplikací. Nejedná se přímo o metodologii, která vysvětluje jak postupovat při penetračním testování, ale jde spíše o referenční materiál, který se snaží vysvětlit terminologii, zranitelnosti, typy útoků a odkazuje čtenáře na další dostupné materiály. WASC–TC je zorganizován do tří různých pohledů:
Enumeration View – Tento pohled poskytuje přehled o nejčastějších útocích a zranitelnostech týkajících se webových aplikací. Každý z těchto útoků a zranitelností je samostatně rozebrán a společně s praktickým příkladem vysvětlen.
Development Phase View – Tento pohled byl vytvořen, aby poukázal, kde v SDLC je pravděpodobné, že se daná zranitelnost vyskytne. Jde tedy o snahu upozornit na určité fáze vývojového procesu, kde je mohou vznikat zranitelná místa v aplikaci. Jako fáze jsou zde uvedeny: návrh, implementace a nasazení. Návrh – Zranitelnosti se vyskytují, když nejsou splněny požadavky na zabezpečení aplikace v počátečních fázích vývoje. Implementace – Zranitelnosti se vyskytují z důvodu, že se nedodržují principy a praktiky bezpečného programování. Nasazení – Zranitelnosti mohou být výsledkem špatné konfigurace aplikace, popřípadě serveru, na který je aplikace nasazená.
Taxonomy Cross Reference View – Tento pohled obsahuje mapování zranitelností a útoků podle různých standardů. Každý z těchto standardů pro bezpečnost webových aplikací je jiný a vyhodnocuje zranitelnosti jinými způsoby, takže se jednotlivá hodnocení mohou lišit. Součástí tohoto mapování jsou: Mitre Common Weakness Enumeration (CWE), Mitre Common Attack Pattern Enumeration and Classification (CAPEC), SANS-CWE top 25 list, OWASP TOP 10 za roky 2010, 2007 a 2004.
Mitre Common Weakness Enumeration
Common Weakness Enumeration (CWE) [28] je komunitou vyvíjený formální seznam softwarových zranitelností v architektuře, návrhu, nebo zdrojovém kódu. Cílem CWE je vytvořit jednotný standard, který pomůže jednoznačně označit a identifikovat jednotlivé zranitelnosti. Díky tomuto standardu je možné se odkazovat na určité zranitelnosti pomocí unikátního CWE-ID. Jednotlivé CWE mají vždy stejnou strukturu popisu zranitelností, o kterých se pojednává. Nejdříve je vysvětleno co si pod názvem zranitelnosti představit – jedná se tedy o stručný slovní popis zranitelnosti. Dále jsou uvedeny CWE skupiny, do kterých zranitelnost patří, popřípadě podobné či související zranitelnosti. Následující části popisu obsahují informace o tom, kde se dané zranitelnosti mohou vyskytovat – u jakých technologií, jaké mohou být následky, pokud je zranitelnost zneužita. Nechybí ani praktické ukázky zranitelných zdrojových kódů (pokud je možné je uvést) a možné způsoby ochrany.
Mitre Common Vulnerabilities and Exposures
Common Vulnerabilities and Exposures (CVE) [29] je podobně jako CWE formální seznam softwarových zranitelností udržovaný společností Mitre. Položky CVE se skládají z identifikačního čísla (CVE-ID), popisu a alespoň jednoho veřejného odkazu. Na rozdíl od CWE se ale nejedná o obecný popis zranitelností, ale váže se na určitou technologii, produkt, či systém.
Mitre Common Attack Pattern Enumeration and Classification
Cílem Common Attack Pattern Enumeration and Classification (CAPEC) [30] je poskytnout veřejně dostupný katalog známých postupů útoků (attack pattern), spolu s komplexním schématem popisujícím související útoky. Postup útoku je prezentován jako abstraktní mechanismus, na kterém je popsáno a vysvětleno jak je útok na zranitelný systém či síť proveden. V každém CAPEC záznamu jsou definovány problémy, kterým útočník může čelit a s tím související doporučené metody, jak se reálnému útoku bránit. Projekt CAPEC pomáhá útoky kategorizovat smysluplným způsobem ve snaze poskytnout materiály, které mohou vývojářům pomoci pochopit způsob, jakým může být jejich systém napaden a jak se proti němu mohou efektivně bránit. Na rozdíl od standardů CVE a CWE se jedná o seznam nejběžnějších metod použitých při útocích na zranitelná místa, kdežto dva dříve zmiňované standardy popisují právě zranitelná místa, na které jsou útoky prováděny. Společné použití standardů CWE a CAPEC může poskytnout objasňující a pomocný materiál pro vývoj a úpravu vyvíjeného software.

Common Vulnerability Scoring System
Common Vulnerability Scoring System (CVSS) [31] je otevřený, volně dostupný standard, poskytující způsob pro posouzení závažnosti bezpečnostních zranitelností softwaru na základě jejich základních charakteristik. Výsledkem procesu je číselné skóre posuzované zranitelnosti, to pak může být překládáno do kvalitativní reprezentace. Použití CVSS přináší hned několik výhod jako je standardizované hodnocení zranitelnosti – tento systém hodnocení se dá využít na všech IT platformách od aplikací po celé operační systémy. Navíc díky využití tohoto standardu je jasně vidět jak se k výslednému hodnocení dospělo. Při porovnání jednotlivých CVSS skóre je pak možné nalézt rizika, která jsou prioritní. Skóre se počítá podle tří metrik – Base, Temporal, Environmental. Každá metrika se dále dělí na několik komponent, podle kterých se výsledná závažnost určuje.
• Base – tato metrika reprezentuje vnitřní charakteristiku zranitelnosti, které jsou neměnné v průběhu času a nejsou závislé na uživatelském prostředí. Dále se dělí na Exploitability a Impact metriky. Exploitability metriky zastupuje složitost a technické prostředky, které jsou nutné ke zneužití zranitelnosti. Impact metriky představují následky, které by mohly nastat v případě úspěšného zneužití zranitelnosti.
• Temporal – položky v těchto metrikách jsou reprezentovány charakteristiky zranitelnosti, které se mohou v čase měnit a přitom nezáleží na prostředí ve kterém se zranitelnost vyskytuje (operační systém, verze software). Záleží na tom, jestli pro danou zranitelnost existuje použitelný nástroj pro zneužití (exploitability) zranitelnosti, jsou-li vydané záplaty, které funkci takového nástroje znemožňují a podobné, v čase se měnící okolnosti.
• Environmental – tyto metriky jsou reprezentací charakteristik, které jsou unikátní v konkrétním uživatelském prostředí. Může se například jednat o zranitelnost v určitém operačním systému. Pokud tento operační systém není v daném prostředí používán, nebo je konfigurován jiným způsobem, než se uvádí v popisu zranitelnosti, je možné, že se zranitelnost na dané prostředí vůbec nemusí vztahovat. Mohou tedy existovat dvě společnosti, které čelí stejné zranitelnosti, ale protože každá z těchto společností využívá jiný hardware a software, finální skóre této metriky může být naprosto odlišné.

Pro použití kalkulátoru, jehož ukázka je na obrázku 4, existuje uživatelský manuál, který obsahuje dobře popsaný postup, podle jakých kritérií se zranitelnost vyhodnocuje. Finální skóre se dělí do několika kategorií dle závažnosti, jakou zranitelnost představuje – ty jsou uvedeny v tabulce 1.

Vyhodnocení standardů
V průběhu zpracování diplomové práce byly identifikovány tyto standardy:

Jak lze vidět v tabulce 2, standardů existuje hned několik. Některé se zabývají postupy při bezpečnostním testování, jiné zase identifikací a hodnocením zranitelností. V této chvíli jsou však podstatné ty, které určují postupy bezpečnostního testování. Všechny zmiňované testovací standardy popisují celé procesy bezpečnostního testu, které mohou být velice zdlouhavé, pokud by se měla striktně dodržovat testovací osnova. Je tak vcelku pochopitelné, že tyto standardy menšími firmami nemusejí být vhodným materiálem pro účely testování bezpečnosti. Všechny zmíněné standardy mají v oblasti penetračního testování své místo a každý vyniká v jiných podmínkách. Ale z důvodu jejich komplexnosti se příliš nehodí pro testování malých a jednoduchých projektů.
Výhody a nevýhody penetračního testování
Robustní ochrana aktiv může být udržována na dobré úrovni jen tak dlouho, dokud je na ni vyvíjen neustály tlak. Jedině tím se dá zaručit eliminace nových zranitelností a posunovat úroveň zabezpečení stále kupředu (nebo ji alespoň udržovat na stejné úrovni). Penetrační testování má řadu výhod, ale tak jako vše, má i jisté nevýhody. Je tedy na uváženou, jestli je penetrační testování to pravé, nebo je lepší zvolit nějakou jinou možnost, jak se zasloužit o zlepšení bezpečnosti aktivu. Zde je uvedeno několik pozitivních i negativních faktů, které penetrační testování provázejí.
Výhody
• Identifikace zranitelných míst. Jeden z hlavních důvodů, proč se penetrační testování provádí, je nalezení a opravit zranitelnosti aktiva.
• Ukázka reálného útoku. Umožňuje prozkoumat reálná rizika, která aktivům hrozí. Napomáhá získat lepší představu o jejich zabezpečení a efektivnosti obranných mechanismů.
• Může sloužit jako tréning pro IT oddělení. Vyhodnocení odolnosti pracovníků na sociální inženýrství a reakce schopnosti v případě bezpečnostních incidentů.
• Testování aktiva do hloubky. Tester se snaží chovat jako útočník, používá stejné nástroje a taktiky. Může tak najít i zranitelnosti, které automatizované nástroje neodhalí.
• Specifické rady k zabezpečení. Posledním krokem v penetračním testování je reporting, který by měl podávat konkrétní informace o konkrétních chybách. Na rozdíl od automatizovaných nástrojů, které jsou většinou schopny vygenerovat jen obecné tipy.
• Zachování dobrého jména společnosti. Představte si, že jste provozovatel e-shopu a objeví se zprávy o tom, že vaše servery byly napadeny hackery a uživatelská data unikla na internet. Pokud by se něco takového prokázalo, mělo by to na jméno společnosti devastující dopad.
• Prevence datových a finančních ztrát. Společnosti mají svůj byznys založený na práci s daty. Při průniku do webové aplikace mohou být data ukradena, popřípadě úplně ztracena, což může mít negativní dopad na fungování firmy.
Nevýhody
• Pokud testování není provedeno správně, může napáchat velké škody. Testy, které jsou špatně naplánovány, mohou například způsobit pád serveru, nechtěně vystavit citlivé informace veřejnosti, znehodnotit produkční data, nebo jiné nebezpečné záležitosti.
• Je nepravděpodobné, že penetrační test odhalí všechny zranitelnosti a bezpečnostní hrozby. V oblasti IT bezpečnosti je obrovské množství známých zranitelností a nové se objevují každou chvíli. Je tedy vcelku možné, že se na nějakou zapomene, nebo je testování zranitelnost zkrátka neodhalí.
• Kvalitní penetrační testování může být náročné – jak časově, tak finančně. Kvalifikovaných a důvěryhodných profesionálů v této oblasti je jen omezené množství, což se může projevit na ceně penetračního testu. A aby byl test kvalitní, i ti nejlepší testeři potřebují určitý čas na prozkoumání, vyhodnocení a otestování daného aktivu.
• Penetrační testování může dávat falešný pocit bezpečí. To že žádné zranitelnosti nebyly nalezeny, ještě neznamená, že neexistují, respektive, že se všechny nalezené zranitelnosti opravili, ještě neznamená, že neexistují další, nebo opravami nevznikly nové.
• Nerealistické testovací podmínky. Pokud je oddělení, které bude penetračním testem zasaženo, dopředu informováno o této skutečnosti, je mu tak umožněno dobře se na útok připravit, což může výsledné penetrační testování ovlivnit. V reálném případě však hacker zaútočí bez varování.
Penetrační testování webových aplikací
Tato kapitola se věnuje hlavně aktuálnímu stavu na poli bezpečnosti webových aplikací – jaké jsou nejčastější útoky a na jaké zranitelnosti se nejčastěji útočí. V kapitole 5 budou popsány vybrané zranitelnosti a ke každé z nich bude zmíněno několik nástrojů, které se dnes v tomto odvětví často používají.
Stav bezpečnosti na poli webových aplikací
Není vhodné spoléhat se pouze na OWASP TOP 10, SANS-CWE TOP 25, či jiný list zranitelností. Bylo nutné vytvořit vlastní přehled a mít tak kontrolu nad aktuálností dat. Proto došlo k vyhledání několika reportů různých společností, působících na poli počítačové bezpečnosti. Reporty sloužily jako zdroj informací o bezpečnostním stavu webových aplikacích. Cílem bylo získat reporty se statistikami z více zdrojů, aby se daly porovnat a vyhodnotit zranitelnosti, které se objevují nejčastěji a těmi se dále zabývat podrobněji po zbytek této práce. Každá společnost používá jinou metodologii pro získání dat, tak i pro hodnocení rizika daných zranitelností a také se všechny profesně soustředí na něco trochu jiného. Tato fakta je potřeba vzít na vědomí, protože zranitelnosti se svým pořadím v žebříčcích report od reportu liší (mezi společnostmi). Informace o společnostech a metodách použitých ke sběru dat pro jejich reporty lze vyčíst přímo v referovaných materiálech.
Symantec – Internet Security Threat Reports
V roce 2016 se počet útoků na webové aplikace snížil o třetinu oproti roku 2015. Nicméně útoky na webové stránky zůstávají i nadále velkým problémem. Každý den bylo průměrně detekováno kolem 229.000 útoků. Ke snížení počtu útoků sice došlo, ale kolem 76% skenovaných webových stránek stále obsahovalo zranitelnosti (obrázek 5) a u 9% z nich se objevily zranitelnosti kritické (obrázek 6).

Jako kritické zranitelnosti jsou brány ty, které při exploitování útočníkem mohou umožnit spuštění škodlivému kódu bez interakce uživatele, potenciálně mohou vyústit v krádež dat, nebo jinou kompromitaci stránek a jejich uživatelů.

V reportech z předešlých let se hodně diskutovalo o zranitelnostech týkajících se SSL/TLS, což je hlavně zásluha zranitelnosti Heartbleed u knihovny OpenSSL. V roce 2015 se také jednalo o velmi časté zranitelnosti, týkajících se protokolů SSL/TLS 3. Implementace SSL/TLS není jednorázový úkol. Organizace by měly být pro-aktivní co se jejich údržby týče. Aktualizace pro SSL/TLS knihovny jsou vydávány pravidelně, ale majitelé webových stránek je musejí stále instalovat. Protokoly SSL/TLS zůstávají centrálními prvky ochrany osobních údajů, autentizace a šifrování na internetu, ale pokud má jejich využití zůstat efektivní, je vyžadována neustálá údržba a ostražitost.
Positive Technologies
Tabulka 4 obsahuje srovnání různých typů útoku dle četnosti, které byly zaznamenány v prvních třech čtvrtletích roku 2017. Data vycházejí z reportů firmy Positive Technologies, ta data získala z aplikačních firewallů, které vyvíjejí.

Další srovnání v tabulce 5 pochází už z trochu širšího časového rozmezí a to z let 2014 až 2016. Opět se jedná o množstevní porovnání, tedy které zranitelnosti byly nejčastější. Nejedná se už o data získaná sběrem informací z aplikačních firewallů, ale naopak o data, která firma získala prováděním penetračních testů a různých bezpečnostních auditů. Testování probíhalo pomocí automatizovaných nástrojů tak i manuálního šetření, analýz zdrojových kódů a tak dále (Black, Gray i White Box metody penetračního testování).

V reportech jsou zranitelnosti řazeny do tří kategorií podle závažnosti: vysoká, střední, nízká. Odhad závažnosti byl určen dle Common Vulnerability Scoring System (CVSS v2). Útoky kategorizované vysokou závažností, které se objevovaly i v těchto tabulkách jsou: SQLi, XML External Entities (XXE) a Path Traversal. Z použitých reportů firmy Positive Technologies vyplývá, že je dnes asi největším problémem útok XSS. Nejen že zranitelnost na tento útok byla u testovaných webových aplikací nejčastější, útok XSS útočníci velmi často zařazují mezi své vektory útoků. Dalšími útoky, které dominují v horní polovině tabulky 4 jsou SQLi, Path Traversal, Local File Inclusion a OS Commanding. Všechny zmíněné útoky jsou klasifikovány jako útoky se střední, nebo vysokou závažností. Z tabulky 5 vyplývá, že na právě tyto útoky webové stránky většinou zranitelné nejsou – ale pokud by byly, je vcelku velké riziko, že by byly tímto útokem napadeny.
Acunetix
Firma Acunetix, která vyvíjí scanner zranitelností stejného jména, každým rokem vydává report, obsahující statistiky nejčastěji nalezených zranitelností i s hodnocením jejich závažnosti. Pro tento report, který zahrnuje období let 2016 – 2017, byla využita data z náhodně vybraných skenů 11 600 předplatitelů této služby. Report se převážně zabývá zranitelnostmi webových aplikací se střední, nebo vysokou závažností viz. tabulka 6.

U 50% skenovaných cílů, zahrnutých do tohoto reportu v intervalu let 2016 – 2017, byla objevena zranitelnosti XSS. Což jen potvrzuje fakt, že jsou v oblasti webových aplikací velké nedostatky co se týče bezpečnosti – jedná se totiž o jednu z dobře známých zranitelností, o které se ví mnoho let, ale objevuje se neustále a to s poměrně vysokou četností.
OWASP TOP 10
Cílem projektu OWASP TOP 10 je zvýšit povědomí o bezpečnosti webových aplikací, tak že vyhodnotí data o útocích za určité období a sestaví žebříček deseti nejkritičtějších zranitelností. Data zpracovávaná pro tento report byla poskytnuta více než 40 firmami, specializujících se na bezpečnost aplikací. Položky pro TOP 10 jsou prioritně vybrány podle počtu výskytů, složitosti zneužití, možnosti detekce a výslednému dopadu. Hodnocení jejich rizika je vyhodnoceno podle OWASP Risk Rating Methodology.

Jak je vidět na obrázku 7, který srovnává změny posledních dvou žebříčků, útoky typu Injection (SQLi, OS Commanding) jsou dlouhodobě považovány za jedny z nejnebezpečnějších. Avšak v průběhu let došlo k podstatným změnám. Výskyt některých zranitelností je zmírněn dnes používanými rámci, jako je tomu v případě CSRF, jiné jsou nahrazené nebezpečnějšími typy útoků a posunuty tak do pozadí. Dále se některé uvedené zranitelnosti spojují do jedné kategorie. Ačkoliv takový útok CSRF již není součástí aktuálního TOP 10 listu, neznamená že by se na něj mohlo zapomenout. Je to stále velmi nebezpečný útok, který by se měl testovat. Lze tedy vidět, že typy útoků Injection a XSS jsou stále aktuální hrozbou. Stejně jako špatná bezpečnostní konfigurace, návrh mechanismů pro autentizaci, správu sezení a jiné. Novinkami v seznamu pro rok 2017 jsou zranitelnosti XXE, nesprávná deserializace a nedostatečné logování a monitoring.
Vyhodnocení statistik
V průběhu let se objevují jistá období, kdy několik typů útoku figuruje nad ostatními, které zrovna nejsou tak časté, ale později se opět vrací. Je tedy důležité při vývoji webových aplikací nedbat pouze na nejaktuálnější trendy, ale poohlédnout se zpět v čase na zranitelnosti, které byly hojně zneužívány a s tímto vědomím také aplikace vyvíjet či testovat. Diplomová práce se však zaměřuje pouze na několik vybraných aktuálních záležitostí. Společnými prvky téměř ve všech zmíněných reportech jsou útoky typu SQLi a XSS. Tyto zranitelnosti jsou velmi rozšířené a nebezpečné, proto budou zahrnuty i v další části práce. Mimo jiné se jedná o zranitelnosti, které se útočníci pokoušejí zneužít hned mezi prvními, jak vyplývá z tabulky 4. Dalšími takovými zranitelnosti, které se útočníci velmi často snaží zneužít jsou Path Traversal, Local File Inclusion a OS Commanding (Command Injection). Všechny tyto zranitelnosti spadají do katagorie IIV. Důvodem, proč jsou útoky na validaci vstupů tak časté je nejspíš fakt, že se dají poměrně jednoduše automatizovat a testovat jednotlivé vstupy hned na několik zranitelností najednou. To mě vede k rozhodnutí, věnovat se po zbytek práce právě těmto útokům.

V tabulce 7 jsou vypsány útoky, které budou rozebrány a předvedeny v pozdějších kapitolách. Podle reportů firmy Positive Technologies zastupují tyto typy útoků přibližně 70% celkového množství útoků na webové aplikace. Ačkoliv je tento výběr zaměřený na ty nejčastější útoky v posledních letech, je více než pravděpodobné, že útočníci budou do svého vektoru útoků zahrnovat mnohem více druhů útoků, než je možné pokrýt v rámci této práce. Což znamená, že i když testovaná aplikace bez problému odolá těmto útokům, neznamená to, že je naprosto v bezpečí.
Vybrané útoky a zranitelnosti
V této kapitole se nachází jen velmi stručný popis zranitelností a útoků, které byly vybrány pro další zpracování. Popis bude stručný, protože daná témata jsou velmi komplexní a jejich popis už i tak existuje v mnoha odkazovaných materiálech. Zde je pouze nastíněno, čím jsou zranitelnosti způsobeny a jakým způsobem na ně může být útočeno.
SQL Injection (SQLi)
Útok SQLi spočívá v injekci kódu do SQL dotazu. Tato injekce způsobí, že dotaz provede akci, ke které původně nebyl určen. Na SQLi může být náchylná jakákoliv webová aplikace, která využívá SQL databáze a neaplikovala proti tomuto útoku žádné ochranné mechanismy. Ačkoliv je SQLi jedna z nejstarších zranitelností, které se u webových aplikací vyskytují, je také jedna z nejnebezpečnějších. Využitím chyby v kódu zranitelném na SQLi se, za správných okolností, může útočníkovi povést obejít autentizační a autorizační mechanismy aplikace a získat tak přístup do databáze. Následně pak může útočník manipulovat s daty – přidávat, mazat, upravovat. Může dojít ke změně integrity dat a tudíž jejich znehodnocení. Dalším možným následkem je vykradení dat databáze, kdy si postupným dotazováním lze vyžádat všechna data (nebo jen specifikované tabulky). V některých případech se může útočníkovi povést proniknout až do systémové konzole, kde může provádět libovolné příkazy v závislosti na typu účtu, k jakému útočník získal přístup.
Druhy SQLi – SQLi útoky mohou být rozděleny do těchto tří skupin:
• In-band – Tento typ SQLi nastane, pokud je útočník schopen použít stejný komunikační kanál jak pro útok, tak pro získání výsledků (tedy webovou aplikaci). Útoky v této kategorii se dále mohou dělit na Error-based a Union-based SQLi.
– Error-based – Tato technika se odvíjí od chybových hlášení, které databáze zasílá jako reakci ke špatně zkonstruovaným dotazům. Využití tohoto typu útoku je možné pouze, pokud jsou chyby propagovány do samotné webové aplikace.
– Union-based – Tento typ SQLi využívá SQL operátoru UNION, kterým je možné získat více SELECT dotazů v jednom výsledku.
• Inferential (Blind) – V tomto typu SQLi neprobíhá žádný skutečný přenos výsledků skrze webovou aplikaci a útočník tedy nevidí výsledky na jím zadané vstupy. Je však schopen sestavit potřebné informace zasíláním speciálně připravených dotazů a pozorováním chovaní databázového serveru. Útoky v této kategorii se dále mohou dělit na Boolean-based a Time-based SQLi.
– Boolean-based – Tato technika závisí na zasílaní SQL dotazů, které by měly vracet TRUE, nebo FALSE výsledky. V závislosti na výsledku se pak obsah v odpovědi HTTP změní nebo zůstane stejný.
– Time-based – Tato technika spočívá ve využití databázových příkazů, jako je sleep ke zdržení odpovědi, čímž útočník může zjistit, vrací li zaslaný dotaz TRUE, nebo FALSE.
• Out-of-band – Pro výsledky dotazu je nutné použít jiný komunikační kanál, než jakým je proveden útok (například pomocí emailu, nebo HTTP dotazu). Tento typ SQLi je realizovatelný pouze v případě, že má databázový server povoleny funkce potřebné k odesílání dat.
Příklad – K tomu, aby šlo provést útok SQLi, musí útočník nalézt nějaké uživatelské vstupy, které při své funkci používají dotazy do SQL databáze. Ve webové aplikaci se může jednat například o funkci přihlášení. Informace o uživatelských účtech bývají uloženy v databázi a funkce pro jejich porovnání musí provést databázový dotaz, který může vypadat podobně, jako v tomto příkladu 1.
Příklad – K tomu, aby šlo provést útok SQLi, musí útočník nalézt nějaké uživatelské vstupy, které při své funkci používají dotazy do SQL databáze. Ve webové aplikaci se může jednat například o funkci přihlášení. Informace o uživatelských účtech bývají uloženy v databázi a funkce pro jejich porovnání musí provést databázový dotaz, který může vypadat podobně, jako v tomto příkladu 1.

Tento dotaz je reprezentací jednoduché autentizace uživatele. Pomocí jména účtu a hesla, ověřených oproti databázovému systému, kde by se v tabulkách měly nacházet stejné hodnoty jako ty co zadá uživatel, aby byla autentizace úspěšná. Pokud dotaz vrátí hodnotu, znamená to, že v databázi existuje uživatel se zadanými údaji a může být přihlášen do systému, v opačném případě bude přístup zamítnut. Pokud dotaz nepoužívá vázané proměnné a je do databáze zaslán bez jakýchkoliv ošetření, bude splňovat svou zamýšlenou funkcionalitu, ale také bude zranitelný na SQLi. Útočník tak může do parametrů odesílaných do databáze zkonstruovat takové řetězce znaků, které mu umožní provést akce dle jeho vlastního výběru. Může například vyplnit podobný vstup, jako je uvedený ve skriptu 1. S těmito hodnotami bude vstup stále syntakticky platný podle SQL databáze a dotaz proběhne úspěšně. Jakmile se dotaz odešle, je do aplikace vrácen i výsledek dotazu, což může znamenat úspěšnou autentizaci bez znalosti jména účtu a hesla. V takovémto případě je dokonce možné, že aplikace útočníka přihlásí pod prvním účtem, který je v databázi nalezen, což bývá často administrátorský účet.
Nástroje – Na testování webových aplikací proti útoku SQLi vzniklo mnoho nástrojů. Jedná se jak o nástroje, které se zaměřují pouze na tento útok, jako jsou například SQLmap [44] a SQLninja [45], tak o nástroje zabývající se větším množstvím útoků, kde SQLi je jen jedna část jejich zaměření. Takovými nástroji jsou třeba Nessus [46], w3af [47], nebo Arachni [48].
Cross Site Scripting (XSS)
XSS patří do typu útoků injekce kódu, kde je škodlivý kód vložen do jinak legitimní a důvěryhodné webové stránky (pokud nejde o stránku záměrně škodlivou). Chyby, které umožňují těmto útokům uspět, jsou vcelku rozšířené a mohou se vyskytnout všude, kde webová aplikace využívá vstup od uživatele, aniž by se provedla jakákoliv validace, či sanatizace. Jedná se o útok na straně uživatele, tedy internetového prohlížeče. Útočník může použít XSS útok k poslání nebezpečného skriptu k nic netušícímu uživateli (například skrze odkaz v emailu). Pokud se uživatel stane obětí útoku, jeho internetový prohlížeč spustí útočníkem podvržený skript. Prohlížeč přitom nemá jak poznat, že skript, který spouští je nedůvěryhodný a povolí mu přístup ke všem informacím, jako by byl legitimní součástí webové stránky. Nebezpečný obsah poslaný prohlížeči často bývá kód v jazyce JavaScriptu, ale může obsahovat také HTML, Flash, nebo jiné typy kódu, spustitelné internetovým prohlížečem.
Útok samotný může být použit k široké škále škodlivých činností, jako jsou krádeže sezení (session), šíření malware, poškození funkčnosti napadených stránek, může být použit i v kombinaci se sociálním inženýrstvím, které mohou útoku přidat na závažnosti. Útočníci často používají různé metody jak zakódovat nebezpečnou část odkazu (použitím Unicode), což způsobí, že odkaz na první pohled nevypadá tak podezřele. Existuje velké množství variant tohoto útoku, kde některé nepotřebují ani používat klíčové slovo script, či symboly větší / menší, které jsou použity pro označení začátku a konce skriptu. Z tohoto důvodu se nedá použít univerzální řešení, které by odfiltrovalo potřebné symboly, protože se dá opět jednoduše obejít. Místo toho by se měly vstupy validovat podle očekávaných hodnot, například regulárními výrazy.
Druhy XSS – Útok XSS se může vyskytovat v různých podobách a způsobovat různé problémy. Jeho základní rozdělení se ale řídí podle způsobu, jakým je útok doručen k napadenému uživateli – Stored a Reflected XSS. Dalším méně častým typem XSS útoku je DOM-based.
• Reflected – U tohoto typu XSS je škodlivý skript součástí dotazu, který je poslán webovému serveru a je reflektován zpět na uživatele takovým způsobem, že HTTP odpověď obsahuje tento skript z HTTP dotazu. Tímto se docílí jeho spuštění v prohlížeči uživatele. Použitím phishingu a jiných technik sociálního inženýrství, se útočník snaží uživatele nalákat, aby si zobrazil stránku, ke které byl podstrčen skript. Nejčastějším mechanismem, který se k doručení škodlivého skriptu používá, je vložení skriptu do parametru v URL adrese, ta je pak zveřejněna na internetu, popřípadě zasílána emailem. Pokud se uživatel nachytá, výsledkem je, že se skript odešle v dotazu na server a ten jej pošle zpět k uživateli jako součást stránky, která se spustí v uživatelově prohlížeči, včetně podvrženého skriptu. Jelikož skript u tohoto typu XSS není perzistentně uložen na serveru, k provedení útoku je potřeba jej doručit každému uživateli zvlášť.
• Stored – Také označované jako perzistentní XSS. Tento útok zahrnuje akci, kdy útočník do webové aplikace úspěšně vloží skript, který je v ní trvale uložen (například v databázi). Stránka je pak následujícím návštěvníkům zobrazována včetně útočníkem vloženého kódu. Typickými příklady, kde je útok mimořádně účinný, jsou internetové blogy, fóra, či komentářové sekce různých webových stránek.
• DOM-based – Tento XSS útok nastává, když je škodlivý skript spuštěn, jako výsledek úpravy DOM (Document Object Model) prostředí v prohlížeči uživatele. Tam je skript vložen do legitimní funkce zkonstruované vývojáři aplikace. Výsledkem je, že se kód na straně klienta spustí včetně vložené části kódu. HTTP odpověď samotné stránky se však nemění, ale klientská část kódu obsahuje a spouští dodatečně vloženou funkcionalitu díky modifikaci prostředí DOM. Tento útok překonává jakoukoliv ochranu na straně serveru a není možné jeho logování, protože se na server injektovaný kód vůbec nezasílá, což je podstatný rozdíl oproti Stored a Reflected typům XSS.
Příklad – V ukázkách a vůbec k samotné detekci zranitelnosti XSS bývá nejčastěji použit podobný skript, jako je v příkladu 2.

Jak už bylo zmíněno, někdy se používá i kódování, aby skript nebyl na první pohled čitelný a nebylo tak jasné co provádí. Méně zkušení uživatelé by se tak mohli snadno nachytat a myslet si, že se jedná o legitimní součást URL adresy. Adresa pak může vypadat podobně jako v příkladu 4, kde jedná se o dvě naprosto stejné URL adresy.
Nástroje – Stejně jako u SQLi, většina předních výrobců nástrojů pro bezpečnostní testování zařadila XSS mezi testované záležitosti. Tedy nástroji jako je Nessus, w3af, Arachni OWASP ZAP, Burp Suit a jinými lze testovat i výskyt zranitelností typicky využívaných pro útok XSS.
OS Command Injection
OS command injection je technika útoku, jejíž cílem je spuštění libovolného příkazu v příkazové řádce operačního systému, hostujícího webovou aplikaci. Webová aplikace může být na tento útok zranitelná, pokud jsou předávána nějaká uživatelem zadávaná data do příkazů prováděných operačním systémem. Zranitelnost spočívá v nesprávné, nebo žádné validaci uživatelem poskytnutých dat. V tomto typu útoku, je-li úspěšný, získává útočník přístup do operačního systému, a to s oprávněními, pod kterými webová aplikace spouští příkazy, což může být v nejhorším případě i root / administrátor (podle typu OS). S možností spouštět libovolné příkazy operačního systému se útočník může pokusit stáhnout škodlivý software, snažit se o zvýšení uživatelských oprávnění, ukrást hesla k uživatelským účtům, nebo i napadnout jiná zařízení a mnoho jiného.
Druhy OS Command Injection – Podobně jako u útoku SQLi jsou to Error-based a Blind. Rozdělení se řídí pouze podle získání odpovědi od serveru.
• Error-based – Pokud útočník vloží systémový příkaz do vstupního parametru na webové stránce a výsledek se mu objeví v prohlížeči, značně to zjednoduší schopnost detekce, jeli webová stránka na tento útok zranitelná. Poskytnutý výstup může být také ve formě chybové hlášky, která je zapříčiněna pokusem o spuštění zadaného příkazu, což může opět útočníkovi pomoci při opravě a konstrukci dalších příkazů.
• Blind – Výsledky příkazu vloženého do vstupního parametru nejsou na stránce uživateli prezentovány a není tedy dostupná žádná odpověď, zda-li se útok podařil, nebo byl příkaz pouze špatně zadán. Útočník tedy musí použít jinou metodu získání odpovědi, že se mu příkaz podařilo spustit. Jednou z takových možností je například použít příkaz ping. Tímto příkazem lze poslat síťové pakety na zařízení, které má útočník pod kontrolou a díky sledování provozu lze zjistit, jestli se povedlo příkaz provést.
Příklad – Jak již bylo řečeno, riziko, které sebou přináší možnost tohoto útoku, je tvořeno využitím systémového příkazu s parametry dodanými uživatelem. V tomto příkladu 5 se může jednat o vzdálenou správu souborového systému na serveru, kdy funkce vypíše obsah zadané složky. Samozřejmě taková funkce by v žádném případě neměla být přístupná z internetu, zde je uvedena pouze pro ukázku funkcionality útoku.

Jelikož funkce opět nijak neošetřuje uživatelem zadané parametry, lze využít speciálního znaku – středníku, který označí příkaz za ukončený a za něj je možné psát další příkaz, což ovšem není zamýšlenou funkcionalitou. Jako u ostatních útoků typu IIV nelze jednoduše filtrovat znaky jako právě středník, protože může dojít k nahrazení středníku jinými znaky, a s využitím funkcionality kódování se středník opět podaří vložit. Výsledný příkaz v příkladu 5 pak provede výpis domovských adresářů a poté se spustí další, již vložený příkaz, který v tomto případě začne rekurzivně mazat celý disk systému – pokud se ovšem příkaz spouští pod uživatelem se zvýšenými oprávněními.
Nástroje – Pro testování zranitelnosti systému proti útoku OS Command Injection lze použít například tyto nástroje: Burp Suite, Nesssus, Arachni, nebo Commix.
Path Traversal
Útok Path Traversal (také známý jako Directory Traversal) spočívá v tom, že se útočník snaží získat přístup ke složkám a souborům, které jsou uloženy mimo kořenový adresář webové aplikace. Zranitelnost na tento útok vzniká v případě, že se pracuje s uživatelem zadaným vstupem, který se dále používá pro načítání souborů. Není-li uživatelský vstup řádně ošetřen předtím než se použije pro načítání souborů, útočník by mohl být schopen číst libovolné soubory na disku, včetně konfiguračních souborů (jak aplikace tak serveru) a zdrojového kódu aplikace. Avšak soubory, které může útočník takto číst jsou omezeny právy uživatele v operačním systému.
Druhy Path Traversal – Útok je možné rozdělit na dva typy – Relative a Absolute Path Traversal. Rozdělení je založeno na tom, jak je funkce načítání souboru implementována a zda-li omezuje útočníka na zadání relativní cesty k souboru, či může zadat i cestu absolutní.
• Relative Path Traversal – Soubor se načítá z předem zadaného adresáře. Útočník tedy používá speciální kombinace znaků jako jsou „..” a „/” (tečky a lomítka), aby se dostal z aktuálního adresáře a dále pak k souborům na serveru, které chce přečíst.
• Absolute Path Traversal – U tohoto typu útoku není předem zadaná cesta adresáře, ze kterého se soubor načítá. Útočník pak nemusí zadávat cestu od již zad
Příklad – Aplikace používá neověřený uživatelem zadaný vstup pro načítání obsahu textového souboru uloženého na serveru. Následující PHP kód 6 načítá textový soubor z předem zadaného adresáře a se zadanou příponou txt.

Pokud uživatelský vstup není ošetřen, jako je tomu v tomto případě, lze jednoduše několikrát zadat sekvencí znaků „../”, čímž útočník docílí možné změny cesty k souboru. Zbývá ještě problém s pevně zadanou příponou pro textový soubor, což se dá obejít tak, že se za celý řetězec přidá NUL byte (%00). Výsledný vstup pak způsobí, že zbytek textového řetězce za vloženým NUL bytem nebude ve výsledku vůbec přečten. U příkladu 7 pro Absolute Path Traversal je útok o poznání jednodušší, protože v aplikaci se počítá s tím, že bude zadána buďto absolutní cesta, nebo pouze název souboru v lokálním adresáři. Útočníkovi tak stačí zadat přímo absolutní cestu k souboru, bez přidávání jakýchkoliv dalších speciálních sekvencí znaků.
Nástroje – Path Traversal je možné testovat pomocí nástrojů již zmíněných u předešlých útoků, jakou jsou Nessus, w3af , Arachni, OWASP ZAP a Burp Suit . Dále existují nástroje, které jsou určeny přímo pro testování tohoto útoku, příklad je třeba DotDotPwn.
File Inclusion
Aplikace může být zranitelná na útoky typu File Inclusion, pokud se pracuje s uživatelskými vstupy, které jsou dále použity ve funkci, která do zdrojového kódu načítá soubor (například u jazyka PHP funkce include). Pokud se útočníkovi podaří na server nahrát vlastní spustitelný soubor, nebo do nějakého souboru zapisovat, je to velký problém. Podaří-li se takový soubor načíst, provede se i kód uvnitř souboru, a to dává útočníkovi možnost upravit funkcionalitu aplikace a dokonce i spouštět systémové příkazy. Uvedený scénář je jeden z nejhorších případů, který může nastat. Dochází tak k úniku dat, vzdálenému spuštění kódu, nebo kompromitace systému. To ale vyžaduje, aby měl útočník možnost nahrání vlastního souboru na server, nebo alespoň zápis do nějakého souboru, který může později i načíst. Pokud tohle kritérium není splněno, útok degraduje „pouze” na Path Traversal. Rozdílem mezi File Inclusion a Path Traversal je tedy vzdálené spuštění vlastního kódu na serveru.
Druhy File Inclusion – Rozdělení u útoku File Inclusion se řídí podle umístění nahrávaného souboru na Local File Inclusion (LFI) a na Remote File Inclusion (RFI).
• Local File Inclusion – LFI se může objevit, pokud se pracuje s neošetřeným uživatelským vstupem, za účelem vložení souboru do obsahu zdrojového kódu. Při LFI je přímo definovaná složka, ze které se soubor nahrává, proto není možné přímo do vstupu vložit soubor z externího zdroje. Nebo je nahrání externího souboru v aplikaci ošetřeno.
• Remote File Inlcusion – Jako RFI se označuje útok, kde je útočník schopen do běžící webové aplikace nahrát svůj vlastní soubor z externího zdroje. Může se například jednat o skript, který má útočník připravený na svém serveru, ten je nahrán do aplikace, přičemž je proveden. RFI je možné provést, pokud se uživatelský vstup řádně nekontroluje, v aplikaci není pevně nastavena lokace (složka), ze které se bude soubor načítat a není zakázané vkládání URL do parametrů (v případě PHP funkce allow_url_include a allow_url_fopen).
Příklad – V příkladu 8 se nachází ukázka zranitelného kódu ve webové aplikaci. V tomto případě se jedná o LFI, protože první část cesty k nahrávanému souboru je již zadaná v kódu aplikace. Útočník však stále může nahrávat soubory, které jsou umístěné na serveru. V tomto případě se dá použít například technika log poisoning, kdy je chyba vygenerována do logu a součástí této chyby je i skript. Napadený soubor logů je pak nahrán do aplikace což způsobí provedení skriptu, který je jeho součástí.
Nástroje – Vzhledem ke značné podobnosti s útokem Path Traversal 5.4, je možné použít k testování všechny nástroje uvedené u toho útoku i pro File Inclusion. Za zmínku stojí nástroj fimap [53], který je napsán speciálně na testování LFI/RFI.
Příprava testovacího prostředí a nástrojů
Cílem implementační práce je, vytvořit dva testovací nástroje pro demonstraci zranitelností, vybraných v kapitole 4.1.5. Prvním nástrojem by měla být webová aplikace, která bude tyto vybrané zranitelnosti obsahovat. Druhým nástrojem bude jednoduchý skenovací nástroj. Tento nástroj by měl být schopen danou webovou aplikaci otestovat a detekovat výskyt dříve řešených zranitelností. V kapitole 7 je pak popsána reimplementace zranitelných prvků aplikace. Takto opravená aplikace bude opět testována stejnými metodami. Výsledky obou testů budou porovnány.
Struktura kapitoly:
1. Volba použitých technologií – v této sekci jsou uvedeny statistiky, na jejichž základě byly zvoleny technologie použité při tvorbě webové aplikace. 2. Příprava virtuálního prostředí – testovací webová aplikace, na které probíhá veškeré testování běží ve virtuálním prostředí, zde je popsána příprava tohoto prostředí. 3. Testovací webové aplikace – v této části kapitoly jsou popsány jednotlivé stránky webové aplikace. 4. Testovací penetrační nástroj – zde je popsána funkce penetračního nástroje a možnosti s jakými může být spuštěn.
Výběr technologií pro webovou aplikaci
Výběr zranitelností a útoků, které jsou v diplomové práci zpracovávány je založen na statistikách, získaných v rámci průzkumu oblasti bezpečnosti webových aplikací. Stejně tak technologie pro implementaci testovacího prostředí bude podložen jistými statistikami. Výsledkem implementace by měla být malá až středně velká webová aplikace. Pro tato kritéria se asi nejlépe hodí využití technologií PHP, MySQL, Apache. Tato kombinace je dnes velmi populární. Při nasazení na operačním systému unixového typu, jako je na příklad linuxová distribuce Ubuntu (kterou zde využiji), lze dosáhnout řešení, a přitom se také vyhnout poplatkům spojeným s licencemi. To může být často i cílem menších společností, tedy důvodem zvolení a použití této kombinace technologií.
Programovací jazyk
Co se programovacích jazyků na straně serveru týká, tabulka 8 ukazuje, že u webových aplikací je největší zastoupení jazyka PHP. Ačkoliv ve firemním prostředí se často můžeme setkat s řešeními, založenými na technologiích ASP.NET a Java EE. Jazyk PHP na veřejné síti v počtu použití nemá konkurenci. Ostatní jazyky jako jsou Ruby, Python a jiné, jsou využívány oproti již zmíněným jazykům jen zřídka. Pro implementaci testovací webové aplikaci si tedy volím jazyk PHP.

Webový server
Tabulka 9 ukazuje dnes nejpopulárnější používané webové servery, kde aktuálně stále vítězí Apache. Webový server Nginx zažívá v poledních letech vcelku solidní vzrůst v počtu použití, ale Apache je stále ještě nejpoužívanějším, proto bude také použit i při implementaci této testovací aplikace.

Operační systém
Windows je dnes nejběžněji používaný operační systém pro notebooky a stolní počítače, co se serverové stránky týče, tam zase převládají systémy unixového typu. V tabulce 10 je ukázáno, že aktuálně dvě třetiny ze všech veřejně dostupných webových aplikací používá jako hostující systém nějaký operační systém unixového typu.

Databáze
Při porovnávání databázových systémů byl využit jiný zdroj než u předchozích výběrů. DB-Engines nesrovnává počty instalací databází, ani jejich využití pro určitá použití v IT odvětví – z toho důvodu lze tento zdroj vidět pouze jako ukazatel popularity různých databázových systémů. Zvolenou databází pro implementaci je MySQL, která je na žebříčku popularity umístěna jako druhá, hned za databází Oracle. MySQL je často používána v kombinaci s ostatními vybranými technologiemi. V rámci průzkumu bylo zjištěno, že se často používá v menších projektech.
Virtuální prostředí
K testovacím účelům bylo zapotřebí virtuální operační systém, který reprezentuje server hostující webovou aplikaci. K použití je zvolen virtualizační nástroj QEMU/KVM. Hostujícím operačním systémem pro virtuální server byla linuxová distribuce Fedora, proto instalace QEMU/KVM byl poměrně triviální úkol (viz. 10).
Testovací webová aplikace
Původně měla mít každá zranitelnost (viz. kapitola 5) vytvořenou jednu stránku, která obsahuje chybně implementovanou, zranitelnou funkci, ale nakonec má zranitelnost XSS stránky dvě – jednu pro typ Reflected a druhou pro Stored. Naopak zranitelnosti Path Traversal a File Inclusion sdílejí, vzhledem k jejich podobnosti, stránku jednu. Zranitelnosti SQL Injection a OS Command Injection už mají obě vyhrazené po jedné stránce. Implementace je provedena pomocí jazyka PHP (verze 7.1.16) v čisté podobě. Nebyly použity žádné rámce (frameworks), aby se daly ukázat čisté formy zranitelností, možnost jejich zneužití a také opravy. Určité rámce obsahují metody, které některé zranitelnosti eliminují. Ale takové metody mohou být přímo závislé na použitém rámci, který má implementované rozšiřující funkce a právě jejich použití napomáhá k ošetření dané zranitelnosti. Jiné rámce takové funkce mít nemusí, proto jsou zranitelnosti a následná obrana proti nim, předvedeny bez jakýchkoliv přidaných funkcionalit. Jelikož je cílem implementace demonstrace zranitelností, nejsou zde řešeny žádné programovací architektury či vzory. Celá aplikace je pak napsána v jednoduchém stylu, obsahujícím několik funkcionalit, které mohou být napadeny.
SQL Injection
Stránka pro SQL Injection (obrázek 8) reprezentuje listování v seznamu článků, kde je možné vyhledávání podle unikátního parametru. Články jsou uloženy v databázi odkud jsou i načítány. Stránka obsahuje formulář s jednou vstupní hodnotou pro vyhledávání podle názvu. Parametr je předán do podmínky dotazu, který poté do stánky načítá všechna nalezená data. V případě jakéhokoliv problému je chyba propagována přímo těla do stránky.

Reflected XSS
Stánka pro Reflected XSS je téměř stejná jako stránka pro SQL Injection 6.3. Jediným rozdílem je, že načítá obsah z jiné tabulky v databázi, aby se předešlo problémům při zobrazování obsahu, který by mohl být do jedné z těchto tabulek vložen.
Stored XSS
Pro potřeby demonstrace útoku Stored XSS, bylo potřeba ukládat obsah od uživatele do databáze. Jelikož v databázi již byly vytvořené tabulky pro články, byly použil podobné i pro tento příklad. Přes webový formulář bylo možné vkládat články do databáze, a ty se následně načítaly do téže stránky. Funkcionalita je obdobná jako u návštěvních knih, či komentářových sekcí stránek, které se běžně vyskytují na internetu.
OS Command Injection
Pro demonstraci útoku OS Command Injection bylo nutné, aby stránka používala nějaký systémový příkaz, který závisel na parametru, jež zadává uživatel stránky. Jako testovací příklad byla vytvořena stránka (obrázek 9), která umožňuje uživateli vytvářet soubory na serveru. Data tentokrát nejsou ukládána do databáze, ale přímo na souborový systém.

Path Traversal / File Inclusion
Stránka připravená pro útoky Path Traversal a File Inclusion zobrazuje článek, u kterého je možné změnit jazyk zobrazení. Tato funkcionalita je provedena pomocí PHP funkce include, která načítá obsah souboru, dle vybraného jazyka zobrazení. Aby bylo možné provést i útok File Inclusion, bylo nutné na serveru udělat dodatečné úpravy v konfiguraci souboru, který se stará o automatické generování log souborů pro webový server Apache, tak aby běžný uživatel mohl logy přečíst. V původní konfiguraci jsou soubory logů vytvářeny tak, aby je nemohli přečíst uživatelé, kteří k tomu nemají oprávnění. Uživatel, pod kterým webová aplikace běží taková oprávnění nemá. Důvodem za povolením čtení těchto souborů může být situace, kdy má webová aplikace nějakou formu administrátorské sekce, včetně monitorování stránek. Pak by bylo jedno z možných řešení jak tento monitoring provést, načítáním zmiňovaných logů do webové aplikace.

Testovací penetrační nástroj
Nástroj pro penetrační testování byl napsán v jazyce Python (verze 3.6.4). Jeden z hlavních důvodů volby tohoto jazyka je množství použitelných knihoven. Je tak možné poměrně rychle vytvořit funkční aplikaci a to v krátkém čase.
Funkce nástroje se dělí na dvě hlavní části. V té první si nástroj zjistí všechny dostupné stránky na testované webové aplikaci. Na jednotlivých stránkách se přitom vyhledávají i vstupní body ve formě HTML tagů form a následně input. Tato detekce probíhá zkoumáním zdrojového kódu stránek za pomocí knihovny scrapy. Všechna nalezená data se předávají do druhé fáze programu, která provádí testování. Pro každou zranitelnost je vytvořena vlastní třída, obsahující seznam útočných vstupů, které se zasílají do jednotlivých vstupních bodů. Třída dále obsahuje seznam očekávaných výstupů, které se ve stránce následně kontrolují. Pokud je očekávaný výstup nalezen, je vstupní bod označen jako zranitelný na provedený útok. Takto se cyklicky provede testování na všechny nalezené vstupní body.
stování na všechny nalezené vstupní body. Na obrázku 10 je zobrazena nápověda pro penetrační nástroj. Jak lze vidět, jedná se o vcelku přímočarý přístup, kde v podstatě stačí nástroji poskytnout URL adresu stránky, která bude testována. Nástroj pak pracuje sám automaticky, bez potřeby interakce, dokud se test nedokončí. Ostatní možnosti jsou volitelné a slouží k omezování nástroje. Pokud je zapotřebí otestovat pouze jednu URL adresu, aniž by nástroj hledal odkazy na další stránky, které by také testoval, je možné nástroj spustit v restricted režimu. Další možné omezení se týká simulace útoků. Pokud mám stránku, kterou chci otestovat jen na SQL Injection, je možné přidat omezení ve formě parametru attacks a argumentu, patřícímu příslušnému typu testování. Různé ukázky a kombinace použití nástroje jsou uvedeny ve výpisu

Testování a oprava zranitelností
Tato kapitola je vyhrazena manuálnímu testování zranitelné webové aplikace. Každá zranitelnost má připravenou stránku, na které testování proběhne. Jedná se pouze o demonstraci útoku, proto zde nebude probíhat testování všech možných zranitelností pro všechny možné vstupní body ve webové aplikaci. Přístup k testu může být klasifikován jako Black Box, kde první fází bude předpoklad funkcionality testované stránky. Následně bude popsáno testování včetně chování aplikace na různé testovací vstupy. Po „odhalení“ zranitelnosti bude následovat i její oprava pro mou testovací aplikaci. Na konci každé podkapitoly budou doplněny i možnosti výskytu zranitelnosti a alternativní tipy zabezpečení aplikace. Všechny tipy, včetně referencí na dodatečné zdroje, jsem sepsal do samostatného dokumentu, který je součástí přiložených materiálů.
Struktura kapitoly:
1. Testování SQL Injection – Testování stánky probíhá pomocí union-based metody.
2. Testování Cross Site Scripting – Popsána bude pouze ukázka Reflected XSS, všechny použité metody a postupy by se daly replikovat i pro Stored XSS.
3. Testování OS Commang Injection – Zranitelnost je testována v error-based formě.
4. Testování Path Traversal a File Inclusion – Nejdříve bude popsán útok Path Traversal, na který bude navázán útokem LFI. Jelikož se jedná o podobné útoky a testování probíhá na stejné stránce, jsou zařazeny do jedné kapitoly.
5. Hromadný test – Na základě manuálních testů různých stránek vznikl nástroj pro automatickou detekci zranitelností, z jeho pomocí bude otestována jak zranitelná tak i zabezpečená testovací aplikace.
SQL Injection
Stránka pro SQL Injection obsahuje jeden vstupní bod, který je použit pro vyhledávání ve článcích, které jsou na stránce zobrazeny. Jsou-li data uložena a načítána z databáze, je vcelku možné, že v databázovém dotazu figuruje podmínka WHERE, kterou je redukován počet načtených článků, podle zadaného klíčového slova. Pokud je tohle tvrzení pravdivé a neprobíhá validace, ani sanatizace vstupů, je možné úspěšně provést útok SQL Injection. Prvními zasílanými vstupy, které jsem použil k otestování funkce formuláře jsou znaky ", ’ a %.

Při zadání znaku uvozovky, stránka nevrátila žádné výsledky, ani chyby (viz. obrázek 11). Ale při zadání znaku procenta, byly zobrazeny všechny články, jako by k žádnému vyhledávání nedošlo (viz. obrázek 11), což potvrzuje, že filtrování článků probíhá v databázovém dotazu v podmínce WHERE. Za pomocí dříve zmíněných znaků v kombinaci se všemi možnými znaky, které se v databázích používají pro komentáře, lze zjistit, nejen že je aplikace zranitelná na útok SQL Injection, ale také, že se jedná o databázový systém MySQL, nebo MariaDB. Pomocí dalšího zkoumání, které probíhá ve formě UNION SELECT tabulky INFORMATION_SCHEMA, lze získat informace o všech tabulkách v databázi. Je tak možné bez problému číst veškerý obsah databáze pomocí podobných dotazů, jako je zobrazen na obrázku 12.

Část zdrojového kódu zranitelné stránky je zobrazena ve výpisu 14, kde jde jasně vidět, v čem je problém. Vstup od uživatele je přímo předán databázovému dotazu, což znamená, že je kdokoliv schopen pozměnit původní funkci dotazu.

Možný výskyt zranitelnosti:
• Předpokladem je práce s relační databází, používající jazyk SQL. • Databázové dotazy jsou tvořeny na základě uživatelem zadanými daty, bez jakékoliv kontroly. • Dynamicky tvořené SQL dotazy. To platí jak pro programovací jazyk aplikace, tak pro databázové procedury.
Možnosti obrany:
• Preferovanou možností je použití parametrizovaných dotazů (Prepared Statement), pokaždé, kdy do SQL dotazu vstupují data poskytnutá uživatelem aplikace. • Použití uložených procedur v databázi. Pokud jsou implementovány správně, mají uložené procedury stejný efekt jako Prepared Statemens (použití parametrizovaných dotazů uvnitř procedur). • Pozitivní validace vstupů – whitelisting. • Escapování všech uživatelských vstupů (mělo by být použito jen v případě, kdy není možné použít jiné metody obrany).
Cross Site Scripting
Stránka obsahuje seznam článků, ve kterých je možné vyhledávat podle názvu článku. V případě XSS nezáleží na tom, odkud jsou data načítána. Co ale podstatné je, že při odeslání formuláře se zadaným vstupem pro vyhledávaní se ten samý textový řetězec znovu objeví na stránce. Pokud aplikace neošetřuje speciální znaky používané pro HTML, je dost možné, že bude útok XSS proveditelný. Klasickým testovacím vstupem, jako je na obrázku 13, bylo ověřeno, že je aplikace zranitelná na útok XSS.

V programovacím jazyce PHP existuje funkce htmlspecialchars, která dokáže vcelku efektivně aplikaci i její uživatele ochránit před útoky XSS. Největším problémem, který se vyskytuje v souvislosti s použitím této funkce, je nutnost každý vstup i výstup webové aplikace ošetřit. Zapomene-li se na jediný, je to vše co stačí proto, aby zranitelnost mohla ve stránce existovat. Ve své aplikaci jsem pomocí již zmíněné funkce ošetřil všechny vstupy do webové aplikace stejným způsobem jako je v příkladu 17
Možnosti obrany:
• Escapování všech dat vstupujících do webové aplikace. • Vyvarovat se vkládání uživatelem poskytnutých dat do atributů HTML elementů. • Pozitivní validace vstupů – whitelisting. • Některé template engines mohou pomoci s ochranou aplikace proti XSS
OS Command Injection
Stránka poskytuje uživateli formulář pro vytváření souborů na serveru. Tato funkcionalita může být dosažena jak funkcemi programovacího jazyka, tak za pomocí systémového příkazu. Jednáli se o případ, kdy je použita varianta se systémovým příkazem a vstup není řádně ošetřen, je možné provést pokus o vložení dodatečného příkazu. Pomocí speciálních znaků & a ; lze otestovat, zda se jedná o volání systémového příkazu. Tyto znaky jsou používány k ukončení příkazu, za který je pak možné přidat další příkaz. Z pozorování funkce formuláře lze zjistit, že aplikace přidává na konec řetězce vlastní příponu souboru, ve formě txt, aby nebylo možné vytvářet spustitelné soubory (například PHP skript). Dochází-li ke spojování textových řetězců a jedná se skutečně o systémový příkaz, pokud se přidá středník za konec jména, měl by se soubor vytvořit bez přípony txt, čímž je možné vytvořit soubor jakéhokoliv typu – což se také stalo. Je tedy potvrzeno, že vstup je zranitelný na útok OS Command Injection.
Pokud je aplikaci zaslán vstup ve formátu středník – příkaz – středník, mělo by dojít ke spuštění dodatečného příkazu uvnitř funkce. Na obrázku 14 je ukázka, co se stane, když se mezi středníky zadá příkaz id. Je zjištěno, že příkazy jsou prováděny pod uživatelem www-data, jehož uživatelskými oprávněními jsou omezeny všechny příkazy odeslané na server.

Možný výskyt zranitelnosti:
• Použití systémového příkazu, který je závislý na vstupu od uživatele.
Možnosti obrany:
• Použít jinou metodu, která umožní dosáhnout stejné funkcionality i bez volání systémového příkazu. • Nedovolit uživateli přímý vstup do systémového příkazu. • Pozitivní validace vstupů – whitelisting. • Escapování všech uživatelských vstupů (mělo by být použito jen v případě, kdy se není možné použít jiné metody obrany).
Path Traversal a File Inclusion
Ve stránce je zobrazen článek, u kterého existuje možnost změnit jazyk zobrazení. Článek se musí načítat z nějakého zdroje – může se jednat například o databázi, nebo soubor. Za předpokladu, že jako úložiště je použit soubor, který se celý načítá do stránky, mohlo by dojít k manipulaci cesty cílovému souboru. Místo článku v jiném jazyce by mohlo dojít k pokusu o načtení úplně jiného souboru uloženého na serveru. Při zadání absolutní cesty souboru /etc/passwd je vypsána chyba, což může znamenat, že aplikace používá jiný způsob načítání obsahu, je proti tomuto útoku ošetřena, nebo je dopředu zadána nějaká cesta (například složka). Dalším pokusem je zadání relativní cesty k souboru. Pokud se dostatečně mnohokrát přesunu do rodičovského adresáře a poté zadám cestu k souboru, soubor se vypíše jako na obrázku 16

Je možné do stránky načítat soubory na serveru což je samo o sobě dost nebezpečné. Co by bylo ještě nebezpečnější, kdyby se stránky podařilo načítat obsah, který serveru zaslán. Toho by šlo dosáhnout, pokud bych měl přístup ke čtení některého z logů hostujícího serveru webové aplikace. Pokusem o načtení několika známých lokací, kde se běžně logy vyskytují, se podařilo načíst soubor /var/log/apache2/access.log (obrázek 17). V takovémto případě je možné provést útok LFI. Součástí přiložených materiálů je pak předvedena i technika log poisoning, díky které je možné do logu zapsat vlastní kód a ten pak načíst do obsahu stránky.

Možný výskyt zranitelnosti:
• Při práci se soubory, nebo složkami se pracuje s daty zadanými uživatelem aplikace. • Neohraničené cesty k načítaným souborům. • File Inclusion – čitelné log soubory. • File Inclusion – možnost nahrání externího souboru na server.
Možnosti obrany:
• Nepovolit uživateli přímou manipulaci s funkcí, která pracuje se soubory (složkami). • Použít předem nastavených podmínek pro načítání souborů, jestliže je volba souboru přenechána uživateli. • Ohraničení cesty k načítanému souboru. • Pozitivní validace vstupů – whitelisting. • Na systémech unixového typu je možné použít chroot jail, který dokáže zabránit v listování složek, za nově definovaným kořenovým adresářem. • Je-li to možné, zakázat stránce načítat soubory z externích zdrojů (například v PHP allow_url_fopen, allow_url_include).
Testování pomocí vytvořeného nástroje
V penetračním nástroji je zakomponováno mnoho testovacích vstupů, včetně těch, které byly použity pro manuální testování aplikace v rámci této kapitoly. Obrázky 18 a 19 jsou srovnáním výsledků testování pomocí penetračního nástroje. Jak je vidět, ve zranitelné aplikaci byly dle očekávání objeveny všechny zranitelnosti nejméně jednou. Oproti tomu v opravené aplikaci již nebyl nalezen žádný zranitelný vstup. V přiložených materiálech se nachází reporty vygenerované nástrojem pro penetrační testování Arachni, který v opravené aplikaci také žádné z řešených zranitelností nedetekoval.

Obecná doporučení pro vývoj webových aplikací
Tato doporučení nejsou vázána na žádnou platformu ani technologii. Jsou to obecné rady, které mohou pomoci s oblastí bezpečnosti při vývoji webových aplikací. Ačkoliv je tato práce zaměřena hlavně na zranitelnosti IIV, zejména pět určitých útoků, které je využívají. Jsou zde uvedeny i rady týkající se jiných problémů. Aby aplikace mohla být považována za opravdu bezpečnou, nestačí pouze vzít v úvahu následujících několik bodů. Je potřeba provádět neustálé revize zdrojových kódů, pravidelné testování aplikace, kontrolu verzí použitého software a mnoho dalšího. Jak už bylo nejednou řečeno, bezpečnost není záležitost, která se jednou aplikuje a trvá navždy.
• Správná validace (sanitizace) vstupů
Nikdy nepracovat s uživatelským vstupem v jeho původní podobě. Pokud se pracuje s databází, použít Prepared Statements. Jsou-li data zobrazována na webových stránkách, je potřeba použít escapování. Uživatelem zadaná data vstupují do funkcí – filtrování podle kontextu, validace, whitelisting. V několika předešlých kapitolách byla řešena právě tato problematika – nesprávně validované vstupy. Ve většině případů je lepší použít whitelisting než blacklisting. Explicitně se určí, jaké znaky mohou data obsahovat, nebo v jakém mají být formátu. S dobře rozmyšleným regulárním výrazem se výrazně sníží možnosti útoku. Pokud však nemůže být v daném kontextu použit whitelist, je dobré použít alespoň validaci pomocí blacklistu. Blacklisting může být dobrá ochrana, ale hlavní problém u této metody je, že je snadné na něco zapomenout.
• Zabezpečit autentizační a autorizační mechanismy
Pokud je to možné, je vhodné použít více faktorovou autentizaci. Ta může zamezit přihlášení pod uživatelským účtem, jehož přihlašovací údaje byly ukradeny. Implementace mechanismu, který kontroluje slabá hesla (v hesle je zakomponované přihlašovací jméno, použití pouze písmen / číslic, kontrola oproti slovníku známých, slabých hesel). Limitovat pokusy o přihlášení – zamezí se tak brute force a slovníkovým útokům. Ukládání hesel a citlivých údajů pomocí dostatečně silných kryptografických mechanismů (PBKDF2 + SHA-256 s dostatečným počtem iterací). Logování neúspěšné autentizace. V případě velkého množství neúspěšných pokusů o přihlášení zablokovat účet a kontaktovat majitele. Bezpečná správa sezení. Session ID vždy generuje server, mělo by být dostatečně dlouhé s vysokou entropií, bezpečně uložené a označeno jako nevalidní po odhlášení uživatele, nebo dlouhé neaktivitě.
• Zbytečné vyzrazování informací
Chybové hlášení nikdy nepropagovat do webové aplikace. Pro účely ladění a vývoje programu je užitečné mít přehled o jeho chování, s čímž souvisí různé výstupy, které si vývojář nechává vypisovat. Pro tyto účely je však dobré použít mechanismus, který dokáže globálně vypnout a zapnout ladicí výpisy. V jiném případě je lepší využít konzole či log soubory. Předejde se tak problému, že se na některý z výpisů do webových stránek zapomene, což pak útočníkům vyzrazuje dodatečné informace o aplikaci. Nastavit server tak, aby o sobě nevyzrazoval zbytečně moc informací (aplikační server, programovací jazyk, verze software, atd.).
• Aktualizace software
V každém novém produktu se časem objeví nějaká bezpečností chyba, které se dá zneužít a musí být opravena. Na administrátorech serverů je, aby udržovali svůj software co možná nejaktuálnější.
• Monitorování a logování
Monitorování podezřelých aktivit může odhalit blížící se útok. Logování nepovolených vstupů může pomoci s analýzou zranitelnosti v případě úspěšného útoku.
• Princip nejnižšího oprávnění
Každý účet a modul by měl mít přístup pouze k informacím a zdrojům, které potřebuje ke své funkcionalitě. V případě úspěšného zneužití zranitelnosti se tímto opatřením může snížit dopad škod na minimum.