Recientemente hemos tenido una de nuestras aplicaciones web saturadas. Todo salió bien, a excepción de una vulnerabilidad CSRF, y es este descubrimiento el que tengo un hueso para elegir.
Algunos antecedentes: estamos usando ASP.NET MVC y, entre otras cosas, usamos funcionalidad CSRF integrada en ella. La forma en que funciona es estrictamente de acuerdo con lo que OWASP recomienda por incluyendo los llamados "tokens de sincronizador", uno en una cookie HTTP y otro en una entrada oculta llamada __RequestVerificationToken
:
<form action="/Home/Test" method="post">
<input name="__RequestVerificationToken" type="hidden"
value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />
<input type="submit" value="Submit" />
</form>
También realizamos exploraciones regulares de Acunetix y dijimos que las exploraciones nunca encontraron ningún formulario sin protección CSRF.
Ahora, lo que afirman los pentesters es que pudieron "violar" nuestra protección CSRF con el siguiente código:
<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>
La inclusión del campo __RequestVerificationToken
es lo que más me molesta: para mí, es como afirmar que un atacante ha transferido millones de dólares de mi cuenta bancaria porque voluntariamente le di mi iPhone para que juegue con él, y él vi la contraseña de un solo uso que mi banco envió en un SMS.
Me imagino que la única forma en que este ataque podría funcionar es si no estuviéramos usando HTTPS, fuera vulnerable a XSS, usáramos cookies no solo de HTTP y fuéramos negligentes con una Política de Same Origin. Nada de lo cual es cierto, ya que ninguna de estas vulnerabilidades fue reportada por Pentesters o Acunetix.
Entonces la pregunta es: ¿estoy equivocado y esto es una vulnerabilidad legítima de CSRF o no?