¿Por qué no se puede omitir el SOP utilizando el atributo "src" en la etiqueta de script?

0

No estoy familiarizado con Javascript, pero quiero saber qué es lo que no se puede hacer en estos pasos para omitir el SOP y extraer datos confidenciales:

  1. establece la etiqueta <script src="https://facebook.com/messages"></script>
  2. el navegador recupera el contenido de https://facebook.com/messages
  3. el navegador, pensando que es un código JS, coloca el contenido HTML dentro de la etiqueta <script>
  4. otra parte del código JS obtiene el contenido de la etiqueta <script> y lo envía al servidor del atacante
pregunta Reda LM 29.03.2018 - 19:18
fuente

3 respuestas

5

Porque el paso 4 es imposible. No solo por la política del mismo origen, sino porque simplemente no hay forma de recuperar el contenido de una etiqueta de script a través de JavaScript.

Hay HTMLScriptElement.text , pero eso solo recupera el texto entre el inicio del script y etiquetas finales. No puede recuperar el contenido cargado a través del atributo src.

Dicho esto, en realidad hay una forma de usar las etiquetas de script para omitir la política del mismo origen en circunstancias limitadas. Si carga una secuencia de comandos de otro dominio y la ejecuta, entonces podría obtener cierta información de los efectos secundarios de esa ejecución. Así es como funciona JSONP. Sin embargo, esto no suele ser un problema de seguridad, ya que la mayoría de los puntos finales JSONP están diseñados teniendo en cuenta el acceso de origen cruzado, y la mayoría de los otros tipos de scripts son activos estáticos que no contienen información confidencial.

    
respondido por el Ajedi32 29.03.2018 - 19:35
fuente
3

Como mención de @ Ajedi32 no hay ninguna función para recuperar el contenido de un script cargado dinámicamente.

Sin embargo, es posible que aún puedas recuperar parte del contenido si el recurso es un javascript válido. Este ataque se llama xssi .

Los encabezados HTTP Content-Type y X-Content-Type-Options se usan para prevenir este tipo de ataque:

  • Content-Type especifique qué tipo de contenido es el documento. Para una página web, normalmente debería ser text/html y application/javascript para un script.
  • X-Content-Type-Options : nosniff impide que el navegador intente cambiar el Tipo MIME del recurso. Entonces, incluso si un recurso se carga en una etiqueta script y es un javascript válido, si el Content-type es text/html no se ejecutará.

Si echa un vistazo a los encabezados https://facebook.com/messages , encontrará ambos encabezados.

    
respondido por el Xavier59 29.03.2018 - 20:01
fuente
3
  
  1. el navegador, pensando que es un código JS, coloca el contenido HTML dentro de la etiqueta <script>
  2.   

Cuando el navegador carga un script al que se hace referencia a través de <script src=...> , en realidad no agrega su contenido al DOM. Así que document.scripts[0].textContent solo te daría una cadena vacía.

En su lugar, el navegador intenta ejecutar el script referenciado como JS, y en su ejemplo, esto falla en todos los navegadores porque el documento HTML en https://facebook.com/messages no es JS válido, lo que resulta en un error de sintaxis. Incluso si era JS válido de alguna manera, el documento se sirve con un tipo MIME de text/html y un encabezado X-Content-Type-Options: nosniff , por lo que su navegador se niegan a ejecutarlo como un script.

    
respondido por el Arminius 29.03.2018 - 20:23
fuente

Lea otras preguntas en las etiquetas