Contribuez à SecuObs en envoyant des bitcoins ou des dogecoins.
Nouveaux articles (fr): 1pwnthhW21zdnQ5WucjmnF3pk9puT5fDF
Amélioration du site: 1hckU85orcGCm8A9hk67391LCy4ECGJca

Contribute to SecuObs by sending bitcoins or dogecoins.



[Sécurité et PHP - Partie 2] La gestion des sessions

Par Rédaction, secuobs.com
Le 10/05/2008


Résumé : Les sessions permettent à un site de reconnaître un utilisateur de manière unique à chacune de ses requêtes afin de lui proposer un contenu qui lui soit propre, il est cependant possible pour un attaquant de voler la session d'un utilisateur afin d'en usurper l'identité et d'accéder à ses informations privées.



NDLR : ce document a été rédigé en 2006, certaines versions ainsi que certaines configurations des logiciels utilisés selon ces versions peuvent être différentes de celles qui sont mentionnées ; merci de vous reporter vers les sites officiels des projets en question en cas de problème.


Un identifiant de session est une valeur généralement égale à 128 bits, cette valeur est représentée en hexadécimal (ex : 4d7324727be3bd2e9783078e6d0806e7) et elle sert à identifier une personne unique.

Elle permettra au site de reconnaître un utilisateur à chacune de ses requêtes afin de lui fournir des actions spécifiques suivant les informations enregistrées dans la base de données (ou pas).

L’identifiant de session doit être difficile à prévoir pour un attaquant sinon c'est l'ensemble de la confidentialité du service qui est compromise et donc celle de ses utilisateurs.

Pour créer un identifiant de session qui soit sécurisé, il est possible d’utiliser la fonction uniqid() fournie par le langage PHP :

md5( uniqid( rand (),true ) );


Il est important de créer une session à l’aide de la fonction uniqid(), car la créer uniquement en la générant aléatoirement avec une notion de date et d'heure de création pourrait permettre à un attaquant de retrouver ces informations d'identification de session via les techniques de bruteforce dans certain cas.

Un autre type d’attaque sur les sessions existe, elle consiste à faire en sorte que la victime se connecte sur le site avec un identifiant de session que l'on aura défini préalablement ; ainsi si la victime s’identifie ensuite sur le site web avec cet identifiant, on pourra accéder à sa session afin d'usuper son identité et récupérer des informations sensibles sur son compte.

Pour cela il suffirait de réaliser un faux site web avec un nom de domaine ressemblant à celui du site ciblé ; sur ce site on pourrait mettre en place une redirection web telle que « index.php?PHPSESSID=fakesessid ». Le lien ressemblera alors à « index.php?PHPSESSID=4d7324727be3bd2e9783078e6d0806e7 » :

<?php
header('Location: www.site.com/index.php?PHPSESSID=1234');
?>



Il est généralement nécessaire que le cookie de la victime soit également vide ou expiré afin de pouvoir réaliser ce genre d'attaque. Il ne reste donc plus qu’à attendre que la victime s’identifie avec son pseudo et son mot de passe et aller nous aussi sur l'url « index.php?PHPSESSID=fakesessid » pour pouvoir accéder à la session de cette victime.

Pour sécuriser son script contre ce genre d’attaque il suffit de régénérer un identifiant dès que l’authentification a été réalisée. Le script doit sécuriser les applications web contre les identifiants de session qui n’ont jamais était créés préalablement par le serveur ; s'il n'y avait que la fonction session_start(), le script serait alors vulnérable à ce type d’attaque.

Le script sécurisé :

<?php
session_start();

if (!isset($_SESSION['initiated']))
{
session_regenerate_id();
$_SESSION['initiated'] = true;
}
?>



Il est par ailleurs possible de régénérer le session identifiée lors de l’authentification pour plus de sécurité, ou même de la régénérer à chaque requête sur le serveur.


Autres ressources dans ce dossier :

[Sécurité et PHP - Partie 1] Les injections SQL – lien

[Sécurité et PHP - Partie 3] Les failles PHP – lien

[Sécurité et PHP - Partie 4] RPVS – lien

[Sécurité et PHP - Partie 5] Astuces – lien