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