Estoy jugando con inyectar código JavaScript en un DOM existente.
He visto que si pongo el script a mano en el inspector de elementos DOM del navegador
<script>alert("XSS test");</script>el nodo de script se agrega al DOM, pero no tiene ningún efecto . Quiero decir, no se muestra ningún cuadro de alerta.
Por otro lado, si coloco el script como texto sin formato a través de la consola de JavaScript usando document.write(), en este caso el código se analizó y ejecutó de inmediato, y el cuadro de alerta se muestra como se esperaba.
document.write('<script>alert("XSS test");</script>');Estoy acostumbrado a ver que los cambios hechos a mano en los elementos DOM en el inspector se reflejan inmediatamente en la página, mientras que parece que los nodos de JavaScript son una excepción.
¿Por qué los navegadores web no ejecutan los nodos JavaScript puestos a mano en el inspector?
¿Hay otra forma de enviar el nodo de secuencia de comandos al DOM y hacer que se ejecute de inmediato?
Las etiquetas de script agregadas a través de innerHTML y los métodos relacionados ( insertAdjacentHTML , etc.) no se ejecutan. (Las reglas exactas se encuentran en alguna parte de la secuencia de script de la especificación HTML, pero es difícil). Esto puede deberse a que se identificó desde el principio que las páginas mal escritas podrían usar innerHTML y demás para agregar contenido del usuario, por lo que no ejecutarlo fue una forma rápida y sencilla de evitar ataques XSS muy, muy básicos. Pero solo muy, muy básicos.
Puede agregar una etiqueta de secuencia de script al DOM y hacer que se ejecute creando y agregando una etiqueta de secuencia de comandos:
const script = document.createElement("script"); script.textContent = `console.log("Hi there");`; document.body.appendChild(script);Puede hacerlo desde la pestaña de la consola en devtools, por ejemplo, en lugar de la pestaña del inspector DOM.
intente ir a la página web que desea y luego en la barra de URL en la parte superior agregue
javascript:[su secuencia de comandos]
por ejemplo
javascript:alert("¡Hola mundo!");