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.1Host:localhost:9003User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Content-Type:application/x-www-form-urlencodedContent-Length:51Origin:http://localhost:9003Connection:closeReferer:http://localhost:9003/xss4/user_email=<script>alert(1)</script>&submit=Envoyer
HTTP/1.1 200 OKServer: Apache/2.4.53 (Debian)X-Powered-By: PHP/8.0.18Content-Length: 2094Connection: closeContent-Type: text/html; charset=UTF-8<divclass="row"> <pstyle="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) :
<?phpif (isset ($_POST['submit'])&&isset ($_POST['user_email'])) { $email = $_POST['user_email']; }functionxss_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 echoxss_check_1($email); ?> is not registered.</p></div>