web-dev-qa-db-fra.com

CSRF avec JSON POST

Je joue avec une application de test qui accepte les requêtes JSON et la réponse est également JSON. J'essaie de faire un CSRF pour une transaction qui accepte uniquement les données JSON avec POST dans la demande. L'application génère une erreur si l'URL est demandée à l'aide de la méthode get (par exemple dans <script src=).

Aussi, pour que l'attaque soit significative, c'est-à-dire que la transaction passe, je dois envoyer les données dans la demande. Si je crée ma propre page et envoie les demandes JSON, les cookies ne voyagent pas et donc le serveur renvoie un message d'erreur non authentifié.

Il n'y a pas de jetons aléatoires dans la demande d'origine du serveur.

Je me demandais s'il y avait un moyen de réussir une attaque CSRF dans ce scénario.

32
Sachin Kumar

Vous devez au moins vérifier Content-Type: application/json sur demande.

Il n'est pas possible d'obtenir un message POSTé <form> pour soumettre une demande avec Content-Type: application/json. Mais vous pouvez soumettre un formulaire avec une structure JSON valide dans le corps en tant que enctype="text/plain".

Il n'est pas possible de faire une origine croisée ( [[# #]] cors [~ # ~] ) XMLHttpRequest POST with Content-Type: application/json par rapport à un serveur non compatible avec l'origine, car cela entraînerait une demande d'OPTIONS HTTP "de pré-envol" pour l'approuver en premier. Mais vous pouvez envoyer un XMLHttpRequest cross-Origin POST withCredentials s'il est text/plain.

Donc, même avec application/json en vérifiant, vous pouvez vous rapprocher assez de XSRF, sinon complètement là. Et les comportements que vous comptez pour sécuriser sont quelque peu obscurs et toujours au stade de la version préliminaire; ce ne sont pas des garanties absolues pour l'avenir du Web.

Ceux-ci pourraient se casser, par exemple si un nouveau JSON enctype était ajouté aux formulaires dans une future version HTML. (WHATWG a ajouté le text/plain enctype en HTML5 et à l'origine essayé également d'ajouter text/xml, il n'est donc pas exclu que cela se produise.) Vous augmentez le risque de compromis à cause de bogues de navigateur et de plugins plus petits et plus subtils dans la mise en œuvre de CORS.

Donc, même si vous pouvez probablement vous en tirer pour l'instant, je ne recommanderais absolument pas d'aller de l'avant sans un système de jetons anti-XSRF approprié.

37
bobince

Ceci est exploitable en utilisant Flash, selon https://code.google.com/p/browsersec/wiki/Part2#Same-Origin_policy_for_Flash

La possibilité de faire des requêtes HTTP GET inter-domaines contenant des cookies et des requêtes POST via la pile du navigateur, avec moins de contraintes que ce qui est généralement observé ailleurs dans les navigateurs. Ceci est réalisé via l'API URLRequest. La fonctionnalité, plus particulièrement, inclut la possibilité de spécifier des valeurs de type de contenu arbitraires et d'envoyer des charges utiles binaires.

Je ne l'ai pas testé moi-même mais cela semble plausible.

Mise à jour: il semble que les dernières versions de Flash n'autorisent plus les demandes interdomaines par défaut, ce qui rend cela inexploitable.

Mise à jour # 2: cependant, il existe une vulnérabilité de longue date dans la gestion par flash des redirections 307, ce qui signifie que cela est toujours exploitable

7
albinowax