Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Włamanie na sesję
Forum PHP.pl > Forum > PHP
Michu
Witam. Od mniej więcej doby ktoś włamuje się na konta na mojej stronie - nie mam pojęcia w jaki sposób to robi, ale potrafi wejść na dowolne konto bez znajomości hasła. Od godzin szukam w kodzie jakiejkolwiek luki i nie mogę jej znaleźć. Nasunęło mi się pytanie - czy normalny użytkownik może ingerować w zawartość zmiennych przekazywanych w sesji? Nie sądzę, ale mimo to chcę się upewnić.
qwertyuiop1910
bardziej mi to wyglada na jakas dziure w kodzie niz na zmienianie danych w sesji.

Teorytycznie moim zdaniem nie jest to mozliwe, bo dane sa na serwerze i nie maja nic wspolnego z uzytkownikiem.
dr_bonzo
Sprawdz logi - czy uzywa "formularza" do logowania, zapisuj sobie dane jakie do tego formularza wysyla, moze sql injection, moze masz blad w kodzie nie wiem.
guitarnet.pl
pokaz kod logowania
marcio
Poczytaj o Session fixation/hijacking moze to jest powod chyba ze generujesz nowe id itd
qwertyuiop1910
a moze w cookie zapisujesz ID uzytkownika;]

podaj adres chociaz jak nie kod;]
dr_bonzo
tja - podaj adres - tez ci sie powlamujemy smile.gif
Michu
Mam, gościu może się dostać do sesji, sam to zrobiłem -.-
Debuguj, debuguj, debuguj...

A co do pokazania kodu - sorki, ale jesteście potencjalnymi wrogami tongue.gif
Ale dzięki za inicjatywę.
wlamywacz
Czy trzymanie w sesji nazwy zalogowanego usera jest bezpieczne ?
Cezar708
Cytat(wlamywacz @ 17.05.2008, 15:38:54 ) *
Czy trzymanie w sesji nazwy zalogowanego usera jest bezpieczne ?



w sesji wszystko jest bezpieczne.... pod warunkiem, że sesja jest bezpieczna. Osobiście trzymam sesję w bazie danych a nie w domyślnej lokalizacji PHP, zawsze jest bezpieczniej...

... aczkolwiek, co jeden zabezpieczy, drugi na pewno w końcu złamie... winksmiley.jpg
Black-Berry
Cytat(Michu @ 17.05.2008, 16:13:59 ) *
Mam, gościu może się dostać do sesji, sam to zrobiłem -.-
Debuguj, debuguj, debuguj...

A co do pokazania kodu - sorki, ale jesteście potencjalnymi wrogami tongue.gif
Ale dzięki za inicjatywę.


Mógłbyś chociaż napisać jak to było możliwe?
netmare
Cytat(Cezar708 @ 17.05.2008, 17:45:20 ) *
w sesji wszystko jest bezpieczne.... pod warunkiem, że sesja jest bezpieczna. Osobiście trzymam sesję w bazie danych a nie w domyślnej lokalizacji PHP, zawsze jest bezpieczniej...

... aczkolwiek, co jeden zabezpieczy, drugi na pewno w końcu złamie... winksmiley.jpg


Jeśli chodzi o pliki sesji to napewno nie mogą pozostać w lokalizacji domyślnej na współdzielonym serwerze, i dobrze jeśli miejsce przechowywania nie jest dostępne z poziomu przeglądarki.
em1X
Cytat("Michu")
Mam, gościu może się dostać do sesji, sam to zrobiłem -.-
Debuguj, debuguj, debuguj...

A co do pokazania kodu - sorki, ale jesteście potencjalnymi wrogami


e tam takie młodzieńcze popisywanie się, zapewne nieumiejętne programowanie. Kiedyś pamiętam, że gdy pracowałem nad nieobiektowym marnym nie swoim projekcie napisałem odwołanie do zmiennej sesyjnej przez referencję tj:

  1. <?php
  2. $user =& $_SESSION['user'];
  3. ?>


natomiast w jednej z podstron ktoś korzystał właśnie ze zmiennej $user jednak był pewien, że dzieje się to w innym kontekście. Podwójne przeładowanie strony sprawiało, że do zmiennej sesyjnej user, zapisywany był użytkownik nie zalogowany, ale ten którego dane się przeglądało.
Cezar708
Cytat(netmare @ 18.05.2008, 10:36:27 ) *
Jeśli chodzi o pliki sesji to napewno nie mogą pozostać w lokalizacji domyślnej na współdzielonym serwerze, i dobrze jeśli miejsce przechowywania nie jest dostępne z poziomu przeglądarki.



w zasadzie domyślna lokalizacja zwykle jest poza DocumentRoot'em, ale to nie wystarcza, bo zwykle jest to jakiś ogólnie dostępny folder z poziomu shella, na przykład /tmp. Wystarczy pomyśleć, że ktoś ma dostęp do tego samego serwera poprzez ssh... i już kradzież zapewniona...
netmare
Cytat(Cezar708 @ 18.05.2008, 12:51:33 ) *
w zasadzie domyślna lokalizacja zwykle jest poza DocumentRoot'em, ale to nie wystarcza, bo zwykle jest to jakiś ogólnie dostępny folder z poziomu shella, na przykład /tmp. Wystarczy pomyśleć, że ktoś ma dostęp do tego samego serwera poprzez ssh... i już kradzież zapewniona...


Niezależnie od dostępu przez ssh, jeśli jest to domyślna lokalizacja, możesz swoim skryptem php odwołać się do sesji utworzonej przez czyjś skrypt i dowlonie nią manipulować.
Cezar708
Cytat(netmare @ 18.05.2008, 10:59:10 ) *
Niezależnie od dostępu przez ssh, jeśli jest to domyślna lokalizacja, możesz swoim skryptem php odwołać się do sesji utworzonej przez czyjś skrypt i dowlonie nią manipulować.



no jasne, zgadzam się dlatego aby zabezpieczyć trzeba co najmniej zmienić lokalizację, a najlepiej (jak wcześniej napisałem) wrzucać sesję do bazy smile.gif
l0ud
Cytat
a najlepiej (jak wcześniej napisałem) wrzucać sesję do bazy

Wg. mnie to zbędne. Po co bawić się w dodatkowe mechanizmy, skoro wykradnięcie sesji jest możliwe tylko przy specyficznej (złej) konfiguracji serwera? Dodajemy tylko zbędną tabelę do bazy i zapytanie/a przy każdym wywołaniu...
Cezar708
Cytat(l0ud @ 18.05.2008, 11:20:34 ) *
Wg. mnie to zbędne. Po co bawić się w dodatkowe mechanizmy, skoro wykradnięcie sesji jest możliwe tylko przy specyficznej (złej) konfiguracji serwera? Dodajemy tylko zbędną tabelę do bazy i zapytanie/a przy każdym wywołaniu...


a ograniczenia:

1. Co jeżeli żądanie jest obsługiwane przez kilka serwerów WWW, które między sobą równoważą obciążenia, jak wtedy uzyskasz dane sesyjne?
2. Serwery hostujące bardzo często współużytkują serwer, a tam zwykle jest dostępny jeden folder z sesją (dostępny z poziomu PHP) dla wszystkich
3. Poza tym taka standardowa implementacja nie posiada dodatkowych zabezpieczeń typu sprawdzanie IP, UserAgent, czas ważności i inne, i w zasadzie musiałbyś to również implementować, a uwierz mi na bazie jest to o wiele prostrze i bezpieczniejsze
4. Poza tym często zdarza się, że pozostałe dane użytkownika (login, userType, imie, nazwisko etc) i tak są w bazie danych, więc po co najpierz ściągać dane z normalnie zapisanej sesji tylko po to aby wstawić je do zapytania w celu wyciągnięcia z bazy danych. Podczas zastosowania mechanizmu sesji opartego na bazie danych wszystko możesz na raz wyciągnąć za pomocą identyfikatora sesji.

Powyższe punkty całkowicie powinny zachęcić do używania mechanizmów sesji opartych o bazę danych.

Pozdrawiam
l0ud
Cytat
1. Co jeżeli żądanie jest obsługiwane przez kilka serwerów WWW, które między sobą równoważą obciążenia, jak wtedy uzyskasz dane sesyjne?

Nie przewiduję tworzenia aż tak rozbudowanych aplikacji, aby był potrzebny większy podział niż http dla skryptów, http dla elementów statycznych i baza danych smile.gif Zresztą przy tak dużym projekcie odpowiednia konfiguracja miejsca przechowywania sesji w PHP nie powinna sprawić problemów smile.gif
Cytat
2. Serwery hostujące bardzo często współużytkują serwer, a tam zwykle jest dostępny jeden folder z sesją (dostępny z poziomu PHP) dla wszystkich

Określenie 'zwykle' jest moim zdaniem przesadą winksmiley.jpg Każdy dobry hosting powinien posiadać oddzielny katalog 'tmp' dla każdego użytkownika.
Cytat
3. Poza tym taka standardowa implementacja nie posiada dodatkowych zabezpieczeń typu sprawdzanie IP, UserAgent, czas ważności i inne, i w zasadzie musiałbyś to również implementować, a uwierz mi na bazie jest to o wiele prostrze i bezpieczniejsze

Takie rzeczy jak useragent można przecież też trzymać też w sesji i weryfikować (oczywiście o ile modyfikacja sesji z zewnątrz nie jest możliwa - patrz wyżej). Pomijam fakt że wykradnięcie sesji wg. mnie jest mało prawdopodobne.
Cytat
4. Poza tym często zdarza się, że pozostałe dane użytkownika (login, userType, imie, nazwisko etc) i tak są w bazie danych, więc po co najpierz ściągać dane z normalnie zapisanej sesji tylko po to aby wstawić je do zapytania w celu wyciągnięcia z bazy danych. Podczas zastosowania mechanizmu sesji opartego na bazie danych wszystko możesz na raz wyciągnąć za pomocą identyfikatora sesji.

No racja. Ale nie chodziło mi o trzymaniu wszystkiego w sesji, tylko tworzenia dodatkowych tabel z dziesiątkami co chwile zmieniających się rekordów winksmiley.jpg Ja np. w sesji trzymam jedynie identyfikator użytkownika i na jego podstawie pobieram jego dane z tablicy 'users'. Twój post jednak nakłonił mnie do dodania jednego zabezpieczenia: hasła, które uniemożwili zalogowanie się na dowolnego użytkownika w przypadku zmodyfikowania sesji smile.gif

Pozdrawiam
marcio
Cytat
Określenie 'zwykle' jest moim zdaniem przesadą winksmiley.jpg Każdy dobry hosting powinien posiadać oddzielny katalog 'tmp' dla każdego użytkownika

Racja servery dedykowane maja to wszystkie na 100% bo jak nie to nie warto brac tego serva na cba.pl mozna sie wlamac na konto admina poprzez ingerencje w sesje smile.gif

Cytat
Twój post jednak nakłonił mnie do dodania jednego zabezpieczenia: hasła, które uniemożwili zalogowanie się na dowolnego użytkownika w przypadku zmodyfikowania sesji

Nie wiem czy cie dobrze zrozumialem tez tak mam w cms ze w cookie trzymam prawa/login/code/vip i jesli ktos chce sobie zmienic prawa nazwe user'a czy dac vip'a musi podac dobre dane do cookie bo na kazdej podstronie sprawdzam czy dane z cookie zgadzaja sie z tymi z bazy a nie mozna znac czyjego code bo go generuje przy rejestracji i sam user go nie znam smile.gif chyba ze luknie w cookie

Wiem mozna to obejsc xss samemu nawet mi sie udalo ale wszystkie Xss ze strony zostaly usuniety(przynajmniej te co znalazlem smile.gif)

Chcialem zapytac o jedna rzecz zawsze zwiazana z logowaniem wczoraj pisalem koledzie prosta galerie z logowanie jako ze nie chcialem tego robic ani na mysql/txt/dodatkowych plikach *.ini/*.php to zrobilem cos takiego
  1. <?php
  2.  
  3. $pass = array('marcio' => '41eacc44b55da8428feacdcb4bc71dd7', 'kmll' => 'a1d981b7c4fc9e09ab47d14ba67198a3');
  4.  
  5. echo('<form method="post" action="'.$_SERVER['PHP_SELF'].'">
  6. <table align="center">
  7. <tr>
  8. <td style="width:150px;background:#8a0000;color:#fff;text-align:center"><b>Login</b></td>
  9. <td><input type="text" name="login"></td>
  10. </tr>
  11. <tr>
  12. <td style="width:150px;background:#8a0000;color:#fff;text-align:center"><b>Haslo</b></td>
  13. <td><input type="password" name="haslo"></td>
  14. </tr>
  15. </table>
  16. <center><input type="submit" name="loguj" value="Loguj" style="background-color:#ECECEC; color:#000000; border: 1px solid blue;"></center>
  17. </form>
  18. ');
  19.  
  20. $login = strip_tags($_POST['login']);
  21. $haslo = strip_tags($_POST['haslo']);
  22.  
  23. if(!empty($login) && !empty($haslo) && isset($_POST['loguj'])) {
  24.  
  25. foreach($pass as $nick => $password) 
  26.  
  27.  if($login == $nick && md5($haslo) == $password) {
  28.  $_SESSION['login'] = 1;
  29.  $_SESSION['user'] = $login;
  30.  header("Location:upload.php");
  31.  }
  32. }
  33. ?>

Wiecie najktrotsze logowanie jakie do tej pory napisalem bez zadnych bajerow smile.gif i chce wiedziec czy mozna cos tu oszukac mi sie nie zdaje oczywiscie na kazdej podstronie sprawdzam czy sejse zostaly wyslane i czy maja dobra zawartosc jeszcze chyba tylko dodam
  1. <?php
  2. ?>

Tylko ze nigdy tego nie uzywalem wiec nie wiem zabardzo gdzie to dac z przykladow widze zeby to dawac na podstronach ale gdy jest sejsa lub jej nie ma?
.radex
No ale cba.pl (jak i pozostałe darmowe) nie są dobrymi serwerami tongue.gif
marcio
No wiadomo ze nie sa ale bez przesady ze prawie kazdy moze wejsc na konto admina smile.gif

P.S ja polecam szu.pl bez reklam do tego jest fsockopen()+shell_exec()
Jedyny minus nie ma sesji ale to co sa cookie smile.gif
Cezar708
Cytat(l0ud @ 18.05.2008, 12:58:51 ) *
Nie przewiduję tworzenia aż tak rozbudowanych aplikacji, aby był potrzebny większy podział niż http dla skryptów, http dla elementów statycznych i baza danych smile.gif Zresztą przy tak dużym projekcie odpowiednia konfiguracja miejsca przechowywania sesji w PHP nie powinna sprawić problemów smile.gif

po pierwsze: Jasne jeśli masz mały serwis to nie musisz stosować żadnych większych zabezpieczeń, w najgorszym wypadku ktoś się włamie i co... ano nic, masz backapy a klienci odwiedzający zawsze to wybaczą ;P. Po drugie: " odpowiednia konfiguracja miejsca przechowywania sesji w PHP nie powinna sprawić problemów", nie powinna? To w takim razie jak chcesz bezpiecznie przechowywać sesję? Na jeszcze oddzielnym serwerze? No myślę, że to dopiero może być dziura.
Cytat(l0ud @ 18.05.2008, 12:58:51 ) *
Określenie 'zwykle' jest moim zdaniem przesadą winksmiley.jpg Każdy dobry hosting powinien posiadać oddzielny katalog 'tmp' dla każdego użytkownika.

No może masz w większości przypadków rację, ale jak napisał później marcio, takie serwery się jeszcze zdarzają i po co się zastanawiać czy moj hostodawca na to zwraca uwagę czy nie...
Cytat(l0ud @ 18.05.2008, 12:58:51 ) *
Takie rzeczy jak useragent można przecież też trzymać też w sesji i weryfikować (oczywiście o ile modyfikacja sesji z zewnątrz nie jest możliwa - patrz wyżej). Pomijam fakt że wykradnięcie sesji wg. mnie jest mało prawdopodobne.

no tak ale wystarczy jedno zapytanie i wszystko jasne, po co to w ogóle w sesji trzymać? Wystarczy kolumna w bazie danych i podczas odwiedzin sprawdzać wartość
Cytat(l0ud @ 18.05.2008, 12:58:51 ) *
No racja. Ale nie chodziło mi o trzymaniu wszystkiego w sesji, tylko tworzenia dodatkowych tabel z dziesiątkami co chwile zmieniających się rekordów winksmiley.jpg Ja np. w sesji trzymam jedynie identyfikator użytkownika i na jego podstawie pobieram jego dane z tablicy 'users'. Twój post jednak nakłonił mnie do dodania jednego zabezpieczenia: hasła, które uniemożwili zalogowanie się na dowolnego użytkownika w przypadku zmodyfikowania sesji smile.gif

Pozdrawiam

Powiedzmy sobie szczerze, to już jest duże zabezpieczenie, które tak naprawdę dla małych serwwisów nie jest koniecznie, jednakże trzeba o takich możliwościach wiedzieć w razie nagłego wzrostu zainteresowania serwisem winksmiley.jpg

Pozdrawiam
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.