Papa, alert(document.cookie). Papa, XSS?

Tak się jakoś złożyło, że potrzebny mi był mój indentyfikator sesji na pewnym forum, które lata na skrypcie phpBB3. Jak na wytrawnego haksiora przystało, posłużyłem się najnowocześniejszą technologicznie metodą debugowania. I jakież było moje zdziwienie, gdy po wpisaniu w pasek adresu javascript:alert(document.cookie) moim oczom ukazał się pusty jak słońce obiekt typu String.

Klasyczny WTF. Dragonfly, Firebug, Web Developer (Toolbar) w łapki (zaprzeczam, jakobym miał troje rąk). Klasyczny WTF. Dobra, ale jak to możliwe, że przeglądarka widzi ciasteczka, korzysta z tychże ciasteczek, ale nie udostępnia ich poprzez document.cookie? Oczywiście, owo document.cookie nie miało w żaden sposób nadpisanych getterów, setterów i tak dalej.

Na szczęście, Firefox ma jeszcze jedno użyteczne narzędzie – a w zasadzie, dodatek – Live HTTP headers. No to jedziemy dalej. Wyczyściłem całą zawartość pamięci podręcznej, z ciasteczkami włącznie, aby dokładnie przyjrzeć się, co takiego serwer wysyła mojej przeglądarce. Sprawdziłem kilka serwisów. No dobra, trzy. Miałem szczęście, bo dwa serwisy zachowywały się podobnie w kwestii ciasteczek. Wyświetlały tylko ciasteczka stworzone przez skrypty JS.

Po przeanalizowaniu nagłówków (a ściślej: nagłówków Set-Cookie), natrafiłem na niezwykle interesujący parametr HttpOnly. Przyznam, że coś takiego widziałem pierwszy raz na oczy. Nie trudno się domyślić, że to zabezpieczenie przed oklepaną metodą kradzieży ciasteczek w atakach typu XSS z wykorzystaniem document.cookie właśnie.

Wracając jednak do parametru HttpOnly, jego użycie jest banalnie proste. Wystarczy dorzucić go na sam koniec nagłówka Set-Cookie. Składnia wygląda tak:

Set-Cookie: <name>=<value>[; <name>=<value>]
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; HttpOnly]

Ciasteczka z ustawionym HttpOnly nie powinny być widoczne z poziomu JavaScript. Oczywiście, zależy to od przeglądarki – bo jakżeby inaczej.

Interesujące, prawda? Co ciekawe, po raz pierwszą implementacją pochwalić się może… Internet Explorer 6 SP1. I to już w 2002 roku! Dla zainteresowanych, polecam trzy artykuły: HTTP cookie na angielskiej Wikipedii, HTTPOnly na stronach projektu OWASP oraz Protecting Your Cookies: HttpOnly na Coding Horror.

Przykłady użycia ciasteczek z parametrem HttpOnly zostały wymienione w drugim z wymienionych artykułów. Uwzględnionych zostało kilka języków skryptowych, więc nie powinno być problemu. Chociaż wypadałoby wspomnieć chociaż o PHP:

bool setcookie ( string $name [, string $value
[, int $expire = 0 [, string $path [, string $domain
[, bool $secure = false [, bool $httponly = false ]]]]]] )

Czyli na przykład:

<?php
 
setcookie('sid', 'qwerty', time()+60*60*24,
	'/', '.example.com', false,
	true /* …i HttpOnly */ );
 
?>

Nie było tak źle, prawda?

Ach, i jeszcze jedno: na Joggerze ciasteczka identyfikujące sesji jeszcze nie mają HttpOnly, ale D4rky obiecał się tym zająć, gdy tylko znajdzie chwilę. A jestem pewien, że na Joggerze HttpOnly naprawdę się przyda ;-)

Komentarze

  1. Rafał pisze:

    Respektowanie atrybutu HttpOnly wprowadzono do Firefoksa jakieś 2 lata temu, w ramach pracy nad trzecią edycją przeglądarki, o czym pisałem na blogu ;-)
    Przydatna rzecz, bo nie wszystko powinno być dostępne dla skryptów...

  2. Piotr Konieczny pisze:

    I jakby jeszcze wymóc przesyłanie ciastek wyłacznie przez https na niektórych serwisach... ;>

  3. pecet pisze:

    Od razu przesyłanie ciasteczek pocztą polską, użytkownik ręcznie wklepuje => secure.

  4. H kucyk pisze:

    dużo można dowiedzieć się ochakingu z takich stron jak ta dziękuje

Dodaj komentarz

Proszę, formatuj komentarz za pomocą Markdown.

Wymagane pola zaznaczone są znakiem gwiazdki – „*


Obrazek z kodem

*