Exploiter CSRF sur demande DELETE

Aug 27 2020

Je testais un site et suis tombé sur une demande avec DELETEet j'ai trouvé X-CSRF: le paramètre a été envoyé pour s'assurer que le document peut être supprimé par une personne autorisée, mais lorsque j'ai supprimé le X-CSRFjeton entier et envoyé un paramètre vide, il a été accepté et le document a été supprimé .

Y a-t-il des possibilités pour un exploit?

Merci d'avance.

Réponses

1 ConorMancone Aug 27 2020 at 02:23

Le vecteur CSRF le plus simple ressemblerait à ceci:

<img src="https://[email protected]&amount=100000">

Ensuite, il vous suffit de mettre ce morceau de HTML devant la victime. Cependant, cela générera une requête GET. Si le point de terminaison utilise POST, vous pouvez essayer quelque chose comme (exemple uniquement - non testé):

<form action="https://[email protected]&amount=10000" method="POST" onload="this.submit()">
</form>

Malheureusement, cela ne vous permettra d'obtenir que GET / POST. Pour soumettre une demande DELETE, vous avez besoin de javascript réel . En général, vous pouvez simplement héberger du code comme celui-ci sur n'importe quel site Web n'importe où, vous n'avez donc pas besoin d'une vulnérabilité XSS. CORS empêcherait le javascript de votre page de lire la réponse, mais tant que la demande est envoyée, cela n'a pas d'importance. Malheureusement, les choses se compliquent pour une requête DELETE car il s'agit d'une requête non standard et déclenche un comportement CORS supplémentaire.

Si vous essayez d'envoyer une requête DELETE inter-domaines via Javascript à partir d'une origine inter-domaines, le navigateur enverra d' abord une requête OPTIONS pour demander au serveur si une telle chose est autorisée. Par conséquent, tant que le serveur de destination vérifie correctement le verbe HTTP, il n'acceptera jamais votre demande. Le serveur répondra à la demande OPTION, il ne mettra pas en liste blanche le domaine sur lequel votre Javascript est hébergé, et une demande DELETE ne sera jamais envoyée. Par conséquent, un jeton CSRF n'est pas strictement requis dans cette circonstance. Cependant, certaines choses peuvent changer cela:

  1. Si le serveur a mal configuré CORS qui répond au navigateur et autorise tous les domaines de la mauvaise manière, votre demande DELETE se déclenchera de toute façon
  2. Si votre javascript s'exécute sur le domaine réel, alors CORS ne se produira pas (mais ce serait une vulnérabilité XSS, qui bat de toute façon CSRF)

En bref, cela ne serait vulnérable qu'à la lumière de mauvaises configurations supplémentaires. Ce n'est toujours pas une bonne idée, car quelqu'un sur toute la ligne peut décider de convertir toutes les requêtes DELETE en requêtes POST, et oublier d'ajouter le contrôle CSRF, mais il est probablement sûr tel quel.