¿Cómo se puede usar el encabezado de origen para la prevención de CSRF si Firefox no lo envía para las mismas solicitudes de origen o solicitudes de URI de datos?

2

Estoy planeando usar tokens de sincronizador para la prevención CSRF, pero OWASP recomienda Comprobando las referencias y los encabezados de origen también. He estado tratando de averiguar la lógica correcta para esto, pero mis experimentos sugieren que no hay una forma válida de verificación debido a la forma en que se comporta Firefox.

Firefox no envía el encabezado de origen para las mismas solicitudes de origen, lo que habría pensado significa que debes permitir las solicitudes a través de las cuales no existe un encabezado de origen. Sin embargo, acabo de experimentar con los URI de datos y parece que Firefox tampoco envía el encabezado de origen, lo que significa que un atacante puede dirigir al usuario a un URI de datos que envía automáticamente un formulario malicioso.

Esto

data:text/html;base64,PGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiBtZXRob2Q9IkdFVCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiPgo8L2Zvcm0+

es un enlace a un URI de datos que contiene un formulario que se envía a example.com.

¿Cuál es el siguiente código codificado en base64:

<form action="http://www.example.com" method="GET">
<input type="submit">
</form>

Cuando lo abro en Firefox con la consola web abierta, no se muestra el origen ni el encabezado de referencia.

¿Qué me estoy perdiendo aquí? ¿Hay alguna lógica que debería usar en el servidor que permita las solicitudes de FIrefox pero no las solicitudes maliciosas de los URI de datos?

    
pregunta J Taylor 20.09.2016 - 18:22
fuente

1 respuesta

5

El encabezado de origen en sí mismo no es suficiente, pero los encabezados Referer y Origin generalmente lo son.

Por defecto, Firefox envía el encabezado del Referer para solicitudes del mismo origen. Esto es en parte por qué OWASP recomienda usar los encabezados de origen y de referencia:

  

Para determinar el origen de origen, recomendamos usar uno de estos dos encabezados estándar, ya que casi todas las solicitudes incluyen uno o ambos:

     
  • Encabezado de origen
  •   
  • Encabezado de referencia
  •   

Si ambos encabezados no están presentes, lo que debería ser raro (su caso base64 es uno de ellos), puede elegir permitirlo o negarlo.

  

Si ninguno de estos encabezados está presente, lo que debería ser MUY raro, puede aceptar o bloquear la solicitud. Recomendamos el bloqueo, especialmente si no está utilizando un token CSRF aleatorio como su segunda comprobación. Es posible que desee iniciar sesión cuando esto suceda por un tiempo y si, básicamente, nunca lo ve, comience a bloquear dichas solicitudes.

Sin embargo, como dice OWASP, hay casos en que estos encabezados pueden no estar presentes, por lo que recomienda usar una verificación adicional, de la cual recomienda el uso de tokens CSRF, especialmente si no se bloquea cuando ninguno de los encabezados está presente y correcto. / p>

  

verificar encabezados es un primer paso razonable en su defensa CSRF, pero como no siempre están presentes, generalmente no se considera una defensa suficiente por sí sola.

    
respondido por el Alexander O'Mara 20.09.2016 - 19:42
fuente

Lea otras preguntas en las etiquetas