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

Open Redirect

Autor: .cCuMiNn.   
20.2.2016

Zranitelnost Open Redirect umožňuje útočníkovi podvrhnout oběti takový odkaz, který se tváří, že směřuje na důvěryhodnou doménu, přestože se po kliknutí na něj uživatel ocitne zcela jinde. Zneužití Open Redirectu umožňuje útočníkovi ale daleko více než jen to.


Útoky zneužívající zranitelnosti Open Redirect jsou postaveny na funkčnosti webové aplikace, která poskytuje přesměrování na jinou URL adresu, přičemž hodnotu adresy, na kterou bude přesměrováno, může útočník změnit. Příklad zranitelného skriptu by mohl vypadat například takto:

PHP skript zranitelný na Open Redirect
  1. <?php
  2.   $url = $_GET["url"];
  3.   header("Location: $url");
  4. ?>

Výskyt

Parametry požadavku

Častým místem výskytu jsou nejrůznější redirekty, které aplikace využívá například proto, aby zabránila úniku důvěrných dat skrze HTTP hlavičku Referer, nebo proto, aby zalogovala kliknutí uživatele na externí odkaz.

Příkladem budiž reklamní banner, který bychom si jako majitelé webu umístili na své stránky. Pokud by nám inzerent platit odměnu za každý proklik a odkaz banneru by byl nasměrován přímo na cílovou doménu (www.cilovy-inzerent.cz), pak bychom se museli při finančním vyrovnání spolehnout pouze na čestnost inzerenta. Ten by nám totiž musel sdělovat, kolik návštěv k němu z našeho webu přišlo, neboť my bychom tuto informaci neměli k dispozici. Abychom měli chování návštěvníků našeho webu více pod kontrolou a mohli si vytvářet vlastní statistiku prokliků, musel by banner směřovat na naší vlastní stránku zaznamenávající proklik s následným přesměrováváním užvatele na cílovou doménu. Uvedené se často řeší pomocí redirektů, kdy odkaz banneru vypadá například takto:

http://www.hackmail.cz/redir.php?url=http://www.cilovy-inzerent.cz

Google dork: inurl:"redir.php?url"

Druhým častým místem výskytu jsou například skripty sloužící pro přihlášení nebo odhlášení uživatelů. V jejich obsahu si často můžete všimnout parametru return, který obsahuje URL adresu, na kterou bude uživatel přesměrován po zdárném přihlášení resp. odhlášení.

Google dork: inurl:"login.php?return"

HTTP hlavička Referer

Je dúležité si uvědomit, že cíl pro přesměrování nemusí být předáván vždy jen pomocí proměnných. Občas zistíte, že si aplikace ukládá hodnotu pro následné přesměrování do cookies, které jsou odesílány na server společně s požadavkem prostřednictvím HTTP hlavičky. Zde je zneužití již poměrně obtížnější. Útočník by musel v aplikaci najít takové místo, které mu umožní injektovat do obsahu cookies vlastní hodnoty, nebo by musel pro nastavení těchto hodnot zneužít jiné zranitelnosti, jako XXS nebo HTTP Response Splitting.

HTTP hlavička Host

Webový server také někdy přesměrovává na doménu, kterou obdrží v HTTP hlavičce Host, pokud tato doména není nalezena lokálně. Zde je ale možnost zneužití již téměř nulová, protože není možné vzdáleně přesvědčit oběť k odeslání požadavku, který by obsahoval konkrétní kombinaci této hlavičky a adresy cílového systému.

Zneužití HTTP hlavičky host pro redirect
 nc www.seznam.cz 80

 GET / HTTP/1.1
 HOST: www.attacker.cz

 HTTP/1.1 302 Moved Temporarily
 Server: nginx
 Date: Wed, 17 Feb 2016 15:29:55 GMT
 Content-Type: text/html
 Content-Length: 154
 Connection: close
 Location: https://www.attacker.cz/

Možnosti zneužití

Zneužití důvěryhodnosti

Podobných redirektů nezřídka využívají útočníci při phishingových útocích. Během nich totiž vytvářejí odkazy, které vypadají že směřují na důvěryhodnou doménu:

http://www.hackmail.cz/redir.php?url=http://attacker.cz


Oběť je při pohledu na cíl takového odkazu přesvědčena o tom, že kliknutí povede k návštěvě důvěryhodné domény. V našem případě www.hackmail.cz. Ve skutečnosti bude oběť po návštěvě této stránky okamžitě přesměrována a skončí na stránkách útočníka, který se může pokusit například o krádež přihlašovacích údajů. Pokud si říkáte, že z URL je na první pohled patrné, že dojde při návštěvě odkazu k přesměrování, pojďmě si ukázat, jak jednoduché je parametr odkazu ukrýt pomocí URL kódování.

http://www.hackmail.cz/%72%65%64%69%72%2e%70%68%70?%75%72%6c=%68%74%74%70://%61%74%74%61%63%6b%65%72%2e%63%7a


Uvedený odkaz bude mít za následek úplně to stejné, co předchozí příklad. Uživatel po kliknutí na odkaz skončí i tentokrát na doméně attacker.cz. Při vytváření odkazu je někdy nutné použít jednoduché URL kódování, jindy aby se zabránilo zobrazení obsahu po najetí kurzorem myši je nutné použít double nebo vícenásobnější kódování. Kvůli lepšímu zakrytí cílového odkazu je někdy potřeba dokonce využít přesměrování na ten stejný redirekt několikrát a teprve po té na cílovou doménu. Při každém přesměrování totiž dochází k dekódování jedné vrstvy URL kódování.

http://www.hackmail.cz/redir.php?url=/redir.php%3furl%3dhttp%3a//attacker.cz

http://www.hackmail.cz/%72%65%64%69%72%2e%70%68%70?%75%72%6c=%2f%25%37%32%25%36%35%25%36%34%25%36%39%25%37%32%25%32%65%25%37%30%25%36%38%25%37%30%3f%25%37%35%25%37%32%25%36%63%3d%25%36%38%25%37%34%25%37%34%25%37%30%3a%25%32%66%25%32%66%25%36%31%25%37%34%25%37%34%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%32%65%25%36%33%25%37%61


S přincipy využití URL kódování znaků v odkazech Vám doporučuji se seznámit blíže, protože v závislosti na použití nemůžete někdy například zakódovat znak otazníku, rovná se, nebo :// za protokolem. Vždy to ale závisí na tom, jakým způsobem je odkaz předáván a dekódován. V různých webových prohlížečích se navíc zobrazují tyto odkazy různě. Nejlepších výsledků dosáhne útočník v Internet Exploreru, který po najetí kurzoru nad odkaz nedekóduje při zobrazení cíle URL kódování.

Pro zvýšení důvěryhodnosti může útočník do cílového URL vložit také libovolné části cesty, které následně zpětně vyruší pomocí sekvence znaků ../ sloužící pro přechod o adresář výše. V následujícím odkazu je vložena neexistující cesta /upozornení/pro_klienty/dulezite.

http://www.hackmail.cz/upozorneni/pro_klienty/dulezite/../../../redir.php?url=http://attacker.cz


Vše je samozřejmě možné kombinovat. Některé webové prohlížeče ale stejně po najetí kurzorem myši ukáží upravené URL.

http://www.hackmail.cz/upozorneni/pro_klienty/dulezite/%2e%2e/%2e%2e/%2e%2e/%72%65%64%69%72%2e%70%68%70?%75%72%6c=%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2e%63%7a


Odkaz na protokol DATA

Pokud by útočník chtěl zůstat více anonymní, nemusel by svou oběť přesměrovávat na svou doménu, ale místo toho by ji nasměroval na protokol DATA. To znamená, že výsledná stránka by byla celá vložena do hodnoty parametru.

http://www.hackmail.cz/redir.php?url=data:text/html,<h1>Fake stranka</h1><p>Vitejte a prihlaste se.</p>


Opět Vám to přijde příliš nápadné? Útočníkovi v tomto případě nic nebrání v zakódování obsahu stránky pomocí Base64.

http://www.hackmail.cz/redir.php?url=data:text/html;base64,PGgxPkZha2Ugc3RyYW5rYTwvaDE%2BPHA%2BVml0ZWp0ZSBhIHByaWhsYXN0ZSBzZS48L3A%2B


Cross-Site Scripting

Nyní si možná říkáte, že by útočník mohl do HTML stránky načítané přes protokol data: zakomponovat i nějaký ten JavaScript a tím vyvolat XXS. Takto to ovšem nefunguje. Kód javascriptu je sice možné vložit, ale vygenerovaná stránka ztratí kontext původní domény s redirektem. Spuštěný kód tedy nebude moci prostoupit bezpečnostní politikou Same Origin Policy. Další možností, která by mohla útočníka napadnout, by bylo přesměrování uživatele například na protokol javascript:. Ani tato varianta ale již není dlouhou dobu funkční a pro XSS útok se proto také nedá využít.

http://www.hackmail.cz/redir.php?url=data:text/html,<script>alert(document.domain)</script>


Zranitelnosti flashových bannerů

V přeneseném významu je na Open Redirect zranitelné i velké množství různých flashových reklamních bannerů. Od nich je totiž často vyžadováno, aby kliknutí na banner vedlo k přesměrování na konkrétní adresu předanou pomocí FlashVars. Oproti běžnému přesměrování je zde sice vyžadována interakce, ale na druhou stranu, je útočníkům zase umožněno přesměrování na protokol javascript:, který se spouští v kontextu domény, na které je banner umístěn. Kombinace s clickjackingem ale dokáže přinést poměrně zajímavé výsledky.

http://www.hackmail.cz/images/banner.swf?clickTag=http://www.attacker.cz

Více se o zranitelnostech Flashových objektů dočtete v sekci věnované bezpečnostním rizikům Flashe.

HTTP Response Splitting

Útočník může s úspěchem vyvolat XSS také ve chvíli, kdy aplikace převezme jeho vstup a ten bez ošetření bílých znaků vloží přímo do HTTP hlavičky Location. Pokud tento případ není ošetřen implicitně ve frameworku, v programovacím jazyce, nebo na webovém serveru, pak vložení bílých znaků CRLF (%0D%0A) povede k rozdělení response hlaviček a k vytvoření vlastního obsahu na doméně s redirektem. Více se o tomto dočtete v obsahu věnovaném zranitelnosti HTTP Response Splitting, resp. CRLF injection.

Reflected dowlnoad

O pár odstavců výše jsem se zmínil o využití wrapperu data: ke vložení HTML obsahu přímo do odkazu. Stejným způsobem ale můžete do odkazu vložit i jakýkoliv jiný obsah (po zakódování do Base64 dokonce i binární). Pokud se použije wrapper data: například s MIME typem application/x-msdownload povede návštěva odkazu k downloadu binárního obsahu, viz následující zneužití redirektu:

http://www.hackmail.cz/redir.php?url=Data:application/x-msdownload;base64,RGVtbyBwcm9ncmFt


Uvedené řešení má pro útočníka ovšem jisté nevýhody. Jednak se soubor ukládá pod názvem, který je úvodní částí vloženého Base64 řetězce, ale hlavně má nastavenu koncovku .bin, která není spustitelná. Útočníkovi nabízí řešení HTML5. To totiž prostřednictvím atributu download umožňuje vytvořit takový odkaz, který definuje název, pod kterým bude vložený obsah stažen. Ukázka: download

Odkaz pro stažení obsahu s definovaným jménem souboru
 <a href="Data:application/x-msdownload;base64,RGVtbyBwcm9ncmFt" download="malware.exe">download</a>

Toto s sebou ovšem přináší další komplikaci, a to tu, že uživatel musí pro zahájení downloadu nejprve kliknout na odkaz. Není však nutné zoufat. Stačí použít jednoduchý trik, kdy bude na odkaz kliknuto pomocí Javascriptu.

Automatické kliknutí na odkaz
 <a href="Data:application/x-msdownload;base64,RGVtbyBwcm9ncmFt" download="malware.exe" id="link">download</a>
 <script>document.getElementById("link").click();</script>

Uvedený kód pak stačí vložit do náchylného redirektu protokolem data: s MIME typem text/html.

http://www.hackmail.cz/redir.php?url=data:text/html;base64,PGEgaHJlZj0iRGF0YTphcHBsaWNhdGlvbi94LW1zZG93bmxvYWQ7YmFzZTY0L...


Podpora v jednotlivých prohlížečích je různá, díky čemuž je kompletní útok možné vést pouze proti uživatelům využívajícím prohlížeče Google Chome nebo Firefox.

ProhlížečData URIAtribut download
Internet ExplorerNeAno
ChromeAnoAno
FirefoxAnoAno
SafariAnoNe

Smyčka při přesměrování

Jedno z dalších možných využití otevřeného redirektu by mohlo vést také k odepření služeb webového serveru (DoS). To v případě, že se podaří vyvolat smyčku během přesměrování. K tomuto zacyklení často dochází, pokud je ponechána prázdná hodnota parametru s cílem, nebo pokud je přesměrováváno zpět na skript s redirektem. Webové prohlížeče někdy tuto smyčku sami ukončí, ale v určitých situacích ji nechají běžet nekonečně dlouho (například pokud si štafetu předávají stále dokola dva různé redirekty). Při útoku by pak útočníkovi stačilo vytvořit webovou stránku s mnoha vloženými rámy obsahujícími tuto smyčku. Dostatečný počet návštěvníků takové stránky by mohl vést až k vyčerpání všech prostředků serveru.

Obrana

Způsob ochrany se přímo nabízí. Pokud již z nějakého důvodu redirekty používáte, měli byste zajistit, že Váš skript bude uživatele přesměrovávat pouze na stránky povolené ve whitelistu. Nikdy byste neměli dovolit, aby někdo mohl Vašeho redirektu zneužít pro přesměrování na libovolnou doménu, nebo protokol. Často se lze také střetnout s ochranou, která kontroluje, zda je prvním znakem v předávané hodnotě pro redirekt lomítko. To by mělo zajistit, že bude povoleno pouze přesměrování na webové stránky ze stejné domény. Jak si ale ukážeme níže, může tuto obranu útočník velice snadno obejít.

Obcházení některých ochran

Povoleny pouze lokální cíle

Někdy vývojáři ošetřují Open Redirect tak, že kontrolují, zda je prvním znakem v hodnotě parametru lomítko. To by mělo zajistit, že bude veškeré přesměrování možné pouze na stránky z téže domény.

http://www.hackmail.cz/redir.php?url=/articles/index.php


Je zde ale jeden háček, totiž co se stane, pokud útočník vloží do hodnoty parametru dvě lomítka za sebou, viz

http://www.hackmail.cz/redir.php?url=//www.attacker.cz


V tomto případě dojde k přesměrování na externí web s využitím stejného protokolu, jímž byla načtena stránka s redirektem, tedy HTTP(S). Kontrola, zda je prvním znakem lomítko, tedy není v žádném případě dostačující a je nutné kontrolovat také to, že druhým znakem právě lomítko není.

Povolené domény s redirektem

Mnohdy, a je to tak správně, je hodnota parametru s cílovou stránkou nejprve ověřena ve whitelistu, aby se zajistilo, že přesměrování bude provedeno pouze na povolenou doménu. Toto lze ale opět obejít ve chvíli, kdy i cílová doména obsahuje otevřený redirekt. Útočník tak může vytvořit celý řetězec přesměrování, kdy zneužije domény uvedené ve whitelistu, aby uživatele přesměroval dále na své útočné stránky.

 hackmail.cz -> ccuminn.cz -> attacker.cz

http://www.hackmail.cz/redir.php?url=//www.ccuminn.cz/redir.php%3furl=//www.attacker.cz


Závěr

Na první pohled by se mohlo zdát, že jsou otevřené redirekty pouze jakousi zanedbatelnou záležitostí v otázkách bezpečnosti. Ve článku jsem se vám proto snažil naznačit, že pro různé útoky využívající sociotechniky, se tato zranitelnost může v rukou útočníka stát poměrně silnou zbraní.


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

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.5/8

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