¿Las barras invertidas que no se escapan son peligrosas en términos de XSS?

2

Pensé que el carácter \ (barra diagonal inversa) era un carácter peligroso que necesitabas filtrar / codificar adecuadamente para proteger contra ataques XSS (OWASP también lo dice), y todavía lo hago, pero ¿por qué?

Encontré un sitio web que almacena la consulta de búsqueda cuando buscas el sitio web en una variable de JavaScript, como esta:

var_name = "query"

Se filtran las comillas dobles, comillas simples y punto y coma, pero puedo usar cosas como \n y \r (aunque \r parece representar solo espacios en blanco ...) pero por alguna razón, ahora puedo obtener el alert() llamado correctamente.

He jugado un poco con \n , como poner unos pocos antes y después de alert() , y también escapar de la comilla de cierre:

var_name = "\n\nalert()\n\n\"

Pero nada parece funcionar. Creo que me estoy perdiendo algo obvio aquí, pero si alguien pudiera ayudarme aquí y aclarar esto, ¡se lo agradecería!

    
pregunta David 11.10.2018 - 20:07
fuente

1 respuesta

3

Las barras invertidas sin escapar pueden ser peligrosas, según el contexto.

Supongamos que X y Y son controlados por el usuario (con ' y < escapados, pero no \ ). Entonces, esto es explotable:

<script>
var name = "X"; var id = "Y";
</script>

Un atacante puede configurar X a \ para evitar la comilla de cierre de la primera cadena ( " ), y configurar Y a ;alert()// para inyectar la carga útil y comentar el "; superfluo. La línea se vería así:

var name = "\"; var id = ";alert()//";
           |---string----|        |--comment ...

Pero esto no es explotable:

<script>
var name = "X";
var id = "Y";
</script>

También aunque un atacante puede eliminar el primer cierre " aquí, una cadena de comillas simples o dobles solo puede abarcar varias líneas si cada línea anterior termina con \ . Pero en este ejemplo, incluso si el atacante puede inyectar nuevas líneas, todo lo que pueden hacer es provocar un error de sintaxis, no una inyección de script porque no controlan el final de todas las líneas en la cadena.

OTOH, si estas cadenas estuvieran en comillas de comillas ("literales de plantilla"), podrían abarcar varias líneas sin problemas y el ataque sería factible.

Por lo tanto, si una cadena JS con barras invertidas sin escape es capaz de XSS depende mucho del contexto. Pero en muchos casos necesitará al menos dos puntos de inyección para insertar una carga útil después de usar un \ para romper una cadena.

    
respondido por el Arminius 11.10.2018 - 21:11
fuente

Lea otras preguntas en las etiquetas