¿Por qué no funciona este ataque XSS?

1

Tengo un sitio que tiene el siguiente javascript que se está ejecutando:

var t=location.hash.slice(1);
$("div[id="+t+"]").text("The DOM is now loaded and can be manipulated.");

Estaba pensando que si adjuntaba lo siguiente a la url:

#message]");alert('test');//

Que ejecutaría el siguiente javascript:

$("div[id=message]");alert('test');//]").text("The DOM is now loaded and can be manipulated.");

Pero cuando se ejecuta la consola, se imprime el error:

  

Error de sintaxis, expresión no reconocida:   div [id = message] "); alert ('test'); //]

¿Me equivoco al pensar que mi entrada generaría el javascript que incluye el alert ? Si es así, ¿hay algún ataque XSS basado en DOM en las dos primeras líneas que publiqué?

    
pregunta Abe Miessler 18.09.2014 - 23:37
fuente

2 respuestas

3
  

$ ("div [id=" + t + "]")

Eso no es inyección de JavaScript. Para que sea una inyección JS, el valor proporcionado por el atacante tendría que estar escrito en el código JavaScript desde el exterior (por ejemplo, en un lenguaje de plantillas del lado del servidor o eval en JS). Eso no está sucediendo aquí, no hay un JavaScript generado dinámicamente. Solo se realiza una concatenación de cadenas dentro de JavaScript.

No es una inyección HTML del lado del cliente. Para que sea una inyección HTML, tendría que haber contenido de marcado de atacante escrito en el DOM. No hay aquí, solo la cadena estática The DOM is now loaded and can be manipulated. que se escribe usando el método seguro text() que no permite el marcado.

Aquí está ocurriendo un problema de inyección, pero solo se trata de una Inyección de Selector. La variable de cadena JS t se está copiando en un valor de atributo de selector CSS en el tiempo de ejecución de JS. Los caracteres que son especiales aquí incluyen ] (que termina el valor del atributo) y la barra invertida (que introduce escapes CSS).

Eso sigue siendo algo malo, pero lo peor que puede hacer con una inyección de selector es hacer que la aplicación seleccione el elemento incorrecto, por ejemplo:

http://victim.example.com/page#x],body,div[id=x

dando como resultado el selector

div[id=x],body,div[id=x]

que, debido a la referencia a <body> , reemplazaría toda la página con el texto The DOM is now loaded and can be manipulated.

Las inyecciones del selector normalmente no conducen a DOM XSS. Es concebible si pudiera apuntar a un elemento en el que la aplicación confiaba para ejecutarse como código, como <script type="text/template"> . Pero cuando no tienes el control de la cadena The DOM is now loaded and can be manipulated. , no puedes hacer nada, solo molestia.

Puedes corregir la inyección del selector mediante \xxx -escaping caracteres en t que son especiales en CSS. Mejor, donde sea posible, es evitar las cadenas de selección y sus problemas de escape yendo directamente al ID del elemento:

$(document.getElementById(t))  // works for any character in t

Sin embargo, en este caso parece que no vale la pena, ya que los ataques que puede realizar con la inyección del selector no son, en absoluto, peores que la funcionalidad deliberada de permitir que un ataque reemplace cualquier div nombrado con el texto.

    
respondido por el bobince 19.09.2014 - 07:23
fuente
1

La cadena t no está siendo eval 'd , es una cadena literal. La concatenación de cadenas simplemente crea una nueva cadena, tiene una situación similar a un simple var y = 'Hash: ' + location.hash.slice(1); que no abre un vector XSS. Simplemente asigna el hash a una variable en Javascript.

El resultado funciona igual que:

$("div[id=#message]\");alert('test');//]").text("The DOM is now loaded and can be manipulated.");

Observe que he escapado del " , porque eso se traduce en un carácter literal " en la cadena, no en la fuente de Javascript. Podrías usar eso como un ataque si el código fuera:

var t=location.hash.slice(1);
eval('$("div[id="'+t+'"]").text("The DOM is now loaded and can be manipulated.");');

que es (una razón) por la que a menudo se desaconseja el uso de eval en Javascript.

    
respondido por el Paulpro 19.09.2014 - 02:10
fuente

Lea otras preguntas en las etiquetas