Passer au contenu
Introduction aux attaques Cross Site Request Forgery

Introduction aux attaques Cross Site Request Forgery

12 juillet 2019 attaque  vulnérabilité 

Contrairement aux attaques XSS qui cherchent à dérober des informations personnelles, les attaques CSRF, pour Cross Site Request Forgery, cherchent à faire exécuter des actions à l'insu de l'utilisateur. Le terme CSRF pourrait être traduit par "Requêtes Inter-site".

Mais bon à quoi ça ressemble concrètement ?

L'attaquant va chercher à ce qu'un administrateur de votre site (une fois connecté à votre back office) lance la page souhaitée, par exemple https://www.votre-site.fr/admin/index.php?action=tout-supprimer.

Cet appel peut être masqué simplement à l'intérieur d'une page d'un site tiers déjà infecté :

<div style="display:none;">
    <img src="https://www.votre-site.fr/admin/index.php?action=tout-supprimer" />
</div>

Alors comment se protéger contre les CSRF ?

Il n'existe pas de technique parfaitement fiable pour vous protéger des CSRF mais on peut rendre les attaques plus complexes à faire. Une première option est de vérifier le referer c'est-à-dire vérifier que vos pages soient lancées uniquement depuis une provenance dont le nom de domaine est connu et maitrisé par vous. Une deuxième option est d'ajouter un système de jeton.

<?php
// On lance la session
session_start();

// On génère un numéro de jeton aléatoire
$jeton = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

// On enregistre le jeton en session
$_SESSION['jeton'] = $jeton;

// On affiche notre formulaire avec le jeton en champ caché
echo '<form>
        <input type="hidden" name="jeton" value="' . $jeton . '" />
        <input type="submit" value="Valider" />
      </form>';
?>

Ensuite une fois le formulaire posté, on compare le jeton envoyé et le jeton sauvegardé en session.

Si les deux jetons sont identiques, on peut effectuer l'action importante :

<?php
// On lance la session
session_start();

// On compare nos deux jetons
if (!empty($_SESSION['jeton']) AND !empty($_POST['jeton']) AND ($_SESSION['token'] == $_POST['token']))
{
	// Vérification terminée
    // On peut effectuer l'action importante
}
else
{
    echo "Erreur de vérification des jetons";
}
?>

Il existe ensuite bien d'autres techniques de protection qui peuvent être ajoutées :

  • Ajouter un captcha
  • Utiliser un système de saisie de numéro avec la souris comme sur les systèmes d'identification bancaire
  • Redemander la saisie du mot de passe
  • Un code par SMS
Note : 4.9 - 7 votes Evaluer cet article
4.9

Par Thibaut Pietri

Ingénieur informatique spécialisé réseau, basé à Toulouse, j'ai plus de 20 ans d'expérience en développement et sécurisation de sites Internet, Extranet & applications mobiles autour des technologies LAMP (Linux/Apache/MySQL/PHP) sur différents outils de gestion de contenu (Wordpress, Prestashop, Drupal, Isens Evolution...).

Derniers articles

Aucun commentaire, soyez le premier !

 
Retour en haut de la page