Durante la ricerca di vulnerabilità in un'app Web quali sono le potenziali aree in cui si dovrebbe cercare il difetto CSRF?
La croce incrociata della richiesta del sito (CSRF) sta eseguendo una richiesta "falsificata" dal sito dell'attaccante a un altro sito in cui la vittima ha effettuato l'accesso. Se quel sito è vulnerabile, qualsiasi azione che l'utente normalmente può eseguire sul sito può ora essere eseguita dall'attaccante.
Un'interessante azione da eseguire tramite CSRF sta cambiando la password o l'indirizzo e-mail, in quanto ciò comporta l'acquisizione dell'account. Per le password questo è spesso impossibile dato che devi compilare la vecchia password, ma per gli indirizzi email questo a volte è dimenticato.
Altre azioni interessanti dipendono molto da quale sia lo scopo del sito attaccato. Qui su sec.se, innescherei le upvotes su tutte le mie domande e risposte tramite CSRF.
Le richieste che eseguono alcune azioni dovrebbero avere una protezione CSRF e sono interessanti da testare. Il più delle volte queste sono richieste POST, ma non sempre. Alcuni siti hanno una protezione CSRF su tutte le richieste POST, ma non sulle richieste GET. In tal caso è interessante cercare una richiesta GET che esegua un'azione.
Una richiesta che può essere spesso falsificata è quella di disconnettere l'utente. Sulla maggior parte dei siti, semplicemente visitando / disconnetti o qualcosa del genere si disconnetterà l'utente. Questo è tecnicamente CSRF, anche se con un impatto piuttosto banale.
La protezione CSRF viene in genere eseguita inviando un token casuale insieme a qualsiasi richiesta. L'autore dell'attacco non ha questo token e quindi non può falsificare una richiesta valida.
A volte il sito verifica le intestazioni Referer o Origin per verificare che la richiesta provenga dal sito stesso. Questo può essere sicuro, ma è un po 'più difficile da correggere. A volte il sito controlla se " link " è contenuto nel Referer, nel qual caso può essere attaccato da utilizzando " link " come pagina di attacco. A volte il controllo non viene eseguito se manca l'intestazione Referer, che l'autore dell'attacco può attivare tramite un referrer policy .
Infine, i cookie con lo stesso sito forniscono adeguati protezione contro CSRF, ma solo per i browser che li supportano.
La versione breve è, come dice @AndrolGenhald, "Letteralmente qualsiasi richiesta che cambia lo stato dell'applicazione." I posti più comuni da cercare sono i tag HTML <form>
, poiché l'intero punto di questi è fornire un modo per inviare dati al server (in genere modificando lo stato dell'app Web), ma è anche possibile trova richieste non idempotenti (che cambiano lo stato) in altre posizioni, come XHR o richieste di recupero o GET richieste avviate da link o pulsanti non "invia".
Generalmente, un buon modo per trovare CSRF è quello di camminare su un sito web da soli, mentre si trasmette tutto il traffico attraverso un proxy di intercettazione HTTP (Burp Suite è lo strumento standard per i pentesters, ma in un pizzico puoi usare anche altri proxy) . Il proxy ti mostrerà qual è il traffico di rete effettivo, incluse cose che potresti non sapere nemmeno che erano lì. Ogni volta che fai qualcosa che cambia lo stato dell'applicazione, controlla il traffico di rete nel registro proxy e verifica se esiste un qualsiasi tipo di token di protezione CSRF. Puoi anche verificare che il token sia usato correttamente facendo cose come ri-giocare le richieste senza il token corretto o senza il token, o confrontando due diverse sessioni utente per assicurare che il token sia diverso e un utente non possa predire il token di un altro utente .
Nella maggior parte dei casi, a meno che il server non abbia fatto qualcosa di molto sciocco con la sua configurazione CORS, non è possibile creare tipi di richiesta diversi da GET, HEAD, POST o OPTIONS, quindi verbi come PUT, PATCH, ecc. bene. Tieni presente, tuttavia, che alcuni server ti permetteranno di usare il verbo "sbagliato" per una richiesta e di onorarlo comunque; prova a cambiare il metodo di richiesta e vedere se continua a passare. Allo stesso modo, i tipi di contenuto diversi dai moduli con codifica URL e il testo normale sono difficili da inviare all'origine incrociata, ma a volte un server che si aspetta che JSON accetti volentieri una richiesta che contiene JSON valido nel corpo ma afferma che il tipo di contenuto è text/plain
e un CSRF autore di attacchi CSRF può inviarlo.
Leggi altre domande sui tag web-application csrf