9. diel - Session HIJACKING a ako sa proti nemu brániť
V predchádzajúcej lekcii, Útok DDoS a ako sa pred ním brániť , sme sa zoznámili s útokom DDoS a tiež sme si uviedli spôsoby, ako pred týmto útokom svoju aplikáciu chrániť.
V tejto lekcii kurze bezpečnosť webových aplikácií sa zoznámime s útokom Session HIJACKING. Session HIJACKING je typ útoku, pomocou ktorého útočník ukoristí tzv. S ession ID (skrátene SID). SID je náhodne vygenerovaný token, pomocou ktorého sa útočník môže vydávať za užívateľa (čiže nás).
SID
SID užívateľa je náhodne vygenerovaný token, pomocou ktorého server páruje požiadavky konkrétnych užívateľov. Všeobecne sa k SID viažu informácie ako je prihlásenie užívateľa či objednávka na e-shope. Jeho odcudzenia je preto veľké bezpečnostné riziko. V dnešnej lekcii si ľahko zmienime odcudzenia SID uhádnutím a potom sa zameriame na samotný Session HIJACKING.
Prečo vôbec SID používať
HTTP je samo o sebe bezstavový komunikácie. Pri každej návšteve nejaké stránky si server nepamätá, či ju používateľ už navštívil alebo či na nej treba nebol prihlásený pár sekúnd na späť. Z tohto dôvodu sa vyvinulo SID. SID je hodnota, vďaka ktorej si môže server v HTTP komunikácii uchovávať akési stavy. Server si tak môže uchovať obsah košíka zákazníka či zapamätať, že bol zákazník pred krátkou dobou na tomto zariadení autorizovaný a nebude tak vyžadovať prihlasovacie údaje znova.
Metódy zasielanie SID
Najskôr si uvedieme spôsoby, ako si medzi sebou môžu klient a server SID vymieňať. Uvedieme si základné 3 spôsobmi:
- Parameter v URL adrese
- Skryté formulárové pole
- cookies
Parameter v URL adrese
V tomto prípade si server pridá do odkazu parameter s hodnotou SID v
požiadavke GET
, ako príklad si môžeme uviesť:
stranka.cz?SID=clientSID
Pri otvorení takéhoto dopytu sa odovzdáva hodnota SID. Na strane servera
môžeme potom k hodnote SID pristúpiť pomocou super globálneho poľa
GET
:
$sid = $_GET['SID'];
Skryté formulárové pole
Táto metóda naopak využíva požiadavke POST
, v ktorom zašle
SID. SID sa typicky vložia do skrytého formulárového poľa, ktoré sa
odošle v tele požiadavke servera. Príklad formulára môže byť
nasledujúce:
<form action="welcome.php" method="get"> <input type="hidden" name="sid" id="sid" value="$clientSID" /> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form>
V prehliadači normálne skryté poľa nevidíme:
Cookies
Posledná metódou je uloženie cookie na strane klienta. Tá sa potom s
každým ďalším požiadavkou servera posiela v HTTP hlavičke požiadavke. U
dotazu sa posiela pomocou Cookie
au odpovede potom pomocou
Set-Cookie
. Ukladanie SID za pomocou cookie je v dnešnej dobe
najpoužívanejšie variant.
Session HIJACKING
Session HIJACKING je útok, pri ktorom sa útočník snaží získať používateľov SID. Spôsobov, ako docieliť odcudzenia SID, je hneď niekoľko, dnes si uvedieme:
- Útok hrubou silou
- Cross-site scripting (XSS)
- Session side jacking
- session Fixation
- Odcudzenie SID za pomocou malware
Útok hrubou silou
Pri útoku hrubou silou útočník skúša postupne rôzne kombinácie SID, kým sa mu nepodarí validný SID uhádnuť. Aby sme zamedzili tomu, že sa útočník pokúsi SID uhádnuť alebo odhaliť, mali by sme zabezpečiť, aby každé vygenerované SID malo nasledujúce vlastnosti:
- Unikátnosť - Každý užívateľ a každá jeho návšteva by mala dostať unikátny, doteraz nepoužitý token.
- Náhodnosť - Nemalo by byť možné napodobniť podmienky, ktoré dovedú ku generácii SID, ktoré je už pridelené. Tomu sa rozumie, že by sme nemali SID generovať napríklad z IP adresy používateľa.
- Nezávislosť - Ako bolo spomenuté u predchádzajúcej vlastnosti, SID by sa nemalo viazať na žiadny zmysluplný údaj.
- Neodvoditelnost - Nemalo by byť možné zistiť spôsob generácie SID z niekoľkých už vygenerovaných SID.
- Dostatočná dĺžka - Čím dlhšia je nami vygenerovaný SID, tým dlhšie bude útočníkovi trvať, než ho uhádne.
- Exspirácia - SID by nemalo by malo byť obmieňané v intervale 5-30 minút.
Spoločne s týmito vlastnosťami môžeme napríklad generovať také SID, ktorá neobsahujú nejaký znak na začiatku, napríklad 0. Ak dostaneme požiadavku s týmto znakom, okamžite môžeme prehlásiť, že sa niekto snaží dostať do našej aplikácie pomocou útoku hrubou silou.
V PHP nám pre generovanie SID bohato stačí obsluha SESSION
,
ktorá vyššie uvedené vlastnosti zohľadňuje. Avšak tieto vlastnosti
neplatí len pre generovanie SID, ale aj pre akýkoľvek iný náhodne
generovaný token. Pod týmto tokenom si môžeme napríklad predstaviť token,
používaný pre obranu proti CSRF
útoky z jednej predošlej lekcie.
V PHP sa session ID vygeneruje automaticky po vykonaní príkazu
session_start()
. Samotný SID môžeme dostať pomocou funkcie
session_id()
. Nasledujúce kus kódu teda vygeneruje SID a vypíše
ho:
session_start(); echo session_id();
Môžeme tiež vygenerovať SID, ktorý neobsahuje nami zvolený znak. To urobíme napríklad takto:
session_start(); $sid = session_id(); while ($sid[0] == 0) { session_regenerate_id(); $sid = session_id(); }
Pre generovanie náhodných tokenov by sme mali využiť vstavaných funkcií. Relatívne bezpečnou cestou ako vygenerovať náhodný token v PHP je:
$token = md5(uniqid(mt_rand()) . $_SERVER['REMOTE_ADDR']);
Náhodne vygenerované číslo pripojíme k IP adrese používateľa az
kombináciou týchto čísle vygenerujeme náhodné id pomocou
mt_rand
, výsledok ešte zahashujeme pomocou funkcie
md5
.
Cross-site scripting (XSS)
Cross-site scripting útok možno použiť pre odcudzenie SID, na tento typ útoku už existuje v tomto kurze samostatná lekcie, viac detailov sa preto môžeme dozvedieť práve v lekcii o XSS, kde je tiež uvedený príklad s ukradnutím session admina. XSS je v rýchlosti typ útoku, pri ktorom útočník (napríklad do komentára na stránke) uloží kus kódu, ktorý potom používateľov prehliadač interpretuje v útočníkov prospech.
Session side jacking
Pri tomto type útoku útočník využije softvér, pomocou ktorého možno zobraziť pakety prúdiacej v sieti a priamo z nich dostane SID používateľa. Veľa stránok používa SSL / TLS kódovanie iba pre prihlasovací formulár, zo zvyšku komunikácia môže útočník SID bez problému vyčítať a ďalej ho zneužiť. Útočník ale potrebuje prístup do siete používateľa, tento typ útoku je preto typický pre verejné Wi-Fi siete.
Session Fixation
Session fixation využíva weby, ktoré zasielajú SID v požiadavke
GET
pomocou parametra v URL. Toho môže útočník pomerne
jednoducho využiť. Môže napríklad užívateľovi zaslať falošný e-mail
alebo ho iným spôsobom nalákať na prihlásenie na takto zraniteľný web cez
jeho vytvorený odkaz. Takýto odkaz by mohol vyzerať nasledovne:
<a href="http://www.zranitelnaStranka.cz/login.php?SID=UtocnikemDodanySID">Kliknutím se přihlaste</a>
Potom čo používateľ klikne na takto vytvorený odkaz, je presmerovaný na stránky takto zraniteľného webe, kde sa prihlási s útočníkom dodaným SID. Ak sa tak stane, útočník má teraz k dispozícii aktívny SID, pod ktorým je jeho obeť prihlásená.
Odcudzenie SID za pomocou malware
Posledná metódou útoku Session HIJACKING je odcudzenie SID za pomocou
malware. Táto metóda je veľmi bežná, užívateľ si nechtiac infikuje
počítač útočníkovým malwarom, ten je pomocou neho schopný odchytávať
cookies z internetového prevádzky používateľa alebo k nim dokonca môže
priamo pristúpiť. Cookies sú často ukladá dočasné súbory prehliadača v
priečinku cookieJar
.
Ako sa pred útokom Session HIJACKING brániť
Teraz si uvedieme niekoľko spôsobov, ako sa pred útokom Session HIJACKING brániť.
Použitie HTTPS
protokolu
Použitím protokolu HTTPS
docielime toho, že celá
komunikácia v rámci session
našu aplikácia bude šifrovaná za
pomocou SSL/TLS
. To zabráni útokom typu
Session side jacking
, pretože používateľ teraz nebude schopný
jednoducho vyčítať SID z komunikácie medzi klientom a serverom. Najvyššie
môžeme použiť HSTS
protokol, ktorý je ešte o niečo
prísnejšie ako HTTPS
.
Generovanie náhodného SID
Ako sme si už uviedli v časti o útokoch hrubou silou, je dôležité generovať SID, ktoré nejdú ľahko uhádnuť či odvodiť. Najlepšie urobíme, keď do SID pridáme nejakú kombináciu znakov, ktorá nám prezradí, že sa niekto pokúša o útok hrubou silou.
Generovanie nového SID po prihlásení
Dôležité tiež je, aby sme po prihlásení užívateľa vygenerovali SID znova, toto opatrenie zamedzí útokom typu session fixation. Útočník totiž síce pozná SID, pomocou ktorého sa užívateľ prihlásil, ale pretože ihneď po prihlásení vygenerujeme SID nové, je také staré SID útočníkovi k ničomu.
Ďalšie spôsoby autorizácie
Ďalším spôsobom ako zamedziť session hijack útokom je pridať ďalšiu
vrstvu overenie používateľa. Takéto overenie môže kontrolovať IP adresu,
z ktorej je používateľ väčšinou prihlásený a ak príde požiadavka na
autorizáciu z inej IP adresy, bude užívateľ musieť potvrdiť prihlásenie
cez e-mail alebo 2FA
. Ďalšia takou metódou je ukončenie
session
po uplynutí určitej doby, po ktorú bol užívateľ
neaktívny
V ďalšej lekcii, Spam a ako sa proti nemu brániť , sa zoznámime s útokom SPAM.