11 - DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded
Angular Sandbox Escape Cheatsheet · GitHub
AngularJS is a popular JavaScript library, which scans the contents of HTML nodes containing the ng-app attribute (also known as an AngularJS directive).
Angular JS is deprecated and is going to be replace by Angular.
Las "double curly braces" (dobles llaves) se refieren a {{ y }}. Estas se utilizan en varios contextos de programación y plantillas para diferentes propósitos.
AngularJS:
- En AngularJS, se utilizan dobles llaves para la vinculación de datos.
- Ejemplo:
Aquí,<p>{{ expression }}</p>expressiones evaluada y su resultado se muestra en el HTML.
Defininimos una app y un controlador y los inicializamos
Esta es la forma clásica de crear una función
Podemos llamar al contructor de funciones y alojar en la variable test una función.
Si ponemos Function('alert()')(); la estamos declarando y llamando en la misma función.
Es equivalente usar el constructor de funciones a llamar a test.constructor('aqui se sobreescribe la función'), estamos tomando la referencia a la función.
Si llamamos a $on.constructor() estamos sobreescribiendo la función con nuestros propios argumentos, estamos creando esa función y luego llamándola.
$on.constructor('alert()')()
No es posible usar Function('alert()')(); en Angular directamente en el dom, por seguridad.
Descomposición del Código
-
$on:- En el contexto de AngularJS,
$ones una función que se utiliza para escuchar eventos.
- En el contexto de AngularJS,
-
.constructor:- En JavaScript, cualquier función tiene una propiedad
constructor. La propiedadconstructorde una función es una referencia a la funciónFunction, que es el constructor de todas las funciones en JavaScript. - Esencialmente,
someFunction.constructores una referencia aFunction.
- En JavaScript, cualquier función tiene una propiedad
-
('alert()'):Functiones un constructor de funciones. Al pasar una cadena de texto como argumento al constructorFunction, JavaScript crea una nueva función cuyo cuerpo es el código en esa cadena.Function('alert()')crea una nueva función que, cuando se ejecuta, mostrará un cuadro de alerta con el mensajeundefined(si no se pasa nada más).
-
():- Esto invoca inmediatamente la función recién creada.