Aller au contenu
M08 · A. Introduire la sécurité informatique

Les attaques sur les sessions et les cookies

Comment un site reconnaît un utilisateur connecté, puis les attaques qui visent ce mécanisme - empoisonnement de cookie (cookie poisoning), vol de session (session hijacking), fixation de session - et les parades - données en session côté serveur, identifiant régénéré, cookies HttpOnly, Secure et SameSite, HTTPS, expiration.

1Situer

Après la connexion, ce n'est plus le mot de passe qui prouve votre identité : c'est un petit identifiant rangé dans un cookie. Celui qui le possède EST vous pour le site. Les attaquants ne cherchent donc pas toujours à deviner un mot de passe : il leur suffit souvent de voler, de fabriquer ou d'imposer ce jeton.

2Comprendre

Voler un cookie de session, et s'en protéger
Aminanavigateur Serveursession de Amina PHPSESSID=k3j9x… Voisinmême Wi-Fi « je suis Amina » HTTPS + SecureHttpOnlySameSite=Laxregenerate_idexpiration

Après la connexion, le serveur donne au navigateur un cookie PHPSESSID : c'est le badge de la session.

1 / 4

Comment le site se souvient de vous

Rappel du module 07 : après la connexion, PHP range les informations dans une session sur le serveur, et le navigateur reçoit un cookie PHPSESSID qui contient seulement un identifiant aléatoire. À chaque requête, ce cookie est renvoyé et désigne la bonne session.

Trois attaques en découlent : fabriquer une fausse information dans un cookie, voler le jeton, ou imposer un jeton connu.

Le vol de session (session hijacking)

Les moyens les plus courants :

  • un XSS qui lit document.cookie et l’envoie au pirate (leçon A.4) ;
  • l’écoute d’un réseau non chiffré (Wi-Fi public d’un café, site en HTTP) ;
  • un identifiant qui fuit dans une URL (page.php?PHPSESSID=...), donc dans l’historique et les journaux ;
  • un logiciel espion sur le poste de la victime.

Parades : cookie HttpOnly (illisible par JavaScript), Secure et site entièrement en HTTPS, sessions qui expirent après inactivité, et déconnexion réelle (session_destroy()).

La fixation de session

La parade tient en une ligne, juste après la vérification du mot de passe :

session_regenerate_id(true);   // nouvel identifiant, l'ancien est supprimé
OptionEffetProtège contre
HttpOnlyJavaScript ne peut pas lire le cookievol par XSS
Secureenvoyé uniquement en HTTPSécoute du réseau
SameSite=Laxpas envoyé par les requêtes venant d’autres sites (sauf un simple lien)CSRF
durée courte + expiration côté serveurun jeton volé ne sert pas longtempsvol, poste partagé
Exemple simple

Le bracelet du festival

À l'entrée du festival, on montre son billet une fois et on reçoit un bracelet. Ensuite, c'est le bracelet qui ouvre les portes. Si quelqu'un vole le bracelet, ou en fabrique un faux « VIP » au feutre, les vigiles le laisseront passer, à moins de vérifier le bracelet sur leur liste.

Exemple simple

La clé prêtée

Un inconnu vous donne une clé de casier « déjà ouverte pour vous ». Vous y rangez vos affaires... mais il a gardé un double. C'est la fixation de session : l'attaquant impose un identifiant qu'il connaît.

3Manipuler

L'espace administrateur fait confiance à un cookie role que le visiteur peut modifier. Un client connecté (amina.benali@mail.ma / Atlas2025) se donne le rôle admin avec l'outil de modification de cookie. Corrigez le site, puis renforcez la session. Compte admin : admin@soukatlas.ma / Souk2025.
Pas à pas dans le lab ↗ Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).

La page s'affichera ici.

Le navigateur demandera /connexion.php au serveur, qui exécutera le PHP et renverra du HTML.

Entre le navigateur et le serveur aucun échange pour l'instant

Consignes 0 / 4

  1. Un client qui se donne le cookie role=admin reçoit « Accès refusé » (403)
  2. La vraie administratrice entre toujours : « Espace administrateur », « Bienvenue Leila »
  3. La connexion change l'identifiant de session (nouveau Set-Cookie PHPSESSID)
  4. Le cookie de session est HttpOnly

4Pratiquer

Exercice 1 · Les bons réglages

Écrivez le réglage du cookie de session pour un site en HTTPS : illisible par JavaScript, envoyé uniquement en HTTPS, pas envoyé par les requêtes venant d'autres sites (sauf liens simples), valable jusqu'à la fermeture du navigateur.

Voir le corrigé
<?php
session_set_cookie_params([
    'lifetime' => 0,          // jusqu'à la fermeture du navigateur
    'path'     => '/',
    'secure'   => true,       // uniquement en HTTPS
    'httponly' => true,       // invisible pour document.cookie
    'samesite' => 'Lax',
]);
session_start();

Exercice 2 · Déconnexion après inactivité

Déconnectez automatiquement un utilisateur inactif depuis plus de 15 minutes.

Voir le corrigé
<?php
session_start();
$limite = 15 * 60;
if (isset($_SESSION['derniere_action']) && time() - $_SESSION['derniere_action'] > $limite) {
    $_SESSION = [];
    session_destroy();
    header('Location: connexion.php?expire=1');
    exit;
}
$_SESSION['derniere_action'] = time();

Exercice 3 · Le cookie signé

On veut garder la langue préférée dans un cookie, mais être sûr qu'il n'a pas été modifié. Proposez une méthode avec hash_hmac.

Voir le corrigé
<?php
const SECRET = 'une-longue-cle-aleatoire-gardee-sur-le-serveur';
function cookieSigne(string $nom, string $valeur): void
{
    $sig = hash_hmac('sha256', $valeur, SECRET);
    setcookie($nom, "$valeur.$sig", ['path' => '/', 'httponly' => true, 'samesite' => 'Lax']);
}
function lireCookieSigne(string $nom): ?string
{
    [$valeur, $sig] = explode('.', $_COOKIE[$nom] ?? '.', 2) + [1 => ''];
    return hash_equals(hash_hmac('sha256', $valeur, SECRET), $sig) ? $valeur : null;
}

5Vérifier

1. Qu'est-ce que le cookie poisoning ?
2. Pourquoi appeler session_regenerate_id(true) après la connexion ?
3. Comment un attaquant peut-il voler un identifiant de session ?