¿Por qué “! - script” en una cadena JS causa una página rota / denegación de servicio para esa página?

3

Tenía la impresión de que todo lo que tenía que hacer para hacer seguro JSON en línea era romper cualquier etiqueta de </script> de cierre en cadenas, por ejemplo. escapa de / like <\/script> .

Sin embargo, encontré una combinación extraña que aún rompe mi página. El texto "No se imprimirá" no se mostrará en la página. El comentario HTML solo está bien, la etiqueta del script solo está bien, pero la combinación de los dos es letal. ¿Por qué es eso?

<!DOCTYPE html>
Before
<script>"<script>"</script>
fine
<script>"<!--"</script>
still fine
<script>"<!--<a>"</script>
fine again
<script>"<!--<script>"</script>
Won't print

Aparecerá como "Antes de estar bien todavía, todavía está bien, bien". "No se imprimirá" se tratará como parte de la etiqueta del script, que se tratará como no cerrada.

    
pregunta Adam A 03.09.2018 - 07:58
fuente

2 respuestas

2

La respuesta correcta a esto es "porque el analizador HTML en la especificación lo dice".

De la normal "dentro de una etiqueta de script" estado , un HTML el inicio del comentario ( <!-- ) coloca el analizador en un estado de escape , y desde ese modo una etiqueta de inicio de script ( <script> ) se coloca en un estado de doble escape en el que se ignoran las etiquetas de cierre de script ( </script> ).

¿Por qué en la Tierra hace esto? Compatibilidad con versiones anteriores para insertar código en navegadores que no son compatibles con JS. Chaals da una gran respuesta en enlace , y mostraré su ejemplo de lo que antes era un código normal aquí:

<script>
  <!--    //hide from non-JS browsers
  function doSomething() {
    var coolScript = "<script>" + theCodeICopied + "</script>";
    document.write(coolScript);
  }
  // And if you forget to close your comment here, things go funnny
  -->
</script>

Así que ahora estamos atascados con esta vulnerabilidad de salto de página, a menos que evites las etiquetas de secuencia de comandos AND AND end.

    
respondido por el Adam A 04.09.2018 - 11:59
fuente
0
  

¿Por qué “<!--<script>” en una cadena JS causa una vulnerabilidad XSS?

Corchetes extraños extraños :

  

Enviado por Franz Sedlmaier, este vector XSS podría vencer a ciertos motores de detección que funcionan al usar pares coincidentes de paréntesis de ángulo abierto y cerrado y luego hacer una comparación de la etiqueta en el interior, en lugar de un algoritmo más eficiente como Boyer-Moore que busca coincidencias de cadena completa del corchete de ángulo abierto y la etiqueta asociada (despues de la ofuscación, por supuesto). La barra doble comenta el paréntesis extraño final para eliminar un error de JavaScript:

<<SCRIPT>alert("XSS");//<</SCRIPT>

También vea el siguiente ejemplo en ese enlace: "Sin etiquetas de script de cierre", tener un código no válido como ese es incorrecto. Si esa fuera toda la página y no contuviera nada más, entonces no habría una vulnerabilidad XSS ni se mostraría nada. Está abriendo un comentario y terminándolo con un EOF, por eso no se imprime nada. Un bucle hacer siempre se ejecutará al menos una vez, incluso si la condición es falsa, porque el bloque de código se ejecuta antes de que se pruebe la condición; ejecutará todo hasta un while y cualquiera de los bucles o terminará el bucle.

    
respondido por el Rob 03.09.2018 - 09:22
fuente

Lea otras preguntas en las etiquetas