poniedziałek, 5 października 2009

Ukradli sesję!

Już jakiś czas rozmawiam ze znajomymi o zabezpieczeniach. Większość zgodnie używa do zabezpieczenia po stronie PHP sesji, ale czy używa ich prawidłowo? Do tego dojdziemy, ale zacznijmy od spraw oczywistych.

Czym jest sesja i do czego służy? Sesja to odmiana ciasteczka charakteryzująca się tym, że wszystkie dane sesji trzymane są po stronie serwera. Wydaje się być to najbezpieczniejszym rozwiązaniem ponieważ użytkownik posiada jedynie ID sesji i nie ma bezpośredniej możliwości manipulowania danymi zawartymi w sesji. Super mamy coś czego nikt nam nie zmieni!

Z w.w. powodu sesja to bardzo dobry sposób na trzymanie stanu zalogowania użytkownika oraz podstawowych danych sesji. Jednak jest tego zasadniczy minus. Co jak ktoś przechwyci sesję?

HTTP jest protokołem bezstanowym, dlatego każdy kto posłuży się ID sesji ma do niej dostęp. Załóżmy, że Janek zalogował się do serwisu i otrzymał identyfikator sesji ab12c. Następnie sytuację gdzie Krzysiek logując się do serwera lub też niekoniecznie po przez logowanie - celowo/niecelowo - otrzymuje ID sesji taki sam jak Janek. W tym momencie jeśli Krzysiek celowo przejął ID sesji Janka, dla serwisu jest Jankiem.

Przykry scenariusz, jednak jesteśmy na niego narażeni, jeśli nikt nie zabezpieczył się przez przechwyceniem sesji. Ale jak się zabezpieczyć? - zapytacie. Otóż istnieje bardzo prosta technika:
  1. przy tworzeniu sesji zapisujemy w sesji IP usera który powołał sesję do życia
  2. przy następnych zapytaniach porównujemy IP zapytania z IP w sesji
  3. jeśli IP się nie zgodzi niszczymy sesję
Ten prosty sposób już sporo nam daje, lecz kiedy zawiedzie? Chociaż by, w sytuacji gdy Jan i Krzysiek są użytkownikami tej samej sieci lokalnej, która do komunikacji z internetem używa tej samej bramy. Możliwe, że Janek łączy się przez proxy, jeśli Krzysiek użyje tego samego proxy nasze zabezpieczenie również zawiedzie.

Jak się ustrzec przed tymi, jaki i kolejnymi potencjalnymi atakami napiszę w części 2 (w bliżej nie określonym terminie).