# xss8

## Exploitation

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

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FVyt4YftKIEktZdxkA9jO%2Fimage.png?alt=media\&token=f8564ba9-60f0-440c-96f6-6108f6981eb8)

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 :&#x20;

```http
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 :&#x20;

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FqUWlPIhBmLp3yasskbL1%2Fimage.png?alt=media\&token=8031c09b-4a35-483d-a2bf-427950955223)

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

```html
<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 `'` :&#x20;

```php
<?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>
```
