← RETOUR_DEMO_CSRF
SESSION_TYPE: AUTHORIZED_VIEWER
KNOWLEDGE_BASE // PROTOCOL_CSRF
NET_WATCH // 77-B
01 // GENÈSE
02 // MÉCANIQUE_HTTP
03 // EXPLOITATION
04 // PROTECTION_STP
05 // SAMESITE_DEEP_DIVE
06 // ARCHI_MODERNE

01 // GENÈSE

Le Cross-Site Request Forgery (CSRF) n'est pas une simple erreur de code, mais une exploitation directe de la conception fondamentale des navigateurs web. Il cible l'intégrité des actions d'un utilisateur authentifié.

Le postulat de confiance

Les navigateurs ont été conçus pour faciliter le partage de ressources. Pour maintenir une session utilisateur, ils injectent automatiquement les cookies d'un domaine dans chaque requête sortante vers ce même domaine. L'application cible considère alors que toute requête reçue avec un cookie valide est légitime.

DÉFINITION : Le CSRF consiste à forcer le navigateur d'une victime, alors qu'elle est connectée à une plateforme fiable, à envoyer une requête HTTP malveillante vers cette plateforme. L'attaquant n'a pas besoin de connaître les identifiants de la victime : il utilise sa session active.

Impact de la Brèche

Le CSRF permet à l'attaquant de "devenir" l'utilisateur pour une fraction de seconde, lui permettant de :

  • Changer l'adresse email de récupération (Bypass de compte).
  • Déclencher des virements bancaires non autorisés.
  • Modifier les permissions administratives d'un système.

02 // MÉCANIQUE_HTTP

Pour comprendre le CSRF, il faut analyser comment le navigateur gère l'état (State) dans un protocole HTTP nativement "stateless".

La faille structurelle

Par design, un site tiers (ex: malicious-site.com) peut inclure des instructions HTTP pointant vers un autre site (ex: bank.com). Le navigateur traitera la requête et y joindra les cookies de session de bank.com sans se soucier du fait que l'ordre vient de malicious-site.com.

// Requête HTTP standard générée par le navigateur lors d'une attaque :
POST /update_profile HTTP/1.1
Host: victim-app.com
Cookie: session_id=XYZ_SECRET_TOKEN (Injecté automatiquement)
Referer: https://attacker-web-console.net/ (L'origine malveillante)

Content: email=attacker@evil.com

SOP vs CSRF : La Confusion Classique

La Same-Origin Policy (SOP) protège la lecture des données, pas l'écriture. Elle empêche malicous.com de lire le contenu de votre compte bancaire, mais elle n'empêche pas malicious.com d'envoyer un ordre de virement. C'est pourquoi le CSRF est dit "aveugle" : l'attaquant lance la flèche, mais ne peut pas voir si elle a touché la cible via la réponse HTTP.

03 // EXPLOITATION

L'exploitation se fragmente en deux vecteurs principaux selon la méthode HTTP ciblée par l'application vulnérable.

Vecteur POST (Form-Ghosting)

C'est la méthode la plus classique. L'attaquant héberge un formulaire dont les champs correspondent à l'action visée, et utilise du JavaScript pour le soumettre automatiquement dès le chargement de la page.

<body onload="document.forms[0].submit()">
  <form action="https://victim.com/api/settings" method="POST">
    <input type="hidden" name="email" value="hacker@arasaka.corp" />
  </form>
</body>

Vecteur GET (Asset Injection)

Si l'application utilise des paramètres GET pour des actions d'écriture (ex: /delete_user?id=123), l'attaque devient triviale. Une simple balise <img> ou <iframe> suffit à déclencher l'action.

<img src="https://app.com/transfer?to=99&amount=5000" style="display:none">

04 // PROTECTION_STP

Le Synchronizer Token Pattern (STP) est la défense standard recommandée par l'OWASP. Elle consiste à insérer une preuve d'intention dans chaque requête sensible.

Comment le STP neutralise l'attaque

  1. Le serveur génère un **Token** cryptographique unique et imprévisible lors de la mise en place de la session.
  2. Toute action critique (POST/PUT/DELETE) doit inclure ce Token comme paramètre.
  3. Le serveur compare le Token reçu avec celui stocké en session. S'ils ne correspondent pas, la requête est invalidée.
INFRAILLIBILITÉ : L'attaquant peut toujours forcer le navigateur à envoyer la requête, mais comme il ne peut pas lire le contenu de l'application cible (grâce à la SOP), il n'a aucun moyen de connaître la valeur du Token actuel. La requête forgée est donc inévitablement rejetée.

05 // SAMESITE_LEVELS

L'attribut SameSite est une directive moderne permettant au serveur de donner des instructions précises au navigateur sur l'envoi des cookies en contexte cross-site.

Les trois modes d'opération

  • LAX (Standard par défaut) : Bloque les cookies pour les requêtes POST automatiques initiées par un tiers. Cependant, les cookies sont envoyés si l'utilisateur navigue vers le site via un lien GET direct.
  • STRICT (Isolation complète) : Le cookie n'est envoyé que si la requête provient strictement de l'origine qui l'a émis. Aucune lien externe ne transmettra la session.
  • NONE (Héritage) : Le cookie est envoyé systématiquement. Nécessite le flag Secure. Rend l'application vulnérable si le STP n'est pas actif.

L'exception Lax + POST

Certains navigateurs autorisent l'envoi de cookies Lax pour des requêtes POST effectuées immédiatement après la création du cookie (fenêtre de 2 minutes). Il ne faut donc jamais se reposer uniquement sur SameSite.

06 // ARCHI_MODERNE

Avec les API REST, les SPA et les en-têtes personnalisés, la surface d'attaque et les défenses ont évolué.

Validation des En-têtes (Custom Headers)

Les requêtes AJAX/Fetch permettent d'ajouter des en-têtes comme X-CSRF-Token. Le navigateur impose un CORS Preflight (OPTIONS) avant d'autoriser un tel en-tête vers un autre domaine. L'attaquant ne peut pas contourner cette phase sans configuration CORS permissive sur le serveur.

Double Submit Cookie

Une méthode où le secret est stocké à la fois dans un cookie et dans un paramètre POST. Le serveur compare les deux valeurs. C'est efficace mais attention : si un attaquant peut écrire des cookies sur un sous-domaine (via XSS), il peut contourner cette protection.

CONCLUSION : La meilleure défense est la **Défense en Profondeur** : Utilisez des Cookies SameSite=Lax + Synchronizer Token Pattern + des En-têtes personnalisés pour vos API.