Recentemente abbiamo avuto una delle nostre applicazioni web ripetute. Tutto è andato bene, tranne che per una vulnerabilità CSRF, ed è questa scoperta che ho un osso con cui scegliere.
Alcuni background: stiamo usando ASP.NET MVC e, tra le altre cose, usiamo CSRF protection funzionalità integrate. Il modo in cui funziona è strettamente in linea con quanto OWASP consiglia : by inclusi i cosiddetti "token di sincronizzazione", uno in un cookie HTTP e un altro in un input nascosto denominato __RequestVerificationToken
:
<form action="/Home/Test" method="post">
<input name="__RequestVerificationToken" type="hidden"
value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />
<input type="submit" value="Submit" />
</form>
Effettuiamo anche scansioni regolari di Acunetix e le scansioni non hanno mai trovato moduli non protetti da CSRF.
Ora, ciò che sostengono i pentesters è che sono stati in grado di "violare" la nostra protezione CSRF con il seguente codice:
<html>
<body>
<form action="https://our.site/support/discussions/new" method="POST">
<input type="hidden" name="subject" value="Subject" />
<input type="hidden" name="content" value="Content" />
<input type="hidden" name="__RequestVerificationToken"
value="_e-upIZFx7i0YyzrVd[...]" />
<input type="submit" value="Submit Request" />
</form>
</body>
</html>
L'inclusione del campo __RequestVerificationToken
è ciò che mi infastidisce di più: per me, è come sostenere che un attaccante ha trasferito miliardi di dollari dal mio conto in banca perché gli ho dato volontariamente il mio iPhone con cui giocherellare, e lui ho visto la password monouso inviata dalla mia banca in un SMS.
Immagino che l'unico modo in cui questo attacco possa funzionare sia se non usassimo HTTPS, fossero vulnerabili all'XSS, stessimo usando cookie non HTTP e siamo stati negligenti con la stessa politica di origine. Nessuno dei quali è vero, dal momento che nessuna di queste vulnerabilità è stata riportata da alcun pentestore o Acunetix.
Quindi la domanda è: ho sbagliato e questa è una vulnerabilità CSRF legittima o no?