Le serveur et le client communiquent via des sessions. Lorsque le navigateur du client se connecte au serveur, le serveur établira une session pour l'utilisateur. La session de chaque utilisateur est indépendante et maintenue par le serveur. La session de chaque utilisateur est identifiée par une chaîne unique, appelée identifiant de session. Lorsqu'un utilisateur fait une demande, l'en-tête http envoyé contient la valeur de l'identifiant de session. Le serveur utilise l'identifiant de session dans l'en-tête http pour identifier quel utilisateur a soumis la demande.
La session enregistre les données personnelles de chaque utilisateur. Les applications Web générales utiliseront la session pour enregistrer les comptes d'utilisateurs et les mots de passe authentifiés. Lors de la conversion de différentes pages Web, si vous devez vérifier l'identité de l'utilisateur, utilisez le compte et le mot de passe enregistrés dans la session pour comparer. Le cycle de vie de la session commence lorsque l'utilisateur se connecte au serveur et se termine lorsque l'utilisateur ferme le navigateur ou se déconnecte lorsque la fonction session_destroy supprime les données de session. Si l'utilisateur n'utilise pas l'ordinateur dans les 20 minutes, la session se terminera automatiquement.
Architecture d'application de traitement de session PHP
Détournement de session
Le piratage de session fait référence à l'attaquant utilisant divers moyens pour obtenir l'identité de la session de l'utilisateur cible identifiant. Une fois l'ID de session obtenu, l'attaquant peut utiliser l'identité de l'utilisateur cible pour se connecter au site Web et obtenir les autorisations d'utilisation de l'utilisateur cible.
Méthodes permettant aux attaquants d'obtenir l'identifiant de session de l'utilisateur cible :
1) Craquage par force brute : essayez différents identifiants de session jusqu'à ce qu'ils soient piratés.
2) Calcul : Si l'identifiant de session est généré de manière non aléatoire, il est possible de le calculer
3) Vol : Utilisez l'interception du réseau, les attaques XSS et d'autres méthodes pour obtenir
Étapes d'attaque par piratage de session
Instance
//login.php session_start(); if (isset($_POST["login"])) { $link = mysql_connect("localhost", "root", "root") or die("无法建立MySQL数据库连接:" . mysql_error()); mysql_select_db("cms") or die("无法选择MySQL数据库"); if (!get_magic_quotes_gpc()) { $query = "select * from member where username=’" . addslashes($_POST["username"]) . "’ and password=’" . addslashes($_POST["password"]) . "’"; } else { $query = "select * from member where username=’" . $_POST["username"] . "’ and password=’" . $_POST["password"] . "’"; } $result = mysql_query($query) or die("执行MySQL查询语句失败:" . mysql_error()); $match_count = mysql_num_rows($result); if ($match_count) { $_SESSION["book"] = 1; mysql_close($link); header("Location: http://localhost/index.php?user=" . $_POST["username"]); } ….. // 打开Session 访客的 Session ID 是:echo session_id(); ?>
Affichée après la connexion
Démarrer l'attaque
//attack.php
php
//Ouvrir la session
session_start ();
echo "L'ID de session de l'utilisateur cible est :" . session_id() . "
";
echo "Le nom d'utilisateur de l'utilisateur cible est : " $_SESSION[. "username"] . "
"
echo "Le mot de passe de l'utilisateur cible est :"
/ . / Définissez le nombre de livres sur 2000
$_SESSION["book"] = 2000;
?>
Soumettre http://localhost/attack .php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 Cet identifiant est obtenu ID de session client, après avoir actualisé la page client
attaque fixe de session
Les pirates peuvent terminer l'attaque en envoyant l'identifiant de session à l'utilisateur
http://localhost/index.php?user=dodo&PHPSESSID=1234 Envoyer ce lien à l'utilisateur dodo pour l'afficher
Ensuite, l'attaquant visite http://localhost/attack.php?PHPSESSID=1234, la page client s'actualise et trouve
Méthodes de prévention
1) Changer régulièrement l'identifiant de session
La fonction bool session_regenerate_id([bool delete_old_session])
delete_old_session est true , supprimez l'ancien fichier de session ; si faux, conservez l'ancienne session, la valeur par défaut est false, facultatif
ajoutez
au début de l'index. php session_start();
session_regenerate_id(TRUE);
......
De cette façon, un nouvel identifiant de session sera généré à chaque rechargement
2) Changer le nom de la session
Le nom par défaut de la session est PHPSESSID Cette variable sera enregistrée dans le cookie Si le pirate ne capture pas le paquet et ne l'analyse pas, il ne pourra pas deviner ce nom et bloquer certaines attaques
session_start();
session_name("mysessionid");
......
3) Désactiver l'identifiant de session transparent
L'identifiant de session transparent signifie que lorsque la requête http dans le navigateur n'utilise pas de cookies pour spécifier l'identifiant de session, la session l'identifiant est transmis à l'aide d'un lien ; ouvrez php.ini, éditez
session.use_trans_sid = 0
Dans le code
int_set( "session.use_trans_sid", 0);
session_start();
……
4) Vérifier uniquement l'identifiant de session à partir du cookie
session.use_cookies = 1 signifie utiliser des cookies pour stocker l'identifiant de session
session.use_only_cookies = 1 signifie utiliser uniquement des cookies pour stocker l'identifiant de session, ce qui peut être évité Attaque de fixation de session
Dans le code
int_set("session.use_cookies", 1);
int_set("session.use_only_cookies", 1); p>
5) Utiliser l'URL pour transmettre les paramètres cachés
session_start();
$seid = md5(uniqid(rand()), TRUE)) ;
$_SESSION["seid"] = $seid;
Bien que l'attaquant puisse obtenir les données de session, il ne peut pas connaître la valeur de $seid. Il peut confirmer en vérifiant la valeur de seid si la page actuelle est appelée par le programme Web lui-même.
Ce qui précède est le contenu de la solution de vulnérabilité PHP (7) - Détournement de session Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !