En este post vamos a estar resolviendo el laboratorio: “DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded”.

Pantalla de inicio del laboratorio DOM XSS in AngularJS expression

En este caso, se nos indica que la web usa Angular, y que, además, existe un DOM based XSS en la funcionalidad de búsqueda. Para completar el laboratorio, tenemos que ejecutar la función alert.

Lo primero de todo es acceder al laboratorio:

Página principal del laboratorio con formulario de búsqueda

Una vez accedidos, probamos la funcionalidad de búsqueda:

Formulario de búsqueda con término de prueba

Resultados de búsqueda mostrados en la página

En principio no se ve nada raro. Sin embargo, si miramos el código fuente:

Código fuente HTML mostrando atributo ng-app en body

Podemos ver como en el body se establece un atributo el cual es ng-app. Ng-app es una directiva que se define un elemento raíz de Angular, y, por tanto, define que comienza la aplicación de Angular.

Claro, definiendo en el tag body de HTML que empieza la aplicación de Angular, en todo el código que haya dentro, se interpretará cualquier sentencia de Angular que se añada. Y gracias a la funcionalidad de búsqueda, podemos controlar un parámetro que se colocará dentro de la parte definida como aplicación de Angular.

Sabiendo esto, usaremos el payload {{constructor.constructor('alert(1)')()}}.

Vamos a explicar el payload:

  • Los dobles corchetes sirven para que se trate como una expresión de Angular.
  • El constructor.constructor, básicamente se interpreta igual que una función, es como si declarásemos una función y dentro de esta colocáramos el código que se ejecutará, pues aquí es exactamente lo mismo, dentro de los paréntesis, colocamos lo que queremos que se ejecute, en este caso un alert(1).

Sabiendo esto, mandamos el payload mencionado, ya que recordemos que este se verá reflejado dentro de la parte que es declarada como Angular gracias al ng-app:

Payload de AngularJS inyectado en el campo de búsqueda

Y, por lo tanto, se interpretará como hemos explicado y ejecutará:

Ejecución exitosa del alert mediante expresión de AngularJS

Mensaje de laboratorio resuelto satisfactoriamente

De esta forma, conseguimos resolver el laboratorio:

Confirmación final de éxito del laboratorio

Algunas referencias: