2015-07-09 17 views
21

Ho letto su CSRF e su come il pattern token di sincronizzazione non prevedibile viene utilizzato per impedirlo. Non ho capito bene come funziona.Come fa il token a prevenire l'attacco csrf?

Prendiamo questo scenario:

un utente è connesso in un sito con questo modulo:

<form action="changePassword" method="POST"> 
    <input type="text" name="password"><br> 
    <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' > 
</form> 

Il server memorizza anche il token nella sessione. Quando viene inviata la richiesta, confronta il token nei dati del modulo con il token nella sessione.

Come si fa che impediscono CSRF quando l'hacker può scrivere codice JavaScript che:

  1. Invia una richiesta GET al sito
  2. Ricevi testo HTML contenente il modulo di richiesta.
  3. Cerca il testo html per il token CSRF.
  4. Effettua la richiesta dannosa utilizzando quel token.

Mi manca qualcosa?

risposta

8

L'utente malintenzionato non può utilizzare JavaScript per leggere il token dal sito, poiché si tratta di una richiesta di origine incrociata e l'accesso ai dati da esso è bloccato (per impostazione predefinita) dallo stesso criterio di origine (MDN, W3C).

Prendete questo ad esempio:

var xhr = new XMLHttpRequest(); 
 
xhr.open("GET", "http://google.com"); 
 
xhr.addEventListener('load', function (ev) { 
 
    console.log(this.responseText); 
 
}); 
 
xhr.send();

Le relazioni console JS:

XMLHttpRequest non può caricare http://google.com/. L'intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta.

+1

Vale la pena notare che è possibile rilasciare una richiesta GET di successo anche tramite iframe, script o tag di oggetto, ma il browser non consente di ottenere il contenuto del documento caricato da JavaScript (protocolli, domini e porte devono corrispondere), – pamelus

+0

grazie per la tua risposta – david

+0

Nel caso in cui qualcuno si chiedesse perché l'attaccante non può semplicemente ottenere alcun vecchio token dal sito e utilizzarlo nella sua richiesta, è perché il token è anche memorizzato come cookie nel browser di cui l'utente malintenzionato non è a conoscenza , quindi quando invia la richiesta con un nuovo token che ha appena ottenuto dal sito non corrisponde a quello sul cookie dell'utente e la richiesta viene eliminata. – T0m

-2

È importante rendersi conto che gli attacchi CSRF avvengono solo nel browser. La sessione dell'utente con il server di destinazione viene utilizzata dal server dannoso per falsificare le richieste. Quindi, come accade # 1? Due opzioni: puoi effettuare la richiesta n. 1 dal server malevolo, ma restituirebbe semplicemente un token CSRF per la sessione del server oppure potresti effettuare la richiesta n. 1 utilizzando AJAX che, come hai identificato correttamente, restituirà il Token CSRF dell'utente vittima.

I browser hanno implementato il controllo degli accessi HTTP proprio per questo motivo. È necessario utilizzare l'intestazione Access-Control-Allow-Origin per limitare i domini che possono inviare richieste AJAX al server. In altre parole, il tuo server si assicurerà che il browser non consenta al sito dannoso di # 1. Sfortunatamente i documenti che ho letto sull'argomento non sono molto chiari al riguardo, ma penso che sia perché i server di default non inviano un'intestazione Access-Control-Allow-Origin a meno che non siano configurati per farlo. Se è necessario consentire le richieste AJAX, è necessario considerare attendibili eventuali origini nell'intestazione per non eseguire un attacco CSRF, è possibile bloccare selettivamente le parti sensibili dell'applicazione per non consentire le richieste AJAX o utilizzare le altre intestazioni Access-Control-* per proteggersi .

Utilizzando un programma di sincronizzazione Token è un modo che un'applicazione può contare sul same-origin politica per prevenire CSRF mantenendo un segreto token per autenticare le richieste

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Si dovrebbe leggere su Cross-Origin Resource Sharing (CORS).

+0

'Access-Control-Allow-Origin' non impedisce CSRF, tutto ciò che fa è aprire le restrizioni imposte dalla [stessa politica di origine] (https://en.wikipedia.org/wiki/Same- origin_policy). La stessa politica di origine non impedisce le richieste fatte al tuo dominio, blocca semplicemente la risposta dalla lettura. Il SOP può impedire di leggere il token del sincronizzatore, ma è inutile da solo per prevenire CSRF. – SilverlightFox

+1

"È necessario utilizzare l'intestazione Access-Control-Allow-Origin" - No. 'Access-Control-Allow-Origin' ** rilassa ** la sicurezza. È sicuro per impostazione predefinita. 'Access-Control-Allow-Origin' è usato se * vuoi * siti di terze parti essere in grado di leggere i tuoi dati. – Quentin