štítky
- bezpečnost
XSS jak možná neznáte -> 2 - techniky XSS na webu
Co se vám vybaví, když uvidíte XSS (cross-site-scripting)? HTML injekce?
XSS je však mnohem rozmanitější útok. Věděli jste, že je možné provést cross-site-scripting například pomocí adresy?
Jak provést XSS? XSS jako takový není svázaný s jednou konkrétní technikou. Je to vlastně jen důsledek, ke kterému lze dojít řadou technik.
HTML injekce
Co je injekce snad zde nemusím příliš vysvětlovat, měl by stačit dřívější článek o injekci. Je zde však několik možností.
Tag script
O tagu script snad nemusím moc mluvit. Znají jej snad všichni HTMLkaři. Pokud mohu vložit na cizí stránky tag script, pak je XSS hračka.
Události - atribut on...
Skoro každý HTML tag má události. Podle konvence jsou to parametry začínající na 'on'. (To pochopitelně neznamená, že ostatní parametry můžu nechat ovlivnit kýmkoli. To vysvětlím později.) Pokud útočník má možnost ovlivnit obsah tohoto atributu, není nic snažšího, než umístit skript k vykonání sem. Potom je na řadě nějaké sociální inženýrství, které se postará o to, aby daná událost co nejspíše nastala. Může pomoct i atribut style.
XSS pomocí adresy (javascript: apod.)
Možná znáte pseudoprotokol javascript, případně jiný podobný. Prozatím zanechme debat o jeho vhodnosti, jelikož pro útočníka je vhodné všechno, co funguje ve většině prohlížečů.
Pokud tento pseudoprotokol neznáte, pak vězte, že umožňuje vykonat skript (zde konkrétně javascript) při pokusu o navštívení adresy. Trošku tím připomíná pseudoprotokol mailto.
Pochopitelně se tato věc útočníkovi může hodit.
Kde všude se může vyskytovat zákeřná adresa? (javascript:... apod.)
Je zde více možností. Někdy je možnost omezená na některé konkrétní prohlížeče (nebo jejich verze), jindy je pro vykonání útoku použít sociální inženýrství.
Seznam pochopitelně nemusí být úplný. Napadly mě tyto možnosti:
-
HTML
- <a href="...
- <img src="...
- <iframe src="...
- <object data="...
- <link href="...
-
CSS
- url(...), například v background-image nebo content
CSS vlastnosti -moz-binding a behavior
Jde o nestandardní CSS vlastnosti pro Gecko a IE umožňující přidat události pomocí CSS. O událostech jsem již psal. Potom stačí jen udělat vhodné sociální inženýrství nebo vhodně nastylovat.
V XBL je navíc konstruktor, který umožňuje vykonat skript okamžitě.
Pokud namítnete, že ani jedna z těchto dvou vlastností není standardní, mám pár argumentů:
- Útočníka to nezajímá, vždyť Internet Explorer nebo Firefox má většina lidí. Hlavně že to většině jede.
- Mnoho -moz-* vlastností je v návrhu u W3C. U této jsem před časem viděl nějaký W3 draft pro XBL. Standardizace je tedy zřejmě jen otázkou času.
CSS výraz pomocí expression(...)
Tentokrát jde o nestandardní rozšíření jen IE. Používá se na místě hodnoty:
Není velkým problémem zajistit, aby kód byl vykonán jen jednou. Stačí použít podmínku a „globální proměnnou“ - vlastnost objektu window. Její existenci totiž lze kontrolovat i bez try+catch. Není to sice úplně čisté, ale útočníkovi by to mělo stačit.
XSS pomocí uploadovaného souboru
Pomocí neošetřeného uploadování souborů jdou různé zajímavé věci. Méně se už myslí na XSS. Přitom XSS může fungovat i na obecnějším kódu. Pokud se skript opírá o DB, může sice zamezit některým útokům, ale nezamezuje pořád útoku XSS.
Vpodstatě jde o možnost nechat na cizí doméně vypsat libovolný kód pod vhodným MIME typem. Pak nejspíš použijete (pokud jste útočníkem) tag script. K nebezpečným MIME typům patří například text/html a application/xml.
XSS způsobený neopatrným zacházením se vstupem ve skriptu - eval(vstup)
Na některých stránkách (a dokonce i v některých knihách!) o JavaScriptu se můžete dočíst například nebezpečný návod, jak převést řetězec na číslo. (Tímto trošku zkonkrétňuju situaci, ale to asi nebude problém.) Konkrétně jde o řešení eval(řetězec). Ono to na první pohled funguje bezvadně, ale musíme tam opravdu dávat jen čísla (v desítkové soustavě :-) ).
Co vlastně dělá eval v JavaScriptu?
V JavaScriptu eval přijímá jeden argument (řetězec). Jde o JavaScriptový kód. Tento kód je následně vyhodnocen. Návratovou hodnotou je hodnota výrazu.
V JavaScriptu je číslo literálem, takže pokud evalu předám číslo jako řetězec, skutečně dostanu číslo jako číslo. Ale pokud předám místo čísla jiný javascriptový kód, i on bude vyhodnocen! Toho lze pochopitelně zneužít.
Jak to může útočník zneužít?
Možnost zneužití v praxi samozřejmě závisí na tom, odkud je daný vstup brán. Pokud je vstup brán například z políčka formuláře, které útočník nemůže ovlivnit (ani nemůže mu přednastavit výchozí hodnotu), pak to pro útočníka asi moc významné nebude.
Nicméně, JavaScript může získávat vstup i například z GET parametrů. Představte si následující kód:
Zde je útok naopak velmi jednoduchý: stačí oběť přivést na stránku ...?page=muj%20skodlivy%20javascript a je to.
Články z této skupiny
Linkování
Líbí se Vám tato stránka? Zalinkujte ji!