Keď developeri si idú svoje a XSS proti nim - Bart Digital Products Keď developeri si idú svoje a XSS proti nim - Bart Digital Products

Bezpečnosť na internete #6 Keď developeri si idú svoje a XSS proti nim

V predchádzajúcej časti sme si predstavili, čo pojem XSS útok znamená, ako k nemu dochádza a spomenuli sme tiež základne druhy XSS útokov a ich možné formy. V tejto časti vám priblížime ich modernejšie rozdelenie a zhrnieme možnosti, ako sa im v priestore webových aplikácií brániť.

Moderné rozdelenie XSS útokov

V súčasnej dobe sa útoky stavajú čím ďalej tým sofistikovanejšími a preto je ich pôvodné rozdelenie veľmi nepresné. Moderné rozdelenie XSS útokov by sme mohli zhrnúť do dvoch skupín – Server XSS a Client XSS, pričom obe tieto sa dajú ďalej rozdeliť na Reflected Server/Client XSS útoky a Stored Server/Client XSS útoky. 

Serverové útoky sú nebezpečnejšie, lebo sa vykonávajú na úrovni servera, robia zmeny priamo v aplikácii, a prehliadač následne slúži len na vykresľovanie už hacknutej HTML štruktúry. 

Pri klientskych útokoch sa vykonávanie kódu útočníka deje priamo na strane prehliadača – na serveri sa aplikácia javí v poriadku a útok sa zrealizuje až po akcii používateľa, pri ktorej sa v jeho browseri spustí aj dodatočná škodlivá funkcionalita. 

Reflected verzie serverových či klientskych útokov ovplyvňujú odozvu zo servera a Stored verzie zas spôsobujú, že zasielaný obsah sa u používateľa zobrazuje odlišne.

Keď developeri si idú svoje a XSS proti nim - Bart Digital Products

Zdroj: https://dejanstojanovic.net/aspnet/2018/march/handling-cross-site-scripting-xss-in-aspnet-mvc/

Z môjho pohľadu však ani toto rozdelenie nie je dostačujúce, keďže bežne sa stránky predrenderujú na serveri pomocou SSR (Server Side Rendering) a následne sa pri dokresľovaní alebo prekresľovaní časti stránky používa klasické JS (Vue, React, Angular). Útoky je preto možné, a pre efektívny hack dokonca nutné, správne skombinovať.

Tipy a triky, ako sa chrániť pred XSS

Ošetrenie vstupov používateľov

Do každej aplikácie i webu je potrebné vkladať funkcie spôsobujúce escapovanie (zrušenie) nepovolených tagov a spúšťaných eventov. Túto užitočnú prax do nás hučali učitelia či kolegovia už v skorých základoch programovania, ale doteraz sa na ňu zabúda.

Vždy aktuálne technológie

Podstatne je aj naštudovať si, či vaše technológie a frameworky vykonávajú sanitizaciu obsahu, alebo nechávajú všetku prácu na vás. Napríklad môj obľúbený Angular sa o veľkú časť obsahu postará sám a ošetruje aj vstupy pre [src], [href], [style] a pod. Pri manuálnom ošetrovaní netreba zabúdať aj na iné ako HTML tagy, ako sú atribúty či CSS syntax, ktorá môže cez style atribút vyvolať nežiaduci kód.

Pozor na knižnice

XSS, ale aj iné útoky, ako DDoS, sú častokrát rizikom vďaka zdieľaným knižniciam dostupným napríklad v NPM či YARN. 

V rámci NPM existuje jednoduchá možnosť, ako si bezpečnosť overiť, a to spustením príkazu `NPM audit` nad svojim projektom [link]. Vrele odporúčam kontrolu a upgrade dependencies v pravidelných cykloch nad každý projektom. V Bart-e máme zaužívané, že pri každom release hlavnej verzie frameworku, napr. Angular, prechádzame na predchádzajúcu hlavnú verziu z dôvodu jej stability – pravdepodobne na nej už boli vykonané nejaké tie fixy a úpravy a preto je táto verzia bezpečnejšia. Pritom zároveň upgradujeme aj všetky dependnecies, konflikty a deprecated features zdieľaných knižníc.

Blacklist nepovolených tagov

Môže pomôcť odstraňovanie špeciálnych tagov alebo iba začínajúcich znakov, ako zátvorky a uvodzovky – `(, <, >, {, }, ), “, ‘`.

Správne používanie úvodzoviek

Je v podstate jedno, či ide o JS, HTML alebo serverové jazyky, ako PHP, JAVA a Node (JS/TS) – je dôležite použivať správne úvodzovky podľa best practice pre daný jazyk.

Používajte HTTPOnly cookie flag

Pokiaľ nepotrebujete, aby boli vaše cookies čitateľné na strane front-endu, skryte ich – väčšina moderných prehliadačov tento príznak už podporuje. Takto efektívne zablokujete kradnutie session cookies.

Content Security Policy (CSP) 

Jedna z ďalších efektívnych už spomínaných metód proti XSS útokom je definovanie, ktoré externé súbory (JS, CSS a pod.) je možné na vašu stránku doťahovať a odkiaľ. Pokiaľ nie je dostupný nástroj na to, využite štandardné pravidla zo `same-origin policy`. 

Nižšie nájdete príklad kódu, ktorý dovoľuje sťahovať obsah len z domény, na ktorej sa web nachádza, a taktiež všetky pridružené odporúčané blokovania externého obsahu.

Keď developeri si idú svoje a XSS proti nim - Bart Digital Products


Hlavička X-XSS-Protection

Toto opatrenie je potrebné použiť opatrne. Hlavička je podporovaná v moderných prehliadačoch a môže vytvárať dodatočne client-server rizika. Okrem jej bežného pridania do vášho webového servisu (Apache, nginx) si ju viete vynutit aj z HTML.

Keď developeri si idú svoje a XSS proti nim - Bart Digital Products

Používať správne metódy na zobrazenie obsahu

Odporúčam vyhýbať sa základnému `innerHTML`, ktorý nerieši problémové symboly. V čistom JS je lepšie použiť `innerText` – ten ošetruje tagy a prepusti len text. V určitých situáciách je vhodný aj `textContent`. Prepusti text aj pre všetky podelementy, vrátane medzier a CSS textov, ale už bez náchylných tagov.

Vážne je XSS taký problém?

Keď developeri si idú svoje a XSS proti nim - Bart Digital Products

Zdroj: https://www.avast.com/c-xss 

Áno. Každá aplikácia, ktorá nie je chránená voči tomuto typu útoku, sa vystavuje veľkému riziku. A teraz, keď už rozumiete rizikám, asi chápete, prečo vynakladajú veľké spoločnosti obrovské prostriedky na obranu voči týmto útokom. Záleží im na vašej bezpečnosti.

Z môjho pohľadu sú pojmy ako XSS, Security, Server Maintenance, Testing, Technical Debt a Up-To-Date Dependencies rozhodujúce pri rozlišovaní vyzrelých tímov a firiem od tých ostatných.

Čerpaná literatúra:

https://owasp.org/www-community/Types_of_Cross-Site_Scripting
https://brightsec.com/blog/xss/

Užitočný manuál tagov a ich možné zneužitie v neošetrených situáciách:

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
https://portswigger.net/web-security/cross-site-scripting

Opatrnosti nie je nikdy dosť. Prečítaj si viac na tému bezpečnosť!