Generazione di token CSRF senza utilizzare sessioni e cookie

2

Sto scrivendo una libreria per generare e controllare i token CSRF.

Mi piacerebbe farlo senza dover utilizzare sessioni e / o cookie. Quello che ho scoperto è questo:

  1. Un token generato dall'ora corrente e un id token univoco (unix-timestamp.unique-token-id).

  2. Il token verrà quindi sottoposto a hash con il metodo HMAC. Il valore restituito sarebbe: hmac-hash.unix-timestamp.unique-token-id. Questo potrebbe quindi essere nascosto in un modulo.

  3. La libreria testerà quindi il token restituito estraendo l'hash HAMC, l'ora e l'ID del token univoco da esso e quindi confronterà l'hash HAMC restituito con uno generato utilizzando l'ora restituita e l'ID token univoco.

Finché il segreto HMAC sul server rimane segreto, dovrebbe essere sicuro o mi sono perso qualcosa?

    
posta Glass Robot 26.02.2011 - 17:31
fonte

3 risposte

8

Se il token non è legato a una particolare sessione o cookie, allora io (come attaccante) potrei scrivere uno script per raccogliere i token e incorporarli nelle mie pagine ospitate. Il token verrebbe quindi passato dal browser della vittima al tuo sito e verrebbe validato correttamente come è stato generato dal tuo server. (anche se è per l'utente sbagliato se questo ha senso.)

    
risposta data 26.02.2011 - 18:23
fonte
3

Discuterò con la risposta di ach_l, perché sono interessato anche alla protezione CSRF senza sessione:)

(If the token isn't tied to a particular session or cookie, then I (as an attacker) could write a script to harvest tokens, and embed them in my hosted pages. The token would then be passed by the victim's browser to your site and would validate correctly as it was generated by your server.)

Se i token sono firmati con la "chiave molto segreta" e l'userid, puoi raccoglierli, ma non saranno in grado di usarli, poiché quelli raccolti saranno diversi da quelli dell'utente reale sotto attacco. Quindi, anche se i timeout di sessione (e sessionid) (nel mio caso dopo 15 minuti), il token è associato all'utente e contiene un timestamp che può essere applicato (ad esempio dopo circa un giorno). Mi manca qualcosa?

    
risposta data 02.03.2011 - 16:55
fonte
0

I come utente malintenzionato invierà nuovamente i dati con lo stesso token entro n secondi. supponendo che n sia il tempo di expiary. Questo suona come un attacco di replay però. Tuttavia, posso modificare gli altri dati dei campi del modulo mantenendo i token uguali. come non hai

    
risposta data 01.05.2012 - 19:25
fonte

Leggi altre domande sui tag