IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Formulář s SID
index.php

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.


 

Predchádzajúci článok
Útok DDoS a ako sa pred ním brániť
Všetky články v sekcii
Bezpečnosť webových aplikácií v PHP
Preskočiť článok
(neodporúčame)
Spam a ako sa proti nemu brániť
Článok pre vás napísal Jan Hranický
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity