TL; DR: Todos los sitios web (/ aplicaciones) bien escritos tienen que emitir encabezado X-XSS-Protection: 0
y simplemente olvidarse de esta característica. Si desea tener seguridad adicional que los mejores agentes de usuario pueden proporcionar, use un Content-Security-Policy
encabezado estricto .
Respuesta larga:
El encabezado HTTP X-XSS-Protection
es una de esas cosas que Microsoft introdujo en Internet Explorer 8.0 (MSIE 8) que supuestamente mejoraría la seguridad de los sitios web escritos incorrectamente.
La idea es aplicar algún tipo de heurística para tratar de detectar el ataque de reflexión XSS y neutralizar automáticamente el ataque.
La parte problemática de esto es "heurística" y "castración". La heurística causa falsos positivos y la esterilización no se puede realizar de manera segura porque causa efectos secundarios que se pueden usar para implementar ataques XSS y ataques DoS en sitios web perfectamente seguros.
Lo malo es que si un sitio web no emite el encabezado X-XSS-Protection
, el navegador se comportará como si el encabezado X-XSS-Protection: 1
hubiera sido emitido. ¡La peor parte es que este valor es el valor menos seguro de todos los valores posibles para este encabezado!
Para un sitio web seguro dado (es decir, el sitio no tiene vulnerabilidades XSS de reflexión), esta característica de "protección XSS" permite los siguientes ataques:
X-XSS-Protection: 1
permite al atacante bloquear selectivamente partes de JavaScript y mantener el resto de los scripts en ejecución. Esto es posible porque la heurística de esta característica es simplemente "si el valor de cualquier parámetro GET se encuentra en la parte de secuencia de comandos de la fuente de la página, la secuencia de comandos se modificará automáticamente de forma dependiente del agente de usuario". En la práctica, el atacante puede, por ejemplo, agregar parámetros disablexss=<script src="framebuster.js"
y el navegador eliminará automáticamente la cadena <script src="framebuster.js"
de la fuente de la página real. Tenga en cuenta que el resto de la página continúa ejecutándose y el atacante acaba de eliminar esta parte de la seguridad de la página. En la práctica, cualquier JS en la fuente de la página puede modificarse. En algunos casos, una página sin vulnerabilidad XSS que tenga contenido reflejado se puede usar para ejecutar JavaScript seleccionado en la página debido a la esterilizaciónconvertir incorrectamente datos de texto sin formato en código JavaScript ejecutable .
X-XSS-Protection: 1; mode=block
permite al atacante filtrar datos de la fuente de la página utilizando el comportamiento de la página como canal lateral. Por ejemplo, si la página contiene código JavaScript a lo largo de las líneas de var csrf_secret="521231347843"
, el atacante simplemente agrega un parámetro adicional, por ejemplo, leak=var%20csrf_secret="3
y si la página NO está bloqueada, el 3
primer dígito era incorrecto. El atacante lo intenta nuevamente, esta vez leak=var%20csrf_secret="5
y la carga de la página se cancelará. Esto le permite al atacante saber que el primer dígito del secreto es 5
. El atacante continúa adivinando el siguiente dígito.
Al final, si su sitio está lleno de ataques de reflexión XSS, el uso del valor predeterminado de 1
reducirá un poco la superficie de ataque. Sin embargo, si su sitio es seguro y no emite X-XSS-Protection: 0
, su sitio será vulnerable con cualquier navegador que admita esta función. Si desea un soporte de defensa en profundidad de los navegadores contra vulnerabilidades XSS aún desconocidas en su sitio, use un Content-Security-Policy
encabezado estricto . Eso no abre su sitio a vulnerabilidades conocidas.
Actualmente, esta función está habilitada de forma predeterminada en MSIE, Safari y Google Chrome. Esto solía estar habilitado en Edge, pero Microsoft ya eliminó esta característica errónea de Edge . Mozilla Firefox nunca implementó esto.
Ver también:
https://homakov.blogspot.com/2013/02/hacking-facebook-with-oauth2-and-chrome.html
https://blog.innerht.ml/the-misunderstood-x-xss-protection/
http: / /p42.us/ie8xss/Abusing_IE8s_XSS_Filters.pdf
https://www.slideshare.net/masatokinugawa/xxn-en
https://bugs.chromium.org/p/chromium/issues/detail?id=396544
https: // bugs.chromium.org/p/chromium/issues/detail?id=498982