Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Session Fixation
Forum PHP.pl > Forum > Przedszkole
-MarekK-
Witam.
Mam problem ze zrozumieniem problemu wiec postaram się go przedstawić. Mam aplikację a w niej sekcję odpowiedzalną za bezpieczeństwo dokladnie za kontrole Sesji. W ramach obrony przed Session Fixation stosuje prosty skrypt
  1. if (!isset($_SESSION['inicjuj']))
  2. {
  3. $_SESSION['inicjuj'] = true;
  4. }


I teraz wcielam się w "tego złego" i próbuję namieszać. Tworzę stronę która generuje mi ciasteczko do tej witryny z losowym SSID daje link do strony dla "ofiary" (ja nią jestem) następnie "ofiara" loguję się do aplikacji i....?
Moje zaskoczenie session_regenerate_id(); działa jak należy tworzony jest nowy SSID ale... po każdym odświeżeniu strony użytkownik musi znowu się logować gdyż w jego plikach coockie's jest złośliwe ciasteczko z przygotowanym SSID i np będzie ono istnieć tydzień. Przez tydzień nieszczęsliwy użytkownik ma problemy z korzystania z mojego serwisu bo...? co odświeży stronę to musi się znowu logować (jego sesja zostaje zniszczona przez session_regenerate_id();.

Pytanie do Was co można zrobić żeby uniknąć takiej sytuacji ?
nospor
Po pierwsze: kod co tu pokazałeś nie zabezpiecza przed żadnym session fixation
Po drugie: zaś twojego opisu problemu ni w ząb nie rozumiem.
-MarekK-
Okej jedziemy jeszcze raz...

Mamy sobie system logowania oparty na sesjach. Atak (jeśli nie session fixation - to sie myle) polegający na tym a żeby jakiś user zalogował się z określonym SSID, kiedyś to się robiło link?SSID=tralalalal. W moim przypadku atak polega na tym, że na jakieś stronie B jest kod który generuje ciasteczko o nazwie SSID o długości życia 7dni na strone A. Na stronie A znajduje sie zabezpieczenie przed takim atakiem czyli:

  1. if (!isset($_SESSION['inicjuj']))
  2. {
  3. $_SESSION['inicjuj'] = true;
  4. }


Teraz ten nieszcześliwy użytkownik jeśli się zaloguję to zostanie mu utworzony nowy ID sesji ale... jak odświeży stronę albo przejdzie na inną podstrone znowu jest (nie zalogowany) ponieważ w jego przeglądarce istnieje ciasteczko z SSID (wygenerowanym przez ta strone cool.gif system regeneruje id. Jeśli ktoś dalej nie wie o co chodzi to prosze zrobić prosty system sprawdzania sesji w PHP + zabezpieczenie które jest w/w (Wikipedia). Do tego prosze zrobić stronę która generuje ciasteczko o długości np 1 godziny z losowym SSID na strone gdzie jest zabezpieczenie. Potem proszę się zalogować i czy się Państwu uda. Mi tak ale odświeżenie strony i znowu trzeba się zalogowac.
nospor
Strona B nie jest wstanie stworzyć ciasteczka dla strony A. To po pierwsze.

Jeśli nawet ktoś trafi z właściwym ID sesji ofiary, to Twój kod nie wygeneruje nowego sessionID, gdyż ten ktoś będzie już w sesji $_SESSION['inicjuj'] swojej ofiary, wiec twoj warunek na regeneracji się nie sprawdzi.

I poraz kolejny ci pisze: Twoj kod w zaden sposób nie zabezpiecza przed session fixation.

-MarekK-
A propo Session Fixation
[PHP]if (!isset($_SESSION['SERVER_GENERATED_SID'])) {
session_destroy(); // destroy all data in session
}
session_regenerate_id(); // generate a new session identifier
$_SESSION['SERVER_GENERATED_SID'] = true;[/[PHP]

Źródło wikipedia session fixation.

Czy to jest juz poprawne?


Poza tym mam jeszcze pytanie. Parametr cookiedomain nie służy do tego aby ciasteczko zostało utworzone pod konkretny adres ? - Ucze się więc dla tego mam dużo pytań.
nospor
Jak już tak cytujesz tę wiki to proszę:
Cytat
One way to improve security is not to accept session identifiers that were not generated by the server. However, as noted above, this does not prevent all session fixation attacks.

To po pierwsze.
Po drugie i bez tej notki ten kod jest totalnie bez sensu. Co najwyżej może dotyczyć sytuacji, gdyż ktoś podrzuci całą sesję, a nie tylko jej identyfikator

Cytat
Poza tym mam jeszcze pytanie. Parametr cookiedomain nie służy do tego aby ciasteczko zostało utworzone pod konkretny adres ? - Ucze się więc dla tego mam dużo pytań.
domain służy do określania adresów w ramach domeny, a nie różnych domen. Gdyby domena A mogła ustawiać ciacho w domenie B to by się działo w necie że ohohoho.

ps: przeczytaj cały link z wiki. Masz tam kupę zdecydowanie lepszych rozwiązań.
-MarekK-
Dziękuję za wszystkie odpowiedzi. Rozjaśniło mi się i przepraszam jeśli troche Pana poirytowałem.
nospor
Cytat
jeśli troche Pana poirytowałem.
Czy wyglądam na poirytowanego? smile.gif
I przestań z tym Panem.... przez Ciebie czuję się jak facet po 60tce i to już mnie zaczyna irytować wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.