Jak czytać plik cookie HttpOnly przy użyciu JavaScript

90

Czy istnieje sposób na odczytanie bezpiecznego pliku cookie za pomocą JavaScript?
Próbowałem to zrobić za pomocą document.cookiei, o ile widzę w tym artykule o bezpiecznych plikach cookie i fladze HttpOnly , nie mogę w ten sposób uzyskać dostępu do bezpiecznego pliku cookie.

Czy ktoś może zaproponować obejście?

tzam
źródło
1
Z wiki : bezpieczny plik cookie jest używany tylko wtedy, gdy przeglądarka odwiedza serwer za pośrednictwem protokołu HTTPS.
Pavel Hodek
6
@Pavel Hodek To zła flaga. Flaga „bezpiecznego” pliku cookie nie ma nic wspólnego z flagą zabezpieczeń HTTPOnly. Mają okropny system nazewnictwa.
wieża
1
Tytuł tego pytania należy zmienić tak, aby zawierał flagę „HttpOnly”. W obecnej formie wygląda na to, że pytanie dotyczy flagi „Bezpieczne”.
Tom

Odpowiedzi:

125

Różne przeglądarki umożliwiają różne środki bezpieczeństwa, gdy ustawiona jest flaga HTTPOnly . Na przykład Opera i Safari nie uniemożliwiają zapisywania w pliku cookie przez javascript. Jednak czytanie jest zawsze zabronione w najnowszych wersjach wszystkich głównych przeglądarek.

Ale co ważniejsze, dlaczego chcesz czytać HTTPOnlyplik cookie? Jeśli jesteś programistą, po prostu wyłącz flagę i upewnij się, że testujesz swój kod pod kątem xss. Jeśli to możliwe, radzę unikać wyłączania tej flagi. HTTPOnlyFlag i „bezpieczna flaga” (co wymusza cookie być przesyłane przez https) powinny być zawsze zestaw.

Jeśli jesteś atakującym , chcesz przejąć sesję . Ale jest łatwy sposób na przechwycenie sesji pomimo HTTPOnlyflagi. Nadal możesz jeździć na sesji bez znajomości identyfikatora sesji. Robak MySpace Samy właśnie to zrobił. Użył XHR do odczytania tokena CSRF, a następnie wykonania autoryzowanego zadania. Dlatego osoba atakująca może zrobić prawie wszystko, co może zrobić zalogowany użytkownik.

Ludzie zbytnio wierzą w HTTPOnlyflagę, XSS nadal można wykorzystać. Powinieneś ustawić bariery wokół wrażliwych funkcji. Takie jak pole zmiany hasła powinno wymagać aktualnego hasła. Zdolność administratora do utworzenia nowego konta powinna wymagać captcha, która jest techniką zapobiegania CSRF, której nie można łatwo ominąć za pomocą XHR .

wieża
źródło
Czy mógłbyś rozwinąć sprawę robaka? Ten link nie działa i tak naprawdę nie rozumiał zbyt wiele z Internetu. Dziękuję Ci.
Abhishek Jebaraj
@Abhishek Jebaraj Jeśli nie rozumiesz robaka sammy lub tokenów CSRF, spróbuj najpierw zrozumieć ograniczenia polityki tego samego pochodzenia
wieża
chcę uzyskać datę wygaśnięcia pliku cookie tylko http, jak to zrobić
PirateApp
50

Celem plików cookie HttpOnly jest to, że nie można uzyskać do nich dostępu przez JavaScript.

Jedynym sposobem (poza wykorzystywaniem błędów przeglądarki), aby skrypt je odczytał, jest posiadanie współpracującego skryptu na serwerze, który odczyta wartość pliku cookie i wyświetli ją z powrotem jako część treści odpowiedzi. Ale jeśli możesz i chciałbyś to zrobić, po co w ogóle używać plików cookie HttpOnly?

Ilmari Karonen
źródło
Możesz go przetestować, aby dowiedzieć się, czy przeglądarka użytkownika poprawnie obsługuje HttpOnly dla plików cookie, zanim zezwolisz użytkownikowi na korzystanie z Twojej witryny z określonej przeglądarki. Szukam przykładu, który zapewni obsługę flagi HttpOnly przez przeglądarkę. MS również radzi, aby to zrobić, ale nie ma dalszych porad, jak: Łagodzenie XSS za pomocą
HttpOnly
Znalazłem, że zalecają białą listę wersji przeglądarki. Mogę się mylić, ale czy nie byłby to wygodny sposób sprawdzenia obsługi z javascript? Czy mógłbyś zasugerować jakieś drawbaki?
Ursegor
-7

Jednym ze sposobów jest użycie inspektora sieci Safari, a na karcie przechowywania możesz zobaczyć wszystkie pliki cookie, httpOnly lub nie, i po prostu wybrać plik cookie Command + C, aby go skopiować.

Po uzyskaniu ciągu można go łatwo przeanalizować z powrotem za pomocą dowolnego parsera plików cookie lub zwykłego kodu JavaScript.

wprowadź opis obrazu tutaj

pankajdoharey
źródło
1
FF i Chrome również mogą to zrobić. Nie są tym samym, czego chce OP.
imba-tjd
@ imba-tjd Cóż, masz rację, ale używałem wówczas Safari, więc mogę to po prostu ręczyć.
pankajdoharey
To tak, jakbyś odpowiadał komuś, kto pyta „Jak uzyskać dane wejściowe użytkownika”, „Po prostu zapytaj go, a następnie wprowadź to w swoim kodzie”.
forumulator