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

Neukončené přesměrování

Autor: .cCuMiNn.   
23.3.2014

Obsah webové stránky je před neutorizovaným přístupem často chráněn podmínkou v prvních řádcích svého zdrojového kódu. Je možné, aby se i zde dopustil vývojář kritické chyby?


Přesto, že se jedná pouze několik málo řádek kódu, může vývojář udělat fatální chybu, pokud zapomene nebo neví o nutnosti přidání jednoho zásadního příkazu. Tento článek je určen jednak pentesterům, kteří by během testu neměli zapomínat na kontrolu správného přesměrování, ale hlavně všem vývojářům, kteří v následujícím PHP kódu nespatřují nic závadného.


Ukázka zranitelného kódu
  1. <?php
  2.   @session_start();
  3.   if (!$_SESSION["isAdmin"]) {
  4.     header("Location: /");
  5.   }
  6. ?>
  7. ==== Administrace ====
  8. BINGO! Prave jsi odhalil velice tajne informace, ktere byly urceny pouze ocim administratoru.


Teorie

302-redirect.pngVýše uvedený kód zkontroluje, zde má přihlášený uživatel nastavena administrátorská práva a v případě, že tomu tak není, je prohlížeči uživatele předána HTTP hlavička Location, která webový browser informuje o nutnosti přesměrování na jinou webovou stránku. V našem případě na homepage, což zde představuje znak lomítka (kořenový adresář webu).

Funkce header(), ovšem není prostředkem, který by nějakým způsobem ukončoval běh skriptu. Kromě vložení HTTP hlavičky do response serveru, nemá funkce žádný další efekt. Kód na tomto místě tedy neukočí svou činnost, ale pokračuje dále a vloží do těla odpovědi i samotný kód stránky, který v našem případě představuje text "BINGO! Prave jsi odhalil velice tajne informace, ktere byly urceny pouze ocim administratoru.", který měl zůstat utejen každému, kdo nemá patřičná oprávnění.

Uživatel, který bez požadovaných práv navštíví tuto stránku, nic nepostřehne, protože se jeho prohlížeč bude řídit hlavičkou Location a bezodkladně si zažádá o obsah nové webové stránky.

Pohledu útočníka, který k zachycení odpovědi serveru použije jiných nástrojů, než webového prohlížeče, ovšem tento obsah neunikne. Jednou z možností, jak se k obsahu z odpovědi dostat, je například použití lokálního proxy. Často při své práci používám a doporučuji doplněk Firefoxu Tamper Data, se kterým si ale tentokrát nevystačíme. Budeme muset použít některý více sofistikovaný nástroj, kterým je například Burp Suite, Fiddler2, nebo Wireshark, který nám umožní zobrazovat veškerý přenášený obsah.

Při testování pak stačí zaznamenávat přenášený obsah, v němž následně překontrolujeme tělo u odpovědí se stavovým kódem 302. Pokud je délka odpovědi pouze několik málo bajtů, nemá smysl se odpovědí zabývat. V opačném případě, ale vždy stojí tento obsah za prozkoumání.

Praxe

Jak je již naším zvykem, můžete si tento typ zranitelnosti prakticky osahat v našem testovacím webmailu, kde je uvedeným postupem zabezpečena administrace - nebo-li skript nacházející se na adrese http://www.hackmail.cz/admin.php. Použití nástroje Burp Suite zachycuje následující video.



Ochrana

Ochránit se před podobným únikem informací, je velice jednoduché. Stačí v podmínce po odeslání hlavičky Location ukončit činnost skriptu. K tomu nám slouží jazykové konstrukty exit() nebo die(). Který z nich si vyberete je téměř jedno. Oběma konstruktům je možné jako parametr předat návratovou hodnotu ve formě celého čísla nebo text, který se odešle na výstup. Pokud žádnou hodnotu nepředáváme, není nutné uvádět ani závorky. Následující použití těchto funkcí je tedy víceméně shodné. Setkat se můžete se všemi variantami.

Možnosti ukončení běhu
  1. exit;
  2. exit();
  3. exit(0);
  4. die;
  5. die();
  6. die(0);


Kód z úvodu tohoto článku by tedy po ošetření měl tuto podobu:

Správně ošetřený kód
  1. <?php
  2.   @session_start();
  3.   if (!$_SESSION["isAdmin"]) {
  4.     header("Location: /");
  5.     exit();
  6.   }
  7. ?>
  8. ==== Administrace ====
  9. BINGO! Prave jsi odhalil velice tajne informace, ktere byly urceny pouze ocim administratoru.

Závěr

Co říci závěrem? Při vývoji nezapomínejte ukončovat běh skriptu po přesměrování a v případě penetračních testů podrobte kontrole také obsah těla HTTP odpovědí se stavovým kódem 302.


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

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.17/18

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