
Descripción
The user lookup functionality for this lab is powered by a MongoDB NoSQL database. It is vulnerable to NoSQL injection.
To solve the lab, extract the password for the administrator
user, then log in to their account.
You can log in to your own account using the following credentials: wiener:peter
.
Tip: The password only uses lowercase letters.
Exploiting NoSQL injection to extract data writeup
Al entrar en el laboratorio encontraremos una tienda online:

En el apartado «My account», iniciaremos sesión con el usuario ‘wiener’ y la contraseña ‘peter’. Interceptaremos esa petición con el Logger de Burp Suite y la enviaremos al repeater:

Aquí, podemos interactuar con el parámetro del usuario y recabar detalles del ‘administrator’:

Primero, vamos a averiguar la longitud de la contraseña con la siguiente petición:

Al codificar como URL ‘ && this.password.length < 10 || ‘1’==’2 y enviarlo, obtendremos el usuario de administrador de vuelta si la contraseña es menor a 10 caracteres, pero un mensaje de que no se ha encontrado al usuario si no lo es. Esto funciona de la siguiente manera:
- administrator’ hace que Mongo DB busque en la base de datos a el usuario ‘administrator’ y devuelva True si lo encuentra.
- && añade a la condición de encontrar el usuario ‘administrator’ lo siguiente.
- this.password.length < 10 toma la contraseña del usuario ‘administrator’ y compara su longitud con 10. Al estar junto con la condición anterior en un AND (&&), como siempre habrá un usuario ‘administrator’, se devolverá True si se cumple esta condición o False si no.
- || ‘1’==’2 Añade a lo anterior un OR (||) no restrictivo (siempre da False, por lo que no afecta a la consulta anterior), y es necesario puesto que al insertar nosotros la ‘ en adminsitrator, necesitamos abrir la comilla que cierra Mongo DB internamente, por lo que tenemos que enviarle una operación lógica para que no devuelva un mensaje de error. Las comillas deben estar equilibradas (en grupo de pares).
Cambiando el ‘<‘ por ‘==’ conseguiremos la longitud exacta de la contraseña.

Ahora sabemos que la contraseña tiene 8 letras de longitud. Nos llevaremos esta petición al ‘Intruder’ con Ctrl + I o Click derecho -> Send to repeater.
Nota: Usaremos esta petición porque la del /login tiene protección CSRF.
Usaremos la siguiente configuración:

Con esto comprobaremos cada carácter único de la contraseña con una lista de letras que, por la pista que nos han proporcionado, sabemos que tienen que ser letras minúsculas. La parte de payloads la tendremos así:
Para la posición 1 (S0S):

Añadiremos la lista ‘0-9’ y borraremos con ‘Remove’ el 8 y el 9, dado que la contraseña tiene 8 caracteres, sólo usaremos del 0 al 7.
Para la segunda posición (SaS) usaremos la lista ‘a-z’:

Al presionar ‘Start attack’ y acabar este, ordenaremos por ‘Payload 1’ y por ‘length’:

El Payload 1, al identificarse con los caracteres individuales de la contraseña, nos la da ordenada. Nos identificaremos ahora en la página web con el usuario ‘administrator’ y la contraseña ‘mybbspny’. Completando así el laboratorio:

Nota: Usar la lista de contraseñas en un único Payload no sólo no dará resultado (puesto que no está la contraseña en ella) sino que será mucho más lento y ruidoso en el lado del servidor.