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 ;-)

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...
Dodano 26 września 2009 o 21:57:23 ¶
Piotr Konieczny pisze:
I jakby jeszcze wymóc przesyłanie ciastek wyłacznie przez https na niektórych serwisach... ;>
Dodano 26 września 2009 o 23:40:37 ¶
pecet pisze:
Od razu przesyłanie ciasteczek pocztą polską, użytkownik ręcznie wklepuje => secure.
Dodano 27 września 2009 o 10:40:16 ¶
H kucyk pisze:
dużo można dowiedzieć się ochakingu z takich stron jak ta dziękuje
Dodano 27 października 2009 o 20:42:52 ¶