È possibile CSRF in un SSR SPA con autenticazione cookie?

4

Ho un'applicazione Single-Page, che è fondamentalmente un consumatore per la mia API che autentica utilizzando l'intestazione Authorization . Ora perché eseguo il rendering lato server, devo autenticarmi su la richiesta iniziale, che significa Devo usare i cookie per memorizzare il token di autenticazione.

Ora, per quanto ho capito, CSRF funziona come questo in un tipico sito web:

  • Trova un endpoint che faccia qualcosa di dannoso come /delete-account che autentica con i cookie
  • In example.com , inserisci un <img href="http://mywebsite.com/delete-account"> (o qualsiasi altra cosa per una richiesta POST)

Tuttavia, a mio parere, sembra che sia impossibile per gli attacchi CSRF accadere nel caso di una SPA, anche se il token di autenticazione viene inviato come cookie. La normale procedura è un po 'come:

  • L'utente visita una pagina, ad esempio /account
  • Il server esegue il rendering della pagina secondo l'utente autenticato (dato il cookie auth)
  • La pagina Web viene restituita
  • Ora se l'utente desidera eliminare il proprio account, potrebbe premere il pulsante, che invierà una richiesta all'API che autentica le richieste solo tramite Authorization header

Ora in un attacco CSRF:

  • <img href="/account">
  • Il server esegue il rendering e restituisce la pagina web
  • Umm, non succede nulla?

Voglio dire che non riesco a pensare a un modo in cui posso essere vulnerabile a CSRF in questa situazione, anche se utilizzo i cookie per l'autenticazione e, per quanto ho capito, gli attacchi CSRF non riescono a raschiare i dati dalle pagine web, pertanto, restituire dati sensibili non dovrebbe avere importanza, a condizione che non attivi un'azione.

Quindi la mia domanda è, va bene non implementare alcun tipo di protezione CSRF in questo caso? Ho tanta paura di avere un problema di sicurezza in merito.

    
posta OverCoder 09.01.2018 - 23:11
fonte

2 risposte

4

Now if the user wants to delete their account, they could press the button, which would send a request to the API that authenticates requests only by Authorization header

In definitiva, invia una richiesta per eseguire un'azione che deve essere autenticata in qualche modo. Poiché l'intestazione di autorizzazione viene utilizzata per l'autenticazione, impedisce in qualche modo CSRF a meno che tu non stia utilizzando Autenticazione di base HTTP o NTLM . Questi token di autenticazione vengono inviati in ogni richiesta simile ai cookie.

I mean I can't think of a way I can be vulnerable to CSRF in this situation, even if I use cookies for authentication, and as far as I understand, CSRF attacks can't scrape data out of web pages, so returning sensitive data shouldn't matter, as long as it doesn't trigger an action

Ci sono situazioni in cui potresti trovarti vulnerabile a CSRF, qui ce ne sono poche;

  1. Che cosa succede se il tuo server accetta uno qualsiasi dei due cookie o token?

- > Recentemente ho incontrato lo stesso. L'applicazione avrebbe bisogno di cookie o token di autenticazione. Poiché i cookie vengono sempre inviati, si presume che vengano autenticati e che la richiesta venga elaborata lasciandovi vulnerabili a CSRF assumendo nuovamente che l'applicazione consenta l'invio di token di autorizzazione da qualsiasi dominio.

  1. Che succede se l'applicazione perde il token di autenticazione che può essere letto nel dominio incrociato?

- > Ho visto un certo numero di app che prelevano i token da un endpoint predefinito che può essere letto in qualche modo sul crossdomain. Alcune possibilità sono: JSONP, CORS, crossdomain.xml, JSON Hijacking, ecc. Questo di nuovo porta a CSRF.

even if I use cookies for authentication

Questo è sempre vulnerabile, devi solo giocare con la richiesta finale che è una richiesta API nel tuo caso.

So my question is, is it fine to not implement any sort of CSRF protection in this case? I'm so afraid of having a security issue regarding that

È un dato di fatto, sì. Inoltre, assicurati di autorizzare i domini che possono richiedere la tua API e restituire Access-Control-Allow-Credentials: false . Questo, a mio avviso, lo rende abbastanza sicuro contro CSRF - considerando i punti sopra menzionati.

    
risposta data 10.01.2018 - 04:19
fonte
2

In primo luogo, è importante comprendere quanto segue: è necessario implementare qualcosa per autenticare un utente e si dovrebbe implementare qualcosa per autenticare una richiesta (Anti-CSRF). CSRF Attack usa una sessione di una vittima, quindi se il tuo valore di intestazione Authorization è lo stesso per tutte le sessioni, l'applicazione potrebbe essere vulnerabile a un attacco CSRF, poiché l'applicazione convalida solo una sessione utente, deve convalidare una richiesta e questo è possibile usando un token con le seguenti caratteristiche:

  • Abbastanza a lungo.
  • pseudo-casuale.
  • Valore unico.
  • Una per richiesta.

In primo luogo, dovresti convalidare la sessione utente, se è un utente valido e le sue autorizzazioni o il suo ruolo, dopo di ciò dovresti convalidare la richiesta attraverso il token, se è un token valido allora puoi consentire la richiesta.

Spero che questa informazione ti aiuti.

    
risposta data 10.01.2018 - 00:13
fonte

Leggi altre domande sui tag