XSS monitoring - Nethemba

BLOG

XSS monitoring

2010-11-06 17:42 Pavol Lupták

Dnes ráno zverejnil Krzysztof Kotowicz zaujímavý spôsob možnosti monitorovania používateľov pomocou zraniteľnosti typu XSS. Väčšina ľudí zaoberajúcich sa webovou bezpečnosťou tento druh zraniteľnosti dôverne pozná a odporúčame im najbližšie dva odstavce s vysvetlením preskočiť, pre ostatných nasleduje krátke upresnenie.

XSS cross site scripting je zraniteľnosť na strane servera, ktorá umožňuje zneužitie koncových prehliadačov. Jej základné rozdelenie zahŕňa reflexné (reflected) XSS, pri ktorom používateľ vo väčšine prípadov podstrčí obeti URL so “škodlivým” kódom, ktorý webový prehliadač interpretuje. O niečo kritickejšie sú perzistentné XSS, kde nie je potreba posielať žiadne URL, útočník javascriptový kód šikovne umiestni na server. Môže to spraviť napríklad príspevkom pod určitý blog, poštou, pridaním priateľa s komentárom. Všetko závisí od fantázie útočníka a možnostiach programátorov, pred pár dňami sa napríklad objavila perzistentná XSS na twitteri, ktorá bola naštastie operatívne opravená. Javascriptový kód však nemá kontrolu nad “cudzími” doménami vďaka reštrikcii SOP a modelu DOM.

V oboch prípadoch, útočníkov kód sa vykoná na strane klienta. Týmto dokáže za istých, najčastejšie sa vyskytujúcich podmienok získať prístup k jeho session identifikátoru, prečítať formuláre na stránke alebo vykonávať útoky na intranetové servery. Existuje tiež niekoľko nástrojov, ktoré dokážu realizovať “proxy” ako xss-proxy alebo beef. Tieto nástroje často plnia iba nejaký konkrétny účel. A čo je najdôležitejšie, sú nepoužiteľné, keď používateľ spraví “preklik”, v novom okne sa už nainjektovaný javascript nenachádza a nás zaujímajú aj navštívené stránky v rámci danej domény.

Krzysztof predstavil spôsob, v ktorom si vytvoril neviditelný “iframe” veľkosti prehliadača, do ktorého celú pôvodnú stránku načítal. Týmto dokážeme získať kontrolu aj nad všetkými ďalšími navštívenými stránkami. Stačí nám k tomu obyčajná reflexná XSS zraniteľnosť, ktorou je takmer každý dynamický web zraniteľný. Používateľ si bude myslieť, že prechádza pôvodnými stránkami, pričom sa preklikáva cez nainjektovaný skript a ten sa nám replikuje ďalej aj na ďalšiu stránku. Dôležité je, že sa iframe URL nachádza na rovnakej doméne ako náš script, takže neplatia žiadne SOP obmedzenia, dokážeme vidieť obsah odosielaných formulárov, potvrdených linkov a celkom triviálne ľudí monitorovať. Odporúčam si prejsť z pôvodného príspevku aspoň sekciu “demonstration”.

Medzi najväčšie nevýhody tejto metódy však patrí, že sa URL nemení ani po odkliknutí na externú stránku, na ktorú sa už samozrejme Same Origin Policy vzťahuje. Taktiež niektoré linky sa otvárajú v novom tabe pomocouwindow.open() a už bez nášho javascriptového kódu.

V tejto chvíli si určite niektorí uvedomíte, že ide vlastne o reverzný clickjacking. A ako sa danému útoku efektívne brániť?

Niekoľko mesiacov dozadu sa objavila zaujímavá prezentácia  “Busting Frame Busting” o štúdiu clickjackingu na populárnych stránkach. Pokiaľ by niekomu pojem clickjacking nebol známy, jedná sa o prekrývanie stránky “priehľadnou vrstvou”, pričom si použivateľ myslí, že odklikol niečo iné, ako to v skutočnosti naozaj je. V Busting Frame kontrolujeme podmienky, či sa nachádza náš dokument “najvyššie” v hierarchii a pokiaľ to tak nie je, stránku nenačítame, prípadne pri prístupu na stránky cez HTTP skontrolujeme aj položku referrer (cez HTTPS by sa prenášať referrer nemal).

Existuje však niekoľko spôsobov, ako túto “ochranu” obísť, napríklad zmenou pôvodnej lokácie top.location, čo je prekvapivo v niektorých prehliadačoch stále možné, ďalšie pokusy o ochranu pomocou “framebusting code” možno dokonca rozličnými spôsobmi odstaviť.