Autor: .cCuMiNn. | 19.1.2018 |
Ve článku Browser cache weakness, který vám doporučuji přečíst před tímto textem, jsme se zaměřili na možné útoky spojené s ukládáním dat do mezipaměti prohlížeče. Dozvěděli jste se, proč je důležité, aby všechny webové stránky obsahující soukromá data, byly vraceny společně s response hlavičkami, které ukládání dat zakazují.
Ani přítomnost uvedených hlaviček ale nevyřeší úplně všechny problémy. Stále zde totiž zůstává jedna zajímavá zranitelnost, kterou si popíšeme v tomto textu.
Patrně každý z vás se již někdy na webu setkal se situací, kdy při přesunu v historii směrem vzad webový prohlížeč oznámil, že platnost stránky vypršela, a že je nutné odeslat nový požadavek.
Uvedená zpráva se Vám pochopitelně zobrazí pouze v případě, kdy je v komunikaci obsažena správně nastavená hlavička Cache-Control z předchozího výpisu. Tato hlavička totiž prohlížeči sděluje, že si má ze serveru vyžádat aktuální data. U GET požadavků se na opětovné odeslání prohlížeč neptá - odesílá je automaticky. V případě POST požadavků je ovšem možné, že se jednalo o nějakou kritickou akci, kterou bychom nechtěli zopakovat nedopatřením. Mohlo se totiž jednat například o odeslání objednávky v e-shopu, nebo o zadání platby v internetovém bankovnictví. Určitě bychom nechtěli omylem zadat znovu platbu, která již jednou proběhla, jen tím, že se vrátíme zpět na předchozí navštívené stránky. Prohlížeč nás tedy u POST požadavků raději upozorňuje výše uvedenou zprávou. Nežádoucímu opětovnému odeslání dat dokáže dobře zabránit například jednorázový token chránící aplikaci před CSRF útoky. To ovšem odbíháme. O tom tento text není. Pojďme tedy dál a představme si následující scénář:
Útočník si může v konzoli prohlížeče zobrazit dokonce i hodnoty parametrů odesílaných při přehrávání přihlašovacího procesu. Může tak velice snadno zjistit přístupové údaje všech předchozích uživatelů. K těmto údajům se dostanete tak, že na stránce se zprávou o vypršení platnosti jejího obsahu zobrazíte nástroje pro vývojáře.
Spuštění nástrojů pro vývojáře | |
---|---|
Firefox | CTRL+SHIFT+I |
Chrome | CTRL+SHIFT+J |
Internet Explorer | F12 |
Ve Firefoxu následně v nástrojích pro vývojáře přejděte na záložku síť.
Tlačítkem Zkusit znovu zopakujte původní požadavek. Následně se v zaznamenané komunikaci přesuňte na první požadavek (POST) a v pravé části zvolte záložku Parametry. Měli byste vidět to, co Vás zajímalo.
Nakonec přidávám ještěvideo, které celý průběh zachycuje.
Poznámka: Uvedený útok se může týkat i jiných formulářů, které odesílají citlivá data, například registrace. Při testování aplikace je tedy důležité tento typ útoku u všech takových formulářů vyzkoušet.
Vždy, když opouštíte počítač, na kterém jste se přihlašovali k webovým aplikacím, vypněte webový prohlížeč.
Obrana proti výše popsanému útoku je kupodivu velice jednoduchá a většina aplikací ji má nasazenu, aniž by si to její tvůrci vůbec uvědomovali. Pokud totiž po přihlášení uživatele přesměrujete, tedy pokud mu vrátíte odpověď se status kódem 301, nebo 302, pak se tato odpověď neukládá do historie a není možné se k ní vrátit. Výše uvedený postup útoku funguje tedy pouze tam, kde je uživateli po přihlášení vrácen bezprostředně obsah stránky se status kódem 200.
Klidní mohou zůstat také ti, jejichž aplikace odesílají requesty o přihlášení pomocí AJAXu.