xss8

Exploitation

L'auteur indique utiliser maintenant la fonction htmlentities() afin d'assainir l'affichage du mot clé :

Suivant la version de PHP ainsi que la façon dont est développée l'application, certains contournement peuvent être possibles. L'utilisation du caractère ', dans le cas où le code est construit également avec ce caractère n'est possible que pour les versions de PHP < 8.1.0, ce qui est le cas ici :

HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2150
Connection: close
Content-Type: text/html; charset=UTF-8

Malheureusement, la construction du code doit utiliser le caractère ", car l'injection ne fonctionne pas :

L'autre contournement est possible seulement si la construction du code n'utilise aucun des caractères " et ', par exemple :

<input type=text class=form-control id=search name=search value=<?php if (isset ($keyword) && !empty ($keyword)){ echo xss_check($keyword); }?> placeholder="keyword" required>

Mais ce n'est pas le cas ici. L'application semble donc bien protéger dans ce dernier challenge.

Analyse du code source

L'appel à la fonction htmlentities() permet ici de bien protéger l'application. De plus, la position du drapeau ENT_QUOTES en second paramètre permet également de se protéger des injections basées sur le caractère ' :

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

  function xss_check($data) {
    return htmlentities($data, ENT_QUOTES);
  }
?>

<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