Cross Site Scripting

Cross Site Scripting - jak jsou vaše webové stránky napadeny

XSS, SQL Injection, XMLrpc - když je vydána aktualizace zabezpečení WordPressu, zprávy o aktualizaci obsahují většinou záhadné zkratky. I když je jasné, že tyto aktualizace jsou nutné a plus v zabezpečení je velmi potěšující, je důležité pochopit, co se za těmito bezpečnostními chybami skrývá. Protože pouze pokud pochopíte, které mezery aktualizace odstraňují, můžete se také informovaně rozhodnout. Proto se dnes podíváme na Cross Site Scripting neboli XSS, což je zdaleka nejčastější komplexní útok na webové stránky WordPress.

Útoky hackerů lze přirovnat k vloupání. Útoky hrubou silou se podobají spíše metodě páčidla. Zločinci se nástroji brání tak dlouho, dokud nevyrazí dveře nebo okno. Naproti tomu útoky na zranitelnosti XSS jsou sofistikované: Zločinci přesně vědí, kde začít, a získají přístup k webové stránce velmi cíleným způsobem.

V průběhu cross-site scripting jsou záměrně zneužívány bezpečnostní mezery na webových stránkách. Do důvěryhodného kontextu (vašich webových stránek!) jsou vloženy škodlivé skripty. Podobně jako černý pasažér na lodi používá tento škodlivý kód váš web jako prostředek k dosažení vlastních cílů.

V nejhorším případě se tak získají důvěrné informace, nebo dokonce přístup k počítači napadeného uživatele. Takové útoky nejsou zrovna vzácné: Dobrá polovina zranitelností v zásuvných modulech nalezených poskytovatelem zabezpečení Wordfence v letech 2015 a 2016 byly zranitelnosti typu cross-site scripting. Útok XSS často tvoří "základ" pro další útoky, jako jsou spam, phishing nebo DDoS útoky. Proto vám dnes ukážu, jak přesně Cross Site Scripting funguje, jaké typy útoků existují a jak jsou tyto útoky nebezpečné.

Cross Site Scripting má základní princip

Cross-site scripting funguje na základním principu zneužití mezery a vložení škodlivého kódu do webových stránek. Vždy představuje nebezpečí, když webová aplikace předává zadaná data webovému prohlížeči, aniž by zkontrolovala možný skriptovací kód. Dobrým příkladem takové webové aplikace je chat podpory.

Škodlivé skripty se mohou dostat na server prostřednictvím samotné webové aplikace. Odtud se škodlivý kód dříve či později dostane k postiženým klientům. Dobrým příkladem takové zranitelnosti XSS je chyba objevená v červenci 2016 v metainformaci obrázků ve verzi WooCommerce 2. 6.2. Kvůli chybě bylo možné do metaopopisů obrázků propašovat kód HTML zvenčí. Každé zařízení, na kterém byl nyní postižený obrázek prohlížen podrobněji (např. kliknutím na obrázek), se vystavovalo riziku útoku. Počítače, na kterých byl tento obrázek prohlížen, tak mohly být mimo jiné infikovány virem.

"*" povinný údaj

Rád bych se přihlásil k odběru newsletteru, abych byl informován o nových článcích na blogu, e-knihách, funkcích a novinkách ve WordPressu. Svůj souhlas mohu kdykoli odvolat. Více informací v našich Zásadách ochrany osobních údajů.
Toto pole slouží k ověření a nemělo by se měnit.

Oblíbený trik pro cross-site scripting: manipulované formuláře

XSS může také umožnit nahrazení neškodných formulářů zmanipulovanými formuláři. Tyto formuláře pak shromažďují údaje obětí (na vašich webových stránkách!). Mimochodem, ani šifrování SSL před tím nedokáže ochránit. HTTPS "pouze" znamená, že spojení mezi serverem a klientem je šifrované. Pokud je však samotný formulář zmanipulovaný, je i šifrované spojení k ničemu.

Stejně jako u jiných typů útoků je ve většině případů cílem zpeněžení. Konkrétně to znamená, že jsou buď ukradena data a později prodána, nebo jsou infikované webové stránky začleněny do tzv. botnetu, který je následně pronajímán.

3 typy XSS

Útoky typu cross-site scripting lze zhruba rozdělit do tří typů:

  • Odražený Cross Site Scripting
  • přetrvávající cross site scripting
  • Skriptování na základě DOM nebo lokální skriptování křížových webů

Útoky XSS fungují zhruba takto: Škodlivý kód je vložen do místa, kde se očekává vstup od klienta (například při vnitřním vyhledávání na stránce). V rámci odpovědi serveru je pak škodlivý kód spuštěn na klientovi, tj. v prohlížeči. A právě tam dochází k příslušnému poškození, například k odcizení dat.

Reflexní Cross Site Scripting

Některé vstupy, například vyhledávací dotazy, jsou reflektovány serverem. To znamená, že například po zadání "test" do vyhledávacího pole webová stránka vypíše "Hledali jste test". Zadaný text se tak stane součástí odpovědi serveru.

Právě toho se chytře využívá: Pokud je na webový server místo vyhledávaného výrazu odeslán škodlivý skript, lze webovou stránku zmanipulovat tak, že jej nakonec spustí. Tento typ útoku se také nazývá nepersistentní. To znamená, že škodlivý kód je do příslušné webové stránky vložen pouze dočasně, ale není uložen.

V červenci 2017 byla taková zranitelnost nalezena v pluginu WP Statistics (a ještě téhož dne opravena!). Vstupní hodnota na stránce 'wps_visitors_page' byla předána bez kontroly, což vedlo ke zranitelnosti prostřednictvím odraženého XSS. Pokud tedy administrátor předtím kliknul na odpovídajícím způsobem zmanipulovaný odkaz, mohla být webová stránka hacknuta.

Odražené XSS s křížovým skriptováním webu
Takto může vypadat reflektovaný útok typu cross-site scripting.

Funguje to takto: Odkazy s manipulovanými parametry se šíří mezi potenciální oběti. Aniž by o tom oběť věděla, odešle kliknutím na odkaz "zmanipulovaný" požadavek na server a spolu s odpovědí serveru se spustí škodlivý kód. Vzhledem k tomu, že kód - na rozdíl od trvalého XSS - není nikde uložen, musí být masově distribuován potenciálním obětem. K tomu může dojít například prostřednictvím e-mailů nebo sociálních sítí.

Trvalý Cross Site Scripting

V případě trvalého XSS jsou škodlivé skripty uloženy na webovém serveru a doručeny pokaždé, když je klient vyvolá. K tomu jsou předurčeny webové aplikace, které ukládají uživatelská data na server a poté je bez kontroly nebo kódování vypisují (včetně fór). Tento typ skriptování může být obzvláště nebezpečný pro velmi navštěvované blogy a fóra, protože zde se malware může rychle šířit kvůli velkému počtu uživatelů.

Tato grafika znázorňuje možný tok trvalého útoku skriptováním mezi weby.
Sekvence trvalého útoku typu cross site scripting. Zdroj: Blog SAP

Příklad: Ve fóru se příspěvky ukládají do databáze. Nezřídka se stává, že jsou uloženy nezaškrtnuté a nezašifrované. Tato možnost je snadno zneužitelná a umožňuje přidat škodlivý skript do zcela běžného příspěvku ve fóru (jednoduchým způsobem pomocí komentáře). Uživatelé buď obdrží příslušný odkaz na příspěvek e-mailem, nebo se k příslušnému příspěvku dostanou náhodou a při vyvolání příspěvku skript spustí. Nyní mohou být například postižení klienti "špehováni" nebo přidáni do botnetu pro další útoky.

DOM nebo místní cross-site scripting

Na rozdíl od trvalého a odraženého XSS funguje cross site scripting založený na DOM (Document Object Model) tak, že spouští skripty na straně klienta. To znamená, že server o takovém útoku neví a nepomáhají ani bezpečnostní opatření na straně serveru.

Známým příkladem takové mezery byl případ balíčku generikonů. Balík genericon je sada ikon, kterou používá mnoho zásuvných modulů. Prostřednictvím souboru HTML v této sadě ikon bylo možné injektovat škodlivý kód.

Po zadání této adresy URL se objevila výstraha javascriptu. Toto je důkaz, že zadaný kód javascriptu lze použít k manipulaci s příslušnou stránkou.
Po zadání této adresy URL se objevilo upozornění JavaScriptu. To je důkaz, že zadaný kód JavaScriptu mohl být použit k manipulaci s danou webovou stránkou. Zdroj: securityaffairs.co

Předpokladem útoku XSS založeného na DOM je však to, že uživatelé kliknou na zmanipulovanou adresu URL. Vyvoláním této adresy URL může být škodlivý kód spuštěn mezerou ve skriptu na straně klienta. Skutečnost, že je třeba nejprve kliknout na odkaz, mimo jiné činí z útoku XSS založeného na DOM poněkud obtížnější, a tudíž méně pravděpodobný typ útoku.

Cross Site Scripting Místní XSS
Příklad lokálního útoku typu cross-site scripting.

Příklad: Zmanipulovaná adresa URL je kliknuta a odešle požadavek webové aplikaci. Webová aplikace odpoví předáním kódu skriptu (který je chybný, ale není zmanipulovaný) prohlížeči, který spustí provádění skriptu. Zmanipulované parametry z adresy URL jsou nyní v prohlížeči klienta interpretovány jako součást skriptu a provedeny. Webová stránka zobrazená v prohlížeči je tak změněna a uživatelé nyní vidí zmanipulovanou webovou stránku, aniž by si toho všimli.

Opatření proti Cross Site Scripting

Nejlepší opatření proti útokům typu cross-site scripting lze jednoduše implementovat. Nejlepší je spoléhat se na pravidelné aktualizace, brány firewall a whitelisty. Za druhé lze zabezpečit i výstup serveru.

Pravidelné aktualizace

Zranitelnosti, přes které je škodlivý kód infiltrován, jsou buď v jádře WordPressu, v zásuvných modulech nebo v tématech. Právě proto jsou pravidelné aktualizace všech těchto součástí tak důležité. Protože dosud nalezené zranitelnosti jsou v těchto aktualizacích opraveny.

Rovněž je vhodné pravidelně číst podrobnosti o aktualizacích, abyste měli přehled o tom, které bezpečnostní chyby jsou prostřednictvím aktualizací pravidelně odstraňovány. Například u aktualizací údržby a zabezpečení jádra WordPressu jsou tyto informace zdokumentovány na blogu WordPressu.

Firewally a whitelisty proti jednoduchým XSS útokům

Dalším jednoduchým ochranným opatřením proti útokům XSS jsou takzvané webové aplikační firewally neboli WAF. Tyto firewally jsou srdcem velkých bezpečnostních zásuvných modulů a jsou zásobovány nejnovějšími zranitelnostmi příslušným výzkumným týmem výrobce. WAF je obecně postup, který chrání webové aplikace před útoky prostřednictvím protokolu HTTP (Hypertext Transfer Protocol).

I tyto ochranné mechanismy však mají své limity. U některých útoků XSS probíhá útok prostřednictvím databáze. Proto je kontrola uživatelských vstupů na přítomnost škodlivého kódu jedním z ústředních bezpečnostních mechanismů v boji proti útokům XSS. Například obsah komentářů se kontroluje na podezřelé řetězce znaků a v případě potřeby se vytřídí.

Datový výstup by měl být také zabezpečen

Regelmäßige Updates schließen vorhandene XSS Sicherheitslücken und Firewalls sowie Whitelists versuchen Schadcode auszufiltern, bevor dieser den Webserver erreicht und die Website infizieren kann. Doch sollte auch die Datenausgabe entsprechend gesichert werden. Die meisten Programmier- und Skriptsprachen, wie PHP, Perl oder JavaScript, besitzen hierfür bereits vordefinierte Funktionen zur Zeichenersetzung bzw. -maskierung. Diese sorgen dafür, dass „problematische“ HTML Metazeichen wie <> und & durch harmlose Zeichenreferenzen ersetzt werden. So wird verhindert, dass der Schadcode aktiv werden kann. Auch sollte der Code mithilfe von sogenannten sanitization libraries bereinigt werden. Hierfür wird ein Plugin auf dem Server installiert und zusätzlicher Code in den Quellcode deiner Website eingebunden. Der folgende Codeschnipsel sorgt dann zum Beispiel dafür, dass <class> zu den erlaubten Attributen hinzugefügt wird:

var sanitizer = new HtmlSanitizer();
sanitizer.AllowedAttributes.Add("class");
var sanitized = sanitizer.Sanitize(html);

K implementaci jsou zapotřebí programátorské dovednosti. Tuto ochranu datového výstupu může snadno implementovat osoba s těmito znalostmi.

Zdravá úroveň skepticismu: Jak se uživatelé chrání

Útoky XSS se však netýkají pouze samotných webových stránek, ale také klientů (tj. vašeho webového prohlížeče). Mnoha útokům XSS lze zabránit kritickým a pečlivým zacházením s "cizími" odkazy. Mimo jiné je zde možnost používat doplňky NoScript. Ty zabraňují spouštění skriptů, tj. škodlivých řádků kódu, které mimo jiné kradou data.

Ti, kteří chtějí být v bezpečí, mohou také zabránit cross-site scripting na straně klienta jednoduše vypnutím podpory JavaScriptu v prohlížeči. Pokud je totiž toto tzv. aktivní skriptování deaktivováno, nemají již některé typy útoků XSS šanci, protože škodlivé aplikace nejsou vůbec spuštěny. Většina moderních webových stránek pak ovšem přestane správně "fungovat" - nebo v horším případě přestane fungovat vůbec. Je proto nutné zvážit aspekty bezpečnosti a použitelnosti. Pokud vás tato možnost zajímá, najdete ji v nastavení prohlížeče.

Závěr

Zranitelnosti XSS patří mezi nejčastější vstupní brány pro škodlivý kód. A odpovídající útok je často základem pro další útoky, jako jsou spam, phishing nebo DDoS útoky. Vaše webové stránky jsou napadeny a zneužity k jiným účelům. XSS tedy není bez nebezpečí, a proto je důležitá odpovídající ochrana.

Obzvláště časté jsou reflektované a persistentní XSS, protože lokální cross-site scripting je složitější a obtížněji implementovatelný. Zvláště ohrožené jsou webové stránky, které předávají uživatelská data webovému prohlížeči bez kontroly možného škodlivého kódu. Najít takové mezery však není tak snadné. V zásadě je to právě úkol poskytovatelů zabezpečení, jako je sucuri a další, kteří svá bezpečnostní opatření neustále vyvíjejí.

Ale samozřejmě existuje i způsob, jak se může běžný WordPress před těmito útoky chránit. Jednoduchým, ale velmi účinným opatřením jsou mimo jiné aktualizace všech součástí WordPressu. Pokud udržujete své pluginy a témata aktuální a používáte WAF, udělali jste již velký krok správným směrem. Pokud navíc používáte whitelisty pro příchozí a odchozí kód, máte již své webové stránky výborně zabezpečené. Zejména poslední dvě opatření však není snadné realizovat bez znalostí programování.

V porovnání s poměrně primitivními útoky hrubou silou jsou složitější útoky XSS bohužel stále poměrně často úspěšné. Těchto tzv. komplexních útoků je však mnohem méně než útoků hrubou silou na webové stránky WordPress. Přesto byste měli tyto útoky co nejvíce ztížit. Úspěšný hackerský útok stojí nejen čas a peníze na odstranění skriptů, ale může také ohrozit vaši pozici ve vyhledávačích.

Líbil se vám tento článek?

Svou recenzí nám pomůžete zlepšit náš obsah.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena *.