Gisteren kwam ik een presentatie tegen van Ilia Alshanetsky over beveiliging in PHP. Daar kwamen een aantal punten in voor die ik graag met jullie wil delen en benieuwd ben naar jullie mening/aanpak.

Punt 1: Session Fixation
Session fixation is een manier om een sessie te stelen waarbij de aanvaller vooraf weet welk session id het slachtoffer krijgt. (Dus niet zoals bij session hijacking waarbij het session id achteraf gestolen wordt.) Dit is toe te passen met bijvoorbeeld een link als:
jouw.bank.com/?PHPSESSID=foobar
Als het slachtoffer nu op de link klikt denkt de website dat het sessie id foobar is en gaat hier alle gegevens aan koppelen, de aanvaller kan nu simpelweg dat sessie id ook gebruiken.
De oplossing die hierbij gegeven wordt is door simpelweg na het inloggen een nieuw sessie id toe te wijzen waardoor de aanvaller geen kans meer heeft:

<?php
session_start();
// some login code
if ($login_ok) { // user logging in
session_regenerate_id(); // make new session id
?>


Punt 2: Session Hijacking
Een veel toegepaste techniek om [google]session hijacking[/google] (en ook helpt om session fixation) te voorkomen is een sessie koppelen aan een gebruiker. Maar hoe kan je nu een sessie aan een gebruiker koppelen? Een veelgebruikte manier daarvoor is om de sessie aan het IP adres van de gebruiker te koppelen, maar dit heeft een paar nadelen waaronder:
- Er kunnen meerdere mensen met het zelfde ip adres zijn (denk aan thuis- of sommige bedrijfsnetwerken).
- Een IP adres kan vaak wisselen.
- Een IP adres is te spoofen.
In de presentatie wordt ook een voorbeeld met een alternatief gegeven voor het koppelen van een sessie aan een ip adres, namelijk het koppelen aan de browser signature:

<?php
session_start();
$chk = @md5(
$_SERVER['HTTP_ACCEPT_CHARSET'] .
$_SERVER['HTTP_ACCEPT_ENCODING'] .
$_SERVER['HTTP_ACCEPT_LANGUAGE'] .
$_SERVER['HTTP_USER_AGENT']);
if (empty($_SESSION))
$_SESSION['key'] = $chk;
else if ($_SESSION['key'] != $chk)
session_destroy();
?>

Ook dit is niet helemaal water dicht omdat het vaker voor kan komen en door de gebruiker aan te passen is. Maar misschien is het een idee om ook nog het IP adres in de md5-hash mee te nemen?

Ik hoop dat iemand hier wat aan heeft of misschien zelfs wel andere manieren heeft om deze problemen te voorkomen/beveiligen.
ik zie mensen hier wel de hele tijd over het vervalsen van deze data en aftappen met wireshark maar die "Fingerprint" is bijna onmogelijk te kraken als de hacker op een totaal andere kant van het internet zit. en dan nog je moet je mensen van je kantoor/bedrijf/collega's toch wel vertrouwen. dat die niet wiresharken????

thx voor de info het zit nu in mijn nieuwste project ingebouwd.
en dan een SSL certificaat erop. en dan is het erg veilig.
Ivo van B. schreef op 10.03.2008 19:14
[quote='Martijn! schreef op 10.03.2008 18:35']Ik heb even vlug door alle post heen gelezen.
Maar ik hoor niemand "garbag collector" zeggen.

Als een sessie bijvoorbeeld een uur niet actief is dan wordt deze of door de "garbag collector" verwijderd of door een hit op die sessie. Ook kun je cookies aan maken die na het sluiten van de browser ongeldig worden. In de cookie staat alleen het sessie id (MD5 of SHA1 hash), meer niet.

Neem daarbij IP, browsernaam en eventueel x-forwarder controle en je hebt een redelijke veilig sessie systeem.

Met IP controle moet je oppassen dat je alleen de eerste 3 delen van het IPv4 controleert. Voor mensen met een dynamisch IP. Uiteraard geld dit ook voor IPv6.

Dit lijkt me dan weer minder veilig omdat je dan maar een deel van het IP hebt...


Het laten verlopen van sessie's is een mogelijkheid maar ik zou dat alleen doen bij website's waar dat echt nodig is of waar de bezoeker er weinig last van heeft. Ik neem even als voorbeeld een bank, daar is het i.m.o. heel goed dat sessie's verlopen. Bij communities e.d. lijkt het me dan weer minder geschikt.[/quote]


idd, dan zou theoretisch gezien iedereen die bij je provider op hetzelfde subnet zit jou sessie kunnen overnemen als ze door de rest van de controles heen komen. Als je op publiek IP checkt is dit alleen nog maar in je eigen netwerk, wat de kans op hacken toch al weer verkleint.
dennis schreef op 30.05.2008 14:30
ik zie mensen hier wel de hele tijd over het vervalsen van deze data en aftappen met wireshark maar die "Fingerprint" is bijna onmogelijk te kraken als de hacker op een totaal andere kant van het internet zit. en dan nog je moet je mensen van je kantoor/bedrijf/collega's toch wel vertrouwen. dat die niet wiresharken????


Ik denk dat het juist je collega's zullen zijn die iets simpels als Session Fixation zullen proberen. Het is vrij simpel, ze weten genoeg info van je (websites, gebruikersnamen, wanneer je bent ingelogd) die je nodig hebt, en het is een hele gemakkelijke manier van een flauw geintje uithalen. Aanvallen van de andere kant van de wereld zijn veel anoniemer, en lijken mij meer gericht op veel gebruikers tegelijkertijd. Ik denk dat je vanaf veraf veel eerder een aanval als Cross Site Scripting of Phishing kan verwachten. Daar heb je hele groepen gebruikers tegelijkertijd mee.

Reageren