$ ("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.