Autor: .cCuMiNn. | 23.3.2014 |
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.
Výš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í.
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.
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.
Kód z úvodu tohoto článku by tedy po ošetření měl tuto podobu:
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.