• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapobieganie atakom Session Hijacking (Cookie Hijacking)

Object Storage Arubacloud
0 głosów
361 wizyt
pytanie zadane 18 września 2016 w PHP przez MatiiTv Gaduła (3,790 p.)

Witam. Stworzyłem kod gdzie po zalogowaniu przez OpenID dane o koncie z logowania są przekazywane do bazy danych i jest generowany hash szyfrowany za pomocą SHA512. Hash jest zapisywany w bazie danych i jako ciasteczko w przeglądarce. Działa to tak, że skrypt przeszukuje bazę danych szukając wpisu gdzie jest wpisany hash z przeglądarki i jeżeli znajdzie to przekazuje do przeglądarki w formie tablicy cały wpis. 

if (isset($_COOKIE['hash'])) {
	$sql = $db->query("SELECT * FROM `users` WHERE `hash` = " . $db->quote($_COOKIE['hash']));
	if ($sql->rowCount() != 0) {
		$row = $sql->fetch();
		$user = $row;
	}
}

Chciałbym sprawić, aby niemożliwe było zwykłe przechwycenie hasha, ustawienie go w swojej przeglądarce i uzyskanie dostępu do całego konta użytkownika. Nie chodzi mi tu o HTTPS czy SSL, bo równie dobrze można po prostu sprawdzić pliki cookie fizycznie.

Pozdrawiam.

1 odpowiedź

+4 głosów
odpowiedź 18 września 2016 przez Comandeer Guru (600,390 p.)

Przy każdym żądaniu generuj hasha na nowo. I postaraj się, żeby zawsze był całkowicie losowy (np. hashuj output z random_bytes).

 można po prostu sprawdzić pliki cookie fizycznie

Jak ktoś ma dostęp do komputera usera, to raczej już nic nie zrobisz…

Maksymalne zabezpieczenie cookies to:

  • ustawienie flagi httpOnly
  • ustawienie flagi secure
  • ustawienie flagi SameSite
  • SSL + HSTS
  • mocne Content Security Policy dla strony
  • zablokowanie wczytywania strony w ramkach (czyli albo CSP, albo dodatkowo X-Frame-Options)
  • obcięcie CORS
  • generowanie nowego hasha i cookie przy każdym żądaniu

 

komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)

zrobiłem to w ten sposób:

na początku pliku:

if($_SERVER['HTTP_CLIENT_IP'])
{
 $ip = $_SERVER['HTTP_CLIENT_IP'];
}
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
{
 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
 $ip = $_SERVER['REMOTE_ADDR'];
}

przy żądaniu:

if (isset($_COOKIE['hash'])) {
	$sql = $db->query("SELECT * FROM `users` WHERE `hash` = " . $db->quote($_COOKIE['hash']));
	if ($sql->rowCount() != 0) {
		$row = $sql->fetch();
		$user = $row;
		if($ip!=$user['ip']){
			unset($row);
			unset($user);
		}
	}
}

przy logowaniu:

$db->exec("INSERT INTO `users` (`hash`, `steamid`, `name`, `avatar`, `ip`) VALUES ('" . $hash . "', '" . $steamid . "', " . $db->quote($name) . ", '" . $avatar . "', '" . $ip . "')");

 

komentarz 18 września 2016 przez Comandeer Guru (600,390 p.)
Polecam przejść na prepared statements przy zapytaniach w bazie.
komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)
Dodałem flagę httpOnly i ustawiłem header("X-Frame-Options: DENY");

No, chyba jest bezpiecznie :)
komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)

"prepared statements"? 

a po co to?

1
komentarz 18 września 2016 przez Comandeer Guru (600,390 p.)
Żeby zabezpieczyć bazę.

Podobne pytania

0 głosów
3 odpowiedzi 743 wizyt
pytanie zadane 13 sierpnia 2016 w PHP przez patryk11441 Obywatel (1,150 p.)
0 głosów
2 odpowiedzi 944 wizyt
pytanie zadane 23 czerwca 2015 w PHP przez Kazuhiro Użytkownik (910 p.)
0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 7 października 2018 w JavaScript przez rafal.budzis Szeryf (85,260 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...