web-dev-qa-db-fra.com

CSRF est-il possible avec les méthodes PUT ou DELETE?

CSRF est-il possible avec les méthodes PUT ou DELETE? Ou est-ce que l'utilisation de PUT ou DELETE empêche CSRF?

50
4esn0k

Grande question!

Dans un monde parfait, je ne peux pas penser à un moyen d'effectuer une attaque CSRF.

  • Vous ne pouvez pas effectuer de demandes PUT ou DELETE à l'aide de formulaires HTML.
  • Les images, les balises de script, les liens CSS, etc. envoient tous des demandes GET au serveur.
  • XmlHttpRequest et les plugins de navigateur tels que Flash/Silverlight/Applets bloqueront les demandes interdomaines.

Donc, en général, il ne devrait pas être possible de lancer une attaque CSRF sur une ressource qui prend en charge les verbes PUT/DELETE.

Cela dit, le monde n'est pas parfait. Il peut y avoir plusieurs façons de rendre possible une telle attaque:

  1. Les cadres Web tels que Rails prennent en charge la "pseudo méthode". Si vous mettez un champ caché appelé _method, définissez sa valeur sur PUT ou DELETE, puis soumettez une requête GET ou POST, elle remplacera le verbe HTTP. Il s'agit d'un moyen de prendre en charge PUT ou DELETE à partir des formulaires du navigateur. Si vous utilisez un tel framework, vous devrez vous protéger du CSRF en utilisant des techniques standard

  2. Vous pouvez accidentellement configurer un en-tête de réponse laxiste pour CORS sur votre serveur. Cela permettrait à des sites Web arbitraires de faire des demandes PUT et DELETE.

  3. À un moment donné, HTML5 avait prévu d'inclure la prise en charge de PUT et DELETE dans les formulaires HTML. Mais plus tard, ils ont supprimé ce support. Il n'y a aucune garantie qu'il ne sera pas ajouté ultérieurement. Certains navigateurs peut prennent en charge ces verbes, et cela peut fonctionner contre vous.

  4. Il peut simplement y avoir un bug dans certains plugins de navigateur qui pourrait permettre à l'attaquant de faire des requêtes PUT/DELETE.

En bref, je recommanderais de protéger vos ressources même si elles ne prennent en charge que les méthodes PUT et DELETE.

56
Sripathi Krishnan

Non. S'appuyer sur un verbe HTTP n'est pas un moyen d'empêcher une attaque CSRF. Tout dépend de la façon dont votre site est créé. Vous pouvez utiliser les PUT comme POST et DELETE comme GET - cela n'a pas vraiment d'importance.

Pour empêcher CSRF, suivez certaines des étapes décrites ici :

Les sites Web proposent diverses contre-mesures CSRF:

  • L'exigence d'un jeton secret spécifique à l'utilisateur dans toutes les soumissions de formulaires et les URL d'effets secondaires empêche CSRF; le site de l'attaquant ne peut pas mettre le
    jeton de droit dans ses observations 1
  • Obliger le client à fournir des données d'authentification dans la même requête HTTP utilisée pour effectuer toute opération avec des implications de sécurité (transfert d'argent, etc.)
  • Limiter la durée de vie des cookies de session Vérification de l'en-tête HTTP Referer ou (et)
  • Vérification de l'en-tête HTTP Origin [16]
  • S'assurer qu'aucun fichier clientaccesspolicy.xml n'accorde un accès involontaire aux contrôles Silverlight [17]
  • S'assurer qu'aucun fichier crossdomain.xml n'accorde un accès involontaire aux films Flash [18]
  • Vérification que l'en-tête de la demande contient un X-Requested-With. Utilisé par Ruby on Rails (avant v2.0) et Django (avant v1.2.5). Cette protection a a été prouvé non sécurisé [19] sous une combinaison de plug-ins de navigateur et de redirections qui peuvent permettre à un attaquant de fournir des en-têtes HTTP personnalisés sur une demande à n'importe quel site Web, permettant ainsi une demande falsifiée.
11
David Hoerster

En théorie, cela ne devrait pas être possible car il n'y a aucun moyen d'initier une demande PUT ou DELETE interdomaine (sauf pour CORS, mais cela nécessite une demande de contrôle en amont et donc la coopération du site cible). Dans la pratique, je ne m'appuierais pas sur cela - de nombreux systèmes ont été mordus par ex. en supposant qu'une attaque de téléchargement de fichier CSRF n'était pas possible (elle ne devrait pas l'être, mais certains bogues du navigateur l'ont rendu possible).

7
Tgr

Oui, CSRF est possible avec les méthodes PUT et DELETE, mais uniquement avec CORS activé avec une politique non restrictive.

Je suis en désaccord avec réponse de Sripathi Krishnan :

XmlHttpRequest et les plugins de navigateur tels que Flash/Silverlight/Applets bloqueront les demandes interdomaines

Rien n'empêche le navigateur de faire une demande interdomaine. Identique Origine Politique ne pas empêche ne demande d'être faite - tout ce qu'elle fait est d'empêcher la demande d'être lu par le navigateur.

Si le serveur n'accepte pas CORS , cela provoquera une demande de contrôle en amont. Il s'agit du mécanisme qui empêchera l'utilisation d'un PUT ou DELETE, car il ne s'agit pas d'une simple demande (la méthode doit être HEAD, GET ou POST). En supposant bien sûr une politique CORS correctement verrouillée (ou aucune qui soit sécurisée par défaut).

6
SilverlightFox

CSRF est en effet possible avec PUT et DELETE selon la configuration de votre serveur.

La façon la plus simple de penser à CSRF est de penser à avoir deux onglets ouverts dans votre navigateur, l'un ouvert à votre application avec votre utilisateur authentifié et l'autre ouvert à un site Web malveillant.

Si le site Web malveillant fait une demande javascript à votre application, le navigateur enverra les cookies standard avec la demande, permettant ainsi au site Web malveillant de "forger" la demande en utilisant la session déjà authentifiée. Ce site Web peut effectuer tout type de demande qu'il souhaite, y compris GET, PUT, POST, DELETE, etc.

La façon standard de se défendre contre CSFR est d'envoyer quelque chose avec la demande que le site Web malveillant ne peut pas savoir. Cela peut être aussi simple que le contenu de l'un des cookies. Bien que la demande du site malveillant contienne les cookies, il ne peut pas accéder aux cookies car il est servi par un domaine différent et la sécurité du navigateur l'empêche d'accéder aux cookies d'un autre domaine.

Appelez le contenu du cookie un "jeton". Vous pouvez envoyer le jeton avec les demandes et, sur le serveur, assurez-vous que le "jeton" a été correctement fourni avant de poursuivre la demande.

La question suivante est de savoir comment envoyer cette valeur avec toutes les différentes demandes, avec DELETE spécifiquement difficile car il n'est pas conçu pour avoir n'importe quel type de charge utile. À mon avis, le moyen le plus propre est de spécifier un en-tête de demande avec le jeton. Quelque chose comme ce x-security-token = token. De cette façon, vous pouvez consulter les en-têtes des demandes entrantes et rejeter celles qui manquent le jeton.

Dans le passé, la sécurité ajax standard limitait ce qui pouvait être fait via ajax sur le serveur malveillant, cependant, de nos jours, la vulnérabilité dépend de la façon dont vous avez configuré votre serveur en ce qui concerne les configurations de contrôle des accès. Certaines personnes ouvrent leur serveur pour faciliter les appels interdomaines ou pour que les utilisateurs créent leurs propres clients RESTful ou similaires, mais cela permet également à un site malveillant d'en profiter plus facilement à moins que les méthodes de prévention CSRF comme celles ci-dessus ne soient mettre en place.

1
DavidA