En este post vamos a estar resolviendo el laboratorio: “Stored DOM XSS”.

Descripción del laboratorio Stored DOM XSS

En este caso, el enunciado nos dice que existe una vulnerabilidad de XSS del tipo DOM almacenado en la funcionalidad de comentario del blog. Para resolver el laboratorio debemos de explotar la vulnerabilidad y ejecutar la función alert.

Dicho esto, lo primero de todo es acceder al laboratorio:

Página principal del laboratorio

Una vez accedidos, podemos observar como hay distintos artículos, en este caso, vamos a ver el primero:

Lista de artículos del blog

Vista del primer artículo

Al acceder a un artículo, podemos observar como hay una zona de comentarios:

Formulario de comentarios del blog

En este caso, simplemente vamos a llenarla con datos random y a publicar un comentario:

Formulario de comentario completado

Una vez publicado, volvemos al artículo para ver nuestro comentario:

Comentario publicado en el artículo

Confirmación del comentario publicado

Sin problemas se ha publicado.

Si investigamos un poco el código fuente y las distintas dependencias (archivos JS), podemos encontrar el siguiente archivo de JavaScript, llamado loadComments.js:

Archivo JavaScript loadComments.js

El archivo, entre otras cosas, posee una función que reemplaza los símbolos > y <, HTML encodeándolos cuando se carga los comentarios.

Aquí es donde está el fallo, está usando el método replace para la sustitución. Este método únicamente reemplaza la primera ocurrencia que encuentra, por ejemplo, si tengo la palabra patata y utilizo la función replace para sustituir las ‘a’ por una ‘e’, el resultado de implementar este método en la palabra patata dará como resultado: petata.

Referencia del funcionamiento del método replace() en JavaScript

Por lo que, teniendo en cuenta este funcionamiento, podemos crear un payload típico de XSS, pero colocando al principio de este <> para que sean los que el script sustituya y no los símbolos usados en el código malicioso:

Payload XSS con bypass del método replace

Comentario con payload XSS publicado

De esta manera, al publicar el comentario y volver al post:

Ejecución exitosa del alert de JavaScript

Conseguimos ejecutar el código JavaScript que habíamos puesto, en este caso, el alert.

De esta forma, conseguimos resolver el laboratorio:

Mensaje de laboratorio resuelto

Laboratorio completado exitosamente