Bonjour à tous.
Après une petite discutions avec un collègue à propos de la CSRF, une question nous reste un peu sans réponse:
Donc, pour résumer, si j'ai bien compris, la CSRF est une faille qui permet à l'attaquant de faire valider un script/formulaire par sa victime à son insu.
Par exemple, imaginons un panneau d'administration de news, où une action est prévue pour supprimer les news:
http://monsite.com/admin/news/delete/[ID]
l'attaquant, qui à connaissance de ce lien mais n'y a pas accès, aura pour but (via une XSS sur un site lambda, un lien par mail ou autres encore) de vous faire exécuter ce script. par exemple, imaginons que ce bout de code soit entré (dans un chat avec des XSS permanente pourquoi pas) dans un site que vous visitez souvent:
et donc, si vous allez visitez ce site, vous supprimerez la news n°151 sur votre propre site à votre insu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part document.location = "http://monsite.com/admin/news/delete/151";
Du coup, les préconisations de protection de ces failles sont plutôt simple: générer un token sur la page du formulaire/panel d'admin des news:
dont l’existence sera vérifié avant l’exécution du script de suppression de la news, si cela n'est pas le bon, c'est que l'appel au script de suppression s'est fait sans passer par le panneau d'admin, et donc il y a un problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <?php $token = sha1(uniqid()); $_SESSION["csrf_".$token] = time()+300; ?> <input type="hidden" name="token" value="<?php echo $token;?>" />
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if(isset($_SESSION["csrf_".$_POST['token'])) && $_SESSION["csrf_".$_POST['token']<time()){ delete_news(); }
Jusque là j'ai bon ?
Maintenant la question c'est: qu'en ai-t-il si l'attaquant peut, toujours via une XSS par exemple, nous faire attirer sur la page qui génère se token avant de nous rediriger vers le script de suppression ?
Le token existera bien, donc la news sera bel et bien supprimer a notre insu, non ?
je pense notamment, dans le cas d'une xss, à quelque chose du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 window.open("http://monsite.com/admin/news"); setTimeout(function(){ window.open("http://monsite.com/admin/news/delete/151"); }, 500)
Bref, du coup, je ne vois pas trop l’intérêt de ce token comme protection des CSRF :/
Une petite explication ? je m'y prends mal ? ^^
Merci beaucoup,
Un dev concerné par la sécu de ses appli![]()
Partager