NCieľom zadania je vyskúšať si, akým spôsobom možno zneužívať zraniteľnosti vo webových prehliadačoch. Zadanie je zamerané na dve zraniteľnosti, ktoré by ste už mali poznať z UPB, t.j. XSS (Cross-site scripting) a CSRF (Cross-site request forgery). Úlohou bude tieto zraniteľnosti nájsť a skonštruovať útok.
V rámci tohto zadania budeme opäť pracovať s HTTP serverom, ktorý poznáte z predchádzajúcich zadaní (viď. github). Celá práca na útokoch bude prebiehať v prehliadači, t.j. už nehrá úlohu s akými nastaveniami spustíme náš server (s NX alebo bez), dôležité je však vedieť cez prehliadač pristúpiť na stránku, ktorá na danom serveri beží.
Na serveri beží stránka vyvíjaná v Pythone, pomocou webového frameworku Flask. Umožňuje prihlasovanie/registráciu používateľov (pri registrácii dostane každý používateľ 10 fcoinov), posielanie fcoinu iným používateľom, vyhľadávanie používateľov, výpis prebehnutých transakcií a pod. Pochopiteľne, služba obsahuje viacero zraniteľností.
Cieľom prvej úlohy je skonštruovať útok (konkrétne URL), ktorého účelom je ukradnúť cookie dáta obete, ktorá na daný link klikla (budeme predpokladať že obeť je aktuálne prihlásená). Prvým krokom je nájsť XSS zraniteľnosť na webe. Odporúčam sústrediť sa na rôzne input polia, ktoré sa nachádzajú na jednotlivých podstránkach webu. Vhodným pomocníkom je samotný prehliadač, ktorý umožňuje prezerať zdrojový kód stránky, prípadne ho aj ladiť. Ideálne je postupovať po krokoch. Ak si myslíme, že sme našli zraniteľnosť, je dobré spustiť nejaký jednoduchý skript, napr. alert(„XSS“), pomocou ktorého si skutočne overíme, či vieme spúšťať nami zvolený kód. HINT: z minulých zadaní si určite spomínate, ako funguje náš HTTP server a akým spôsobom sa transformuje URL pred samotným spracovaním požiadavky; pri vývoji útoku je vhodné myslieť aj na toto. Ak už máme plne funkčný link, ktorý vie spustiť jednoduchý Javacript, môžeme pokračovať ďalej a útok vylepšovať. Spôsob, akým sa pracuje s cookies v Javascripte možno vidieť tu. Nato, aby sme mohli skutočne zneužiť túto zraniteľnosť, napr. predstierať že sme obeť (nie je cieľom zadania), potrebujeme dostať tieto dáta z počítača obete k nám. Možností ako odoslať cookies pomocou Javascriptu je viacero, nechávam to vašej kreativite. Dôležitou podúlohou je taktiež vypracovať útok tak, aby sa nijakým spôsobom nepokazil vzhľad stránky, t.j. žiadne chybové hlášky, HTML kód zobrazený na stránke a pod (možno riešiť pomocou CSS). Taktiež je v poriadku ak stránka vyzerá chvíľu chybne, predtým ako sa sama opraví. Výstupom úlohy je textový súbor, v ktorom sa nachádza link, na ktorý ak obeť klikne, odošlú sa cookies útočníkovi (t.j. nám) tak, aby sa na stránke nenachádzali žiadne chyby a vyzerala ako pôvodná verzia.
Druhá úloha sa zameriava na CSRF. Cieľom je vytvoriť HTML súbor, ktorý ak obeť otvorí, prevedie sa určitá čiastka fcoinu z jej účtu na útočníkov účet (POZOR: nerobiť to pomocou XSS zraniteľnosti). Vytvoríte si napr. dvoch používateľov, „attacker“ a „victim„. Ak používateľ, prihlásený pod kontom „victim“ otvorí HTML dokument (pozor aby sa ten dokument nenachádzal v rovnakom adresári ako web, pretože by boli definované ako Same Origin, čo je v rozpore s cieľom zadania), odošle sa určitá suma na konto „attacker“ a hneď po dokončení transakcie by sa mal prehliadač presmerovať na nejakú nevinnú stránku; ideálne tak rýchlo aby si používateľ ani nevšimol, že sa niečo stalo. Znova, najlepším pomocníkom je prehliadač a jeho možnosti inšpekcie kódu. HINT: V HTML dokumente bude teda nutné vytvoriť určitý form element, ktorý odošle POST v rovnakej forme ako originálna stránka, je teda potrebné si preštudovať kód.
Identifikujte, kde presne v kóde sa nachádzajú vyššie uvedené zraniteľnosti. Navrhnite akým spôsobom by sa dali chyby opraviť.
Bonus: pokúste sa chyby opraviť a otestovať predchádzajúce útoky. Overte či útoky už skutočne nefungujú.
Dokumentácia
Pri zadaní sa bude okrem funkčnosti útokov hodnotiť aj kvalita dokumentácie. V dokumentácii je nutné popísať nasledujúce body:
Okrem dokumentácie treba odovzdať aj textový súbor s linkom a HTML dokument s CSRF útokom.
Deadline
18.5. 2020 15:00