[ Webhosting profitux.cz ]
v6ak [ programování, bezpečnost, web, php, java, ... ] (Vít Šesták)
Buzz - v6ak Twitter - v6ak

štítky

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:

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ů:

CSS výraz pomocí expression(...)

Tentokrát jde o nestandardní rozšíření jen IE. Používá se na místě hodnoty:

color: expression(JS výraz);

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:

var res; if(res= /[\?\&]page\=([^\&]*)($|\&)/ .exec(location.search) ){ ...eval(res[1])...

Zde je útok naopak velmi jednoduchý: stačí oběť přivést na stránku ...?page=muj%20skodlivy%20javascript a je to.

Diskuzi ke článku naleznete zde.

Články z této skupiny

Linkování

Líbí se Vám tato stránka? Zalinkujte ji!

Chcete sledovat novinky? Pokud si právě prohlížíte článek a hledáte RSS pro celý web, pak jste trošku jinde. Možná hledáte poslední změny.

Validní HTML 4.01 StrictValidní CSS 2.0Validní hlavní RSS kanálPHP 5Apache
referer: UA:CCBot/2.0 (http://commoncrawl.org/faq/) time:0.11673900 1503523270
web
mail
comment