Tworzymy strony WWW bo lubimy :)

11 wrz 2009

Mechanizmy uwierzytelniania i zarządzania sesją użytkownika stanowią nieodłączny element każdej większej internetowej aplikacji bazodanowej. Jeśli nie podjęto wystarczających kroków w celu ich zabezpieczenia, napastnik może uzyskać poziom uprawnień, który pozwoli mu na wykonania operacji zagrażających bezpieczeństwu zarówno całego systemu jak i użytkowników z niego korzystających.

Ataki na proces uwierzytelniania

Uwierzytelnianie użytkowników można zdefiniować jako proces weryfikacji czy dany użytkownik jest tą osobą, za którą się podaje [OWASP02, s.16]. Najpopularniejszym sposobem uwierzytelniania użytkowników w Internecie są obecnie hasła. Niestety ciągle obserwowany jest wzrost efektywności rozmaitych programów do łamania szyfrowanych haseł [KLG03, s.393].

Wyróżnia się dwa podstawowe sposoby łamania haseł [SGT05, s.229] :

  • Atak słownikowy (dictionary attack) - zautomatyzowany atak skierowany przeciwko systemowi uwierzytelniania, który polega na sprawdzeniu kolejnych gotowych haseł znajdujących się w bazie danych, tzw. słowniku,
  • Atak siłowy (brute-force password attack) - polega na omijaniu zabezpieczeń systemu przez podejmowanie prób zalogowania się przy użyciu każdego dopuszczalnego hasła; w tej metodzie analizowany jest każdy możliwy przypadek.

Bez względu na szczegółowe nazwy tych ataków, należy je traktować jako techniki siłowe, czyli takie, które w drodze zautomatyzowanego procesu metodą prób i błędów próbują odgadnąć dane uwierzytelniające.

Według innego podziału można wyróżnić następujące ataki siłowe [WASC04a, s.11] :

  • Zwyczajne ataki siłowe (normal brute force attacks) – atakujący używa nazwy użytkownika i dopasowywuje do niego hasła.
  • Odwrócone ataki siłowe (reverse brute force attacks) – atakujący używa jednego hasła i dopasowuje do nich nazwy użytkowników. W systemach z milionami kont, prawdopodobieństwo tego, że wielu użytkowników posiada to samo hasło jest wysokie.

Wartym odnotowania jest fakt, że atak siłowy z reguły wymaga dużych nakładów czasowych, co może być często zniechęcającym czynnikiem dla napastnika. Kluczową rolę odgrywa stopień skomplikowania haseł przechowywanych w systemie.


Specyficzną odmianą zagrożeń związanych z procesem uwierzytelniania są ataki socjotechniczne. Największy problem polega na tym, że nie są to ataki techniczne, a jedynie próby nakłaniania użytkowników do wykonania nierozsądnych działań [Schl04, s.332]. Najczęściej przyjmują następującą formę [Schl04, s.332] :

  • Podawanie się za administratora systemu i wysyłanie wiadomości poczty elektronicznej do użytkowników z prośbą o podanie haseł.
  • Utworzenie lustrzanej kopii strony logowania witryny i nakłanianie użytkowników do prób logowania (Phishing).

Wyżej wymienione formy ataku często są też ze sobą łączone. Ochrona przed tego typu zagrożeniami na poziomie aplikacji jest niemożliwa. Praktycznie jedyne, co można zrobić, to uświadomić użytkowników o istniejącym niebezpieczeństwie tak, aby starali się go unikać.

Ataki na sesje użytkownika


Mechanizm zarządzania sesją jest powszechnie stosowany w celu identyfikacji i śledzenia użytkownika pomiędzy kolejnymi podstronami. W rezultacie nie musi on podawać swoich danych uwierzytelniających - z reguły nazwy i hasła - przed obejrzeniem każdej podstrony w ramach danej witryny. Użytkownikowi przydzielany jest unikalny identyfikator, dzięki któremu aplikacja jest w stanie go rozpoznać, odczytać i przydzielić odpowiedni zestaw uprawnień lub innych danych specyficznych dla niego. Duża grupa zagrożeń dotyczących mechanizmu autoryzacji ma związek właśnie z tym identyfikatorem sesji. Użycie przez atakującego tego samego identyfikatora co prawowity użytkownik prowadzi bowiem do nieuprawnionego dostępu do aplikacji i wykonania operacji w jego imieniu.

Wyróżnia się kilka ataków i zagrożeń związanych z sesjami. Należą do nich przechwycenie sesji, wymuszenie sesji, ujawnienie danych sesji, podmiana całej sesji oraz podmiana danych sesji.

Przechwycenie sesji (Session Hijacking) odnosi się do tych ataków, które próbują uzyskać dostęp do istniejącej sesji użytkownika [Shif04b, s.42]. Oznacza to tych użytkowników, którym identyfikator został już przydzielony. Znane są dwie podstawowe metody uzyskania identyfikatora sesji :

  • Domniemanie sesji – można zaliczyć tu następujące sposoby : wykorzystanie podatności aplikacji na atak Cross Site Scripting [Kols02, s.15], odczytanie identyfikatora sesji z nagłówka HTTP Referer wysyłanego do innego serwera [Ollm03] czy też odgadnięcie identyfikatora; ostatni z wymienionych sposobów staje się możliwy, gdy identyfikator nie jest wystarczająco losową wartością; istnieje wiele technik matematycznych, np. prognozowanie matematyczne, które mogą być zastosowane do odgadywania przewidywalnych, czasem sekwencyjnych, identyfikatorów sesji [ScSh02, s.155]. Do odgadnięcia można zastosować także atak siłowy – jest on skuteczny, gdy atakujący jest w stanie określić ograniczony zbiór możliwych identyfikatorów lub gdy zakres generowanych identyfikatorów jest stosunkowo wąski, np. liczba ze zbioru od 1 do 10000 [Olse04, s.12].
  • Podsłuchiwanie ruchu sieciowego – napastnik, który ma możliwość monitorowania ruchu sieciowego pomiędzy atakowanym użytkownikiem a serwerem, może wykraść identyfikator sesji, ponieważ jest on przesyłany tekstem jawnym [Olse04, s.11], ale tylko wtedy, gdy nie zastosowano bezpiecznego połączenia SSL.

Kolejny rodzaj ataku, określany terminem “wymuszenie sesji” (Session Fixation), różni się od opisanych wyżej technik tym, że napastnik nie skupia swojej uwagi na zdobyciu identyfikatora sesji ofiary, a raczej na skłonieniu ofiary do użycia identyfikatora określonego przez niego samego [Olse04, s.12]. Innymi słowy, użytkownik zostaje nieświadomie skłoniony do użycia sesji zainicjowanej przez atakującego. Atak ten przebiega w trzech krokach [Kols02; Esse05] :

  • Ustanowienie sesji – w pierwszym kroku atakujący tworzy losowy identyfikator sesji lub rozpoczyna nową sesję na docelowym serwerze i pozyskuje z niej identyfikator; zazwyczaj musi on utrzymywać sesję przez wielokrotne wysyłanie żądań, aby uniknąć jej wygaśnięcia,
  • Wymuszenie sesji – atakujący przekazuje ofierze ustalony identyfikator (zob. rysunek 6, krok 1); przekazanie to może się odbyć na wiele sposobów m.in. może on wykorzystać techniki polegające na iniekcji i wykonaniu wrogiego kodu, np. Cross Site Scripting; może także po prostu skłonić ofiarę do uruchomienia odpowiednio spreparowanego odnośnika lub formularza HTML,
  • Uzyskanie dostępu – w ostatnim kroku atakującemu pozostaje tylko czekać, aż ofiara zaloguje się do aplikacji używając ustalonego identyfikatora (zob. rysunek 6, krok 2), po czym wykorzystując ten sam identyfikator atakujący może podszyć się pod ofiarę (zob. rysunek 6, krok 3).

przebieg ataku wymuszenia sesji


Nieco innym rodzajem zagrożeń są : ujawnienie danych sesyjnych oraz podmiana całej sesji. Oba wykorzystują dość kontrowersyjną cechę języka PHP. Otóż w standardowej konfiguracji, PHP zapisuje sesje w pliku, w tym samym katalogu (w przypadku systemu operacyjnego Linux jest to katalog tymczasowy /tmp), w wyniku czego w środowiskach współdzielonych wiele osób zapisuje dane sesyjne w tym samym miejscu i z tymi samymi uprawnieniami [Jaku03]. Atakujący może to wykorzystać do podmiany pliku sesji lub danych w nim zawartych. Testy dowodzą, że w ten sposób skonfigurowanych jest wiele kont u wielu dostawców usług hostingowych, a także serwerów uczelnianych [Mrug06, s. 75]. Jednakże problem nie dotyczy tylko środowisk współdzielonych. Ujawnienie plików sesji jest możliwe bowiem także np. przy użyciu Directory Traversal, natomiast do modyfikacji tych plików można wykorzystać chociażby podatność aplikacji na iniekcję poleceń systemowych.

Ostatnie z zagrożeń opisywanych w niniejszym punkcie, czyli atak polegający na podmianie danych sesji (ang. Session Injection) nie do końca związany jest z samym mechanizmem zarządzania sesją. O wiele bardziej dotyczy zagrożeń iniekcji złośliwego kodu oraz manipulacji parametrami wejściowymi. Podmiana danych sesji polega na nieautoryzowanym rejestrowaniu zmiennych w sesji [Jaku03]. Atak ten możliwy jest wtedy, gdy zmienne sesyjne inicjowane lub modyfikowane są na podstawie danych pochodzących od użytkownika, a weryfikacja tych danych jest niewystarczająca.

Jak pokazują wyżej omówione zagrożenia związane z poprawnym uwierzytelnianiem i identyfikacją użytkownika, kwestia ochrony tych mechanizmów nie powinna być lekceważona, tym bardziej że standardowy mechanizm sesji zaimplementowany w PHP nie daje wystarczającego poziomu bezpieczeństwa. Dodatkowo możliwość wykorzystania innych technik ataku na aplikację internetowe w celu przejęcia sesji użytkownika, pokazuje, że na bezpieczeństwo stron WWW powinno się patrzeć całościowo z szczególnym naciskiem na metody wykorzystujące wstrzykiwanie wrogiego kodu. Metody te bowiem bardzo często stają się skutecznym środkiem w przeprowadzanych atakach.


Artykuł jest fragmentem pracy "BEZPIECZEŃSTWO INTERNETOWYCH APLIKACJI BAZODANOWYCH PHP/MySQL - ZAGROŻENIA" autorstwa Przemka Sobstela. Tekst został opublikowany na zasadach licencji Creative Commons