web-dev-qa-db-fra.com

Les services Web JSON sont-ils vulnérables aux attaques CSRF?

Je crée un service Web qui utilise exclusivement JSON pour son contenu de demande et de réponse (c'est-à-dire, aucune charge utile codée sous forme).

Un service Web est-il vulnérable aux attaques CSRF si les conditions suivantes sont remplies?

  1. Toute demande POST sans objet JSON de niveau supérieur, par exemple {"foo":"bar"}, sera rejeté avec un 400. Par exemple, une demande POST avec le contenu 42 serait donc rejeté.

  2. Toute demande POST avec un type de contenu autre que application/json sera rejeté avec un 400. Par exemple, une demande POST avec le type de contenu application/x-www-form-urlencoded serait donc rejeté.

  3. Toutes les demandes GET seront Safe , et donc ne modifieront aucune donnée côté serveur.

  4. Les clients sont authentifiés via un cookie de session, que le service Web leur fournit après avoir fourni une paire nom d'utilisateur/mot de passe correcte via un POST avec des données JSON, par exemple {"username":"[email protected]", "password":"my password"}.

Question accessoire: les demandes PUT et DELETE sont-elles jamais vulnérables à CSRF? Je pose la question car il semble que la plupart (tous?) Les navigateurs interdisent ces méthodes dans les formulaires HTML.

EDIT: Ajout de l'élément n ° 4.

EDIT: Beaucoup de bons commentaires et réponses jusqu'à présent, mais personne n'a proposé d'attaque CSRF spécifique à laquelle ce service Web est vulnérable.

66
djsmith

La falsification de demandes CSRF arbitraires avec des types de supports arbitraires n'est en fait possible qu'avec XHR, car un la méthode du formulaire est limitée à GET et POST et un formulaire's POST message le corps est également limité aux trois formats application/x-www-form-urlencoded, multipart/form-data, et text/plain . Cependant, avec les données du formulaire codant text/plain il est toujours possible de falsifier des requêtes contenant des données JSON valides .

La seule menace provient donc des attaques CSRF basées sur XHR. Et ceux-ci ne réussiront que s'ils sont

Si vous pouvez éliminer les deux, votre service Web n'est pas vulnérable à CSRF. Du moins pas celles effectuées via un navigateur Web.

64
Gumbo

Oui c'est possible. Vous pouvez configurer un serveur attaquant qui renverra une redirection 307 vers le serveur cible vers la machine victime. Vous devez utiliser flash pour envoyer le POST au lieu d'utiliser le formulaire.

Référence: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Il fonctionne également sur Chrome.

2
Timothy Leung

Il est possible de faire CSRF sur des services reposants basés sur JSON en utilisant Ajax. J'ai testé cela sur une application (en utilisant les deux Chrome et Firefox). Vous devez changer le contentType en text/plain et le dataType en JSON afin d'éviter une demande de contrôle en amont. Ensuite, vous pouvez envoyer la demande, mais pour envoyer les données de session, vous devez définir l'indicateur withCredentials dans votre demande ajax. J'en discuterai plus en détail ici (les références sont incluses):

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html

1
Filip Waeytens