Qu'est-ce qu'une faille Cross-Site Request Forgery ?


Ce type d'attaque consiste simplement à faire exécuter à une victime une requête HTTP à son insu. Le but est de faire aller notre victime sur une page pour qu'il exécute les actions de la page, avec ses privilèges (généralement plus élevés que les nôtres).

Dans le monde réel, une attaque CSRF serait quelqu’un de malintentionné qui ajoute un article dans votre caddie lorsque vous faites vos courses en supermarché. L’hôtesse de caisse scanne le produit sans savoir qu’il ne vous appartient pas. Si l’attaque n’est pas détectée, vous allez payer l’article en question.

Exemple :
Imaginons que nous sommes sur un blog et que nous souhaitons supprimer un article. Le problème c’est que nous ne sommes pas administrateur de ce blog, cela signifie que nous n’avons pas les droits nécessaires à la suppression de ce fameux article.
En revanche nous connaissons l’URL utilisée par l’administration pour faire une suppression d’article : www.monsite.com/article.php?id=154&action=delete

Bien entendu nous ne pouvons pas saisir directement cette URL car le système vérifie les droits avant d’exécuter toutes actions. L’idée est de trouver un moyen de se rendre sur cette URL en tant qu’administrateur. Pour cela deux possibilités s’offrent à nous : Utiliser une faille XSS pour subtiliser les cookies de l'administrateur et se connecter ou utiliser un CSRF pour le rediriger vers cette page, et ainsi lui faire supprimer l’article sans qu’il ne le sache.

Pour faire exécuter cette requête HTTP par l’administrateur du blog on peut, par exemple, lui envoyer un lien vers un site frauduleux qui contiendra du code caché. On peut imaginer que sur cette page il y ait un image et que la source de cette dernière soit le lien de suppression de l’article :
<img src=“www.monsite.com/article.php?id=154&action=delete” height=“0” width=“0”>

A l’ouverture de la page le code sera exécuté.


Comment se protéger contre les failles Cross-Site Request Forgery ?


Pour se protéger de cette attaque, il faut utiliser des jetons qui seront envoyés en plus des autres paramètres. Ces jetons à usage unique permettent de vérifier les actions et rendent impossible le fait de prédire une URL. Par exemple, ici il aurait fallu rajouter un paramètre à l’URL : www.monsite.com/article.php?id=154&action=delete&token=34zm17o1aphj64