« Faille CSRF » : différence entre les versions
Aucun résumé des modifications |
|||
(66 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 3 : | Ligne 3 : | ||
= Introduction = |
= Introduction = |
||
La faille CSRF ("'''Cross site request forgery'''") qui, si l’on essaie de donner une définition en français, signifie Falsification de requête inter-sites. |
|||
Elle cherche à faire exécuter des actions directement sur l’ordinateur de la victime à son insu. |
|||
Cette faille est compatible avec n'importe quel site, pour peu que vous y soyez connecté. Elle demande à celui qui l'exploite de connaître les liens utilisés par la victime. |
|||
= Session = |
= Session = |
||
* Stocke l’état d’un client sur un site web |
|||
Le mécanisme des sessions '''est à l'origine''' de la faille CSRF. |
|||
* Identification de la session avec des cookies |
|||
* Sessions sauvegardées côté serveur |
|||
Une session est un mécanisme technique permettant de sauvegarder temporairement sur le serveur des informations relatives à un internaute. A chaque ouverture de nouvelle session, l'internaute se voit attribué un identifiant de session. |
|||
* Un cookie est configuré pour être envoyé sur un ou plusieurs domaine |
|||
* Possibilité de générer un nouvel id pour chaque requête (exemple : Laravel) |
|||
Les sessions sont sauvegardées côté serveur et leurs identifications s'effectuent à l'aide des cookies. |
|||
* Possibilité de crypter le contenu des sessions sur le serveur de stockage (utile si on on utilise un autre serveur pour le stockage |
|||
En effet, si une victime (souvent un administrateur) a une '''session ouverte''' sur son site et que celui-ci est vulnérable alors il s'expose à des attaques. |
|||
= Faille CSRF = |
= Faille CSRF = |
||
Ligne 15 : | Ligne 24 : | ||
== Attaque == |
== Attaque == |
||
=== Exemple d'attaque === |
|||
La faille CSRF ("Cross site request forgery") qui, si l’on essaie de donner une définition en français, signifie Falsification de requête inter-sites. Elle cherche à faire exécuter des actions directement sur l’ordinateur de la victime à son insu. |
|||
Cette faille est compatible avec n'importe quel site, pour peu que vous y soyez connecté. |
|||
Elle demande à celui qui l'exploite de connaître les liens utilisés par la victime. |
|||
L'attaquant repère un '''site non protégé''' contre la faille CSRF : ''www.forum.com'' |
|||
Attaquer la victime en mettant la requête illégitime dans un mail : |
|||
Il sait aussi que l’administrateur utilise cette URL pour supprimer un utilisateur : |
|||
''www.forum.com/index.php?profile=toto&action=supprimer'' |
|||
L'attaquant utilise la faille CSRF qui consiste à rediriger l'administrateur vers cette page, et ainsi lui faire supprimer un utilisateur. |
|||
'''Pré-requis''' : l’administrateur doit être connecté sur le site vulnérable en même tant que l'attaque à lieu. |
|||
=== Différentes méthodes d'attaque === |
|||
Une victime consulte '''un mail malveillant''' qui le redirige vers une action non consentie du site vulnérable : |
|||
[[Fichier:Mail-16.png]] |
[[Fichier:Mail-16.png]] |
||
Attaquer la victime en mettant lançant la requête depuis un site malveillant : |
|||
Une victime visite '''un site web malveillant''' qui le redirige vers une action non consentie du site vulnérable : |
|||
[[Fichier:Site-7.png]] |
[[Fichier:Site-7.png]] |
||
== Optimisation == |
== Optimisation == |
||
Plusieurs optimisations et vérifications peuvent améliorer l’efficacité de l'attaque. |
|||
Prendre '''connaissance de la vulnérabilité''' du site attaqué : |
|||
* Vérifier l'absence de token dans les formulaires |
|||
* Connaître les routes sensibles du sites |
|||
Cacher les liens malveillant et '''éviter d'être repéré''' avant l'attaque : |
|||
* Utiliser des redirections |
|||
* Utiliser des appels AJAX |
|||
AJAX cache totalement l’action malveillante pour un utilisateur lambda. Le CORS du site victime doit autoriser les noms de domaines étrangers. |
|||
== Risque == |
== Risque == |
||
Ligne 33 : | Ligne 65 : | ||
Le risque est inhérent au site visité par la victime puisque le CSRF consiste à effectuer des opérations sur un site sans le consentement de l’utilisateur et à son insu. |
Le risque est inhérent au site visité par la victime puisque le CSRF consiste à effectuer des opérations sur un site sans le consentement de l’utilisateur et à son insu. |
||
Voici trois exemples d’opérations qui étaient possibles par un attaquant sur des sites ou produits connus et vulnérables : |
Voici trois '''exemples d’opérations''' qui étaient possibles par un attaquant sur des sites ou produits connus et vulnérables : |
||
* opérations à l’insu de l’utilisateur sur un site bancaire (par exemple, virement d’argent vers un autre compte) ; |
* opérations à l’insu de l’utilisateur sur un site bancaire (par exemple, virement d’argent vers un autre compte) ; |
||
Ligne 41 : | Ligne 73 : | ||
* changement de la configuration d’un webmail (notamment, l’ajout de filtres pour transmettre automatiquement les courriels reçus à une autre adresse). |
* changement de la configuration d’un webmail (notamment, l’ajout de filtres pour transmettre automatiquement les courriels reçus à une autre adresse). |
||
Le risque principal est donc l’usurpation d’identité et l’exécution d’actions malveillantes sur un site. |
Le risque principal est donc '''l’usurpation d’identité et l’exécution d’actions malveillantes''' sur un site. |
||
== |
== Exemples == |
||
Cette faille a touché plusieurs sites connus durant la première décennie des années 2000. |
|||
* The Netflix website in 2006 had numerous vulnerabilities to CSRF, which could have allowed an attacker to perform actions such as adding a DVD to the victim's rental queue, changing the shipping address on the account, or altering the victim's login credentials to fully compromise the account. |
|||
Aujourd'hui la faille est mieux protégée mais elle est malheureusement encore présente sur la toile. |
|||
* The online banking web application of ING Direct was vulnerable to a CSRF attack that allowed illicit money transfers. |
|||
* Popular video website YouTube was also vulnerable to CSRF in 2008 and this allowed any attacker to perform nearly all actions of any user. |
|||
Les 4 exemples réels ci-dessous montre les possibilités qu'offre cette faille : |
|||
* McAfee was also vulnerable to CSRF and it allowed attackers to change their company system. |
|||
[[Fichier:netflix.png]] '''Netflix en 2006''', la faille permettait : |
|||
* l'ajout d'un DVD à la file d'attente de location de la victime |
|||
* la modification de l'adresse de livraison sur le compte |
|||
* la modification des informations d'identification de la victime |
|||
[[Fichier:ing.png]] '''L'application Web de banque en ligne d'ING Direct''', la faille permettait : |
|||
* des transferts d'argent illicites |
|||
[[Fichier:youtube.png]] '''YouTube en 2008''', la faille permettait : |
|||
* de réaliser presque toutes les actions de tout utilisateur. |
|||
[[Fichier:mcafee.png]] '''McAfee''', la faille permettait : |
|||
* de modifier le système de leur entreprise. |
|||
== Protection == |
== Protection == |
||
Le CSRF est une attaque contre les visiteurs d’un site et non contre le site lui-même. |
Le CSRF est une attaque contre les visiteurs d’un site et non contre le site lui-même. Les moyens de protection pour les développeurs servent donc à protéger '''leurs utilisateurs'''. |
||
La façon la plus répandue étant l'utilisation d'un '''jeton''' (token) unique en session qui sera vérifié à chaque modification, ici un exemple en PHP : |
|||
<pre> |
|||
<?php |
|||
$token = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); |
|||
$_SESSION['token'] = $token; |
|||
?> |
|||
</pre> |
|||
Il suffit ensuite d'ajouter le '''token''' dans chaque requête envoyée au serveur. |
|||
Ici un formulaire HTML où l'on a ajouté le token qui doit être le même que celui en session : |
|||
<pre> |
|||
<form> |
|||
<!-- Pseudo de la personne à supprimer --> |
|||
<input type="text" name="pseudo" id="pseudo" /> |
|||
<input type="submit" value="valider" /> |
|||
<!-- Notre token de vérification, bien caché --> |
|||
<input type="hidden" name="token" value="<?php echo $token; ?>" /> |
|||
</form> |
|||
</pre> |
|||
Puis côté serveur, avant chaque modification, on vérifie que le token en session et celui du formulaire sont égaux : |
|||
<pre> |
|||
// On vérifie que les deux token correspondent |
|||
if ($_SESSION['token'] == $_POST['token']) { |
|||
// Vérification terminée |
|||
// On peut supprimer l'utilisateur |
|||
} |
|||
</pre> |
|||
On peut améliorer la protection par token avec l'ajout d'un '''délai d'expiration''' de celui-ci (10 min). |
|||
= Conclusion = |
|||
La faille CSRF est maintenant '''gérée''' par la plupart des frameworks d'applications web modernes (Laravel, Yii2 ...). |
|||
Les moyens de protection pour les développeurs servent donc à protéger leurs utilisateurs. |
|||
Elle reste quand même présente sur des sites développées sans framework et où le développeur n'a pas ajouté pas les protections nécessaires. |
|||
La façon la plus répandue étant l'utilisation d'un jeton unique qui sera vérifié à chaque modification. |
|||
=Sources= |
=Sources= |
Dernière version du 25 novembre 2018 à 19:19
Auteurs : Victor BASSET et Vincent PEILLEX
Introduction
La faille CSRF ("Cross site request forgery") qui, si l’on essaie de donner une définition en français, signifie Falsification de requête inter-sites.
Elle cherche à faire exécuter des actions directement sur l’ordinateur de la victime à son insu.
Cette faille est compatible avec n'importe quel site, pour peu que vous y soyez connecté. Elle demande à celui qui l'exploite de connaître les liens utilisés par la victime.
Session
Le mécanisme des sessions est à l'origine de la faille CSRF.
Une session est un mécanisme technique permettant de sauvegarder temporairement sur le serveur des informations relatives à un internaute. A chaque ouverture de nouvelle session, l'internaute se voit attribué un identifiant de session.
Les sessions sont sauvegardées côté serveur et leurs identifications s'effectuent à l'aide des cookies.
En effet, si une victime (souvent un administrateur) a une session ouverte sur son site et que celui-ci est vulnérable alors il s'expose à des attaques.
Faille CSRF
Attaque
Exemple d'attaque
L'attaquant repère un site non protégé contre la faille CSRF : www.forum.com
Il sait aussi que l’administrateur utilise cette URL pour supprimer un utilisateur : www.forum.com/index.php?profile=toto&action=supprimer
L'attaquant utilise la faille CSRF qui consiste à rediriger l'administrateur vers cette page, et ainsi lui faire supprimer un utilisateur.
Pré-requis : l’administrateur doit être connecté sur le site vulnérable en même tant que l'attaque à lieu.
Différentes méthodes d'attaque
Une victime consulte un mail malveillant qui le redirige vers une action non consentie du site vulnérable :
Une victime visite un site web malveillant qui le redirige vers une action non consentie du site vulnérable :
Optimisation
Plusieurs optimisations et vérifications peuvent améliorer l’efficacité de l'attaque.
Prendre connaissance de la vulnérabilité du site attaqué :
- Vérifier l'absence de token dans les formulaires
- Connaître les routes sensibles du sites
Cacher les liens malveillant et éviter d'être repéré avant l'attaque :
- Utiliser des redirections
- Utiliser des appels AJAX
AJAX cache totalement l’action malveillante pour un utilisateur lambda. Le CORS du site victime doit autoriser les noms de domaines étrangers.
Risque
Le risque est inhérent au site visité par la victime puisque le CSRF consiste à effectuer des opérations sur un site sans le consentement de l’utilisateur et à son insu.
Voici trois exemples d’opérations qui étaient possibles par un attaquant sur des sites ou produits connus et vulnérables :
- opérations à l’insu de l’utilisateur sur un site bancaire (par exemple, virement d’argent vers un autre compte) ;
- changement de la configuration du routeur WiFi de la victime (via l’interface d’administration web accessible en réseau local) ;
- changement de la configuration d’un webmail (notamment, l’ajout de filtres pour transmettre automatiquement les courriels reçus à une autre adresse).
Le risque principal est donc l’usurpation d’identité et l’exécution d’actions malveillantes sur un site.
Exemples
Cette faille a touché plusieurs sites connus durant la première décennie des années 2000. Aujourd'hui la faille est mieux protégée mais elle est malheureusement encore présente sur la toile.
Les 4 exemples réels ci-dessous montre les possibilités qu'offre cette faille :
Netflix en 2006, la faille permettait :
- l'ajout d'un DVD à la file d'attente de location de la victime
- la modification de l'adresse de livraison sur le compte
- la modification des informations d'identification de la victime
L'application Web de banque en ligne d'ING Direct, la faille permettait :
- des transferts d'argent illicites
YouTube en 2008, la faille permettait :
- de réaliser presque toutes les actions de tout utilisateur.
McAfee, la faille permettait :
- de modifier le système de leur entreprise.
Protection
Le CSRF est une attaque contre les visiteurs d’un site et non contre le site lui-même. Les moyens de protection pour les développeurs servent donc à protéger leurs utilisateurs.
La façon la plus répandue étant l'utilisation d'un jeton (token) unique en session qui sera vérifié à chaque modification, ici un exemple en PHP :
<?php $token = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); $_SESSION['token'] = $token; ?>
Il suffit ensuite d'ajouter le token dans chaque requête envoyée au serveur.
Ici un formulaire HTML où l'on a ajouté le token qui doit être le même que celui en session :
<form> <!-- Pseudo de la personne à supprimer --> <input type="text" name="pseudo" id="pseudo" /> <input type="submit" value="valider" /> <!-- Notre token de vérification, bien caché --> <input type="hidden" name="token" value="<?php echo $token; ?>" /> </form>
Puis côté serveur, avant chaque modification, on vérifie que le token en session et celui du formulaire sont égaux :
// On vérifie que les deux token correspondent if ($_SESSION['token'] == $_POST['token']) { // Vérification terminée // On peut supprimer l'utilisateur }
On peut améliorer la protection par token avec l'ajout d'un délai d'expiration de celui-ci (10 min).
Conclusion
La faille CSRF est maintenant gérée par la plupart des frameworks d'applications web modernes (Laravel, Yii2 ...).
Elle reste quand même présente sur des sites développées sans framework et où le développeur n'a pas ajouté pas les protections nécessaires.
Sources
https://www.cert.ssi.gouv.fr/information/CERTA-2008-INF-003/
https://www.leblogduhacker.fr/sandbox/csrf.php?#.W-gXIXVKgqo
https://en.wikipedia.org/wiki/Cross-site_request_forgery#Example_and_characteristics