Attaques CSRF

Voir la vidéo
Description Sommaire

Les failles CSRF, ou Cross-Site Request Forgery, permettent à un attaquant de faire exécuter à vos utilisateurs authentifié des actions contre leur gré en masquant un appel à votre site dans un formulaire ou une iframe.

Le principe

L'attaquant va chercher à diriger un utilisateur authentifié sur votre site vers une action particulière a son insu. Par exemple, il peut créer un formulaire dont l'action pointe vers votre domaine et inciter l'utilisateur à cliquer sur le bouton.

<form action="https://grafikart.fr/account/delete" method="post">
    <input type="hidden" name="confirm" value="yes">
    <button>Suivre mon colis</button>
</form>

Si un utilisateur authentifié clique sur le bouton cela enverra une requête vers mon site qui entrainera la suppression de son compte.

Se protéger

Pour se protéger contre ce type de faille de sécurité il y a 2 approches possibles (qui peuvent être cumulées) :

  • Limiter l'envoi de Cookies dans le cadre d'une navigation intersites
  • Mettre en place des jetons pour valider l'origine des formulaires

L'attribut SameSite pour les cookies

Lorsque l'on crée des cookies il est possible de rajouter un attribut SameSite qui permet de limiter l'envoi de cookies dans le cadre d'une navigation intersite (lorsque l'on passe d'un nom de domaine principal vers un autre)

  • None, les cookies sont envoyés systématiquement.
  • Lax, les cookies ne sont pas envoyées dans une iframe ou lors d'une requête POST entre 2 sites différents.
  • Strict, les cookies ne sont pas envoyées lors d'unenavigation intersites (même en GET, si on clique sur un lien par exemple).

Pour bloquer les attaques CSRF il faut donc penser à spécifier la valeur Lax ou Strict pour cet attribut. On notera qu'en l'absence d'attribut SameSite la plupart des navigateurs adopte un comportement Lax par défaut (avec parfois quelques subtilités).

Dans le cas de PHP vous pouvez suivre ces recommandations pour votre configuration de production pour protéger les Cookies utilisés par le système de session.

Les jetons CSRF

Une seconde sécurité que l'on peut mettre en place est l'utilisation de jetons CSRF qui permet de valider l'origine lors de l'envoi d'un formulaire. Pour cela on va générer une clef aléatoire que l'on va sauvegarder en session.

request.session.set('csrf', randomKey())

On va ensuite injecter ce jeton dans notre formulaire au travers d'un champs caché.

<input type="hidden" name="csrf" value="{{ app.session.get('csrf') }}">

Lorsque l'on reçois le formulaire on pourra vérifier que le jeton envoyé correspond bien à celui inscrit dans le formulaire.

if (request.session.get('csrf') !== request.body.get('csrf')) {
    throw new Error('Token CSRF invalide')
}

Ainsi, si un attaquant souhaite crée un faux formulaire, il ne sera pas en mesure de falsifier le jeton CSRF. Cela vous protège dans le cas où les cookies seraient mal configurées ou dans le cas d'une attaque faite sur un sous domaine.

On notera que la plupart des frameworks backend intègrent un système de protection CSRF par défaut :

Publié
Technologies utilisées
Auteur :
Grafikart
Partager