Entrada

Detecting NoSQL injection

Laboratorio de Portswigger sobre NoSQLI

Detecting NoSQL injection

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio utiliza un filtro de categoría de producto que está impulsado por una base de datos NoSQL en MongoDB. Es vulnerable a una inyección NoSQL. Para resolver el laboratorio, debemos realizar un ataque de inyección NoSQL que haga que la aplicación muestre productos no lanzados


Guía de NoSQLI

Antes de completar este laboratorio es recomendable leerse esta guía de NoSQLI https://justice-reaper.github.io/posts/NoSQLI-Guide/

Resolución

Al acceder a la web vemos esto

Si hacemos click sobre una categoría, la web nos redirige a https://0a54001f047c9ab1803bb2bf00d800cb.web-security-academy.net/filter?category=Gifts

Para buscar un syntax injection vamos a usar estos payloads:

1
2
3
'"`{
;$Foo}
$Foo \xYZ

Si los queremos todos en una línea se verían así:

1
'"`{\r;$Foo}\n$Foo \xYZ

Para determinar qué caracteres interpreta la aplicación como sintaxis, tenemos que inyectar caracteres uno por uno. Después de hacerlo, he visto que la barra invertida \ y la comilla simple ' son los únicos que provocan un error. Esto lo podemos ver accediendo a https://0ac100b804c954f18566cbf6003f001e.web-security-academy.net/filter?category=Gifts' y a https://0ac100b804c954f18566cbf6003f001e.web-security-academy.net/filter?category=Gifts\ desde el navegador. Si nos fijamos bien en el error, podemos ver que estamos ante un MongoDB, una base de datos no relacional que usa JavaScript como lenguaje

Para confirmar que la comilla simple ' ha roto la sintaxis de la consulta y ha causado un error de sintaxis vamos a escaparla usando la barra invertida \. Hay veces en las que tenemos que usar más de una barra invertida \. Para ello, accedemos a https://0ad8009b038bb638814020bc00880051.web-security-academy.net/filter?category=Lifestyle\' desde el navegador y vemos que ya no muestra el error. Esto puede significar que la web es vulnerable a un ataque de inyección

Después de detectar una vulnerabilidad, el siguiente paso es determinar si se pueden influir en las condiciones booleanas mediante la sintaxis NoSQL. Para probar esto, debemos enviar dos solicitudes, una con una condición falsa como ' && 0 && 'x y otra con una condición verdadera como ' && 1 && 'x. Primero vamos a probar con la condición falsa, para ello vamos a tener que urlencodear el payload. Vemos que no nos salen los tres productos que nos salían anteriormente al acceder a https://0ac100b804c954f18566cbf6003f001e.web-security-academy.net/filter?category=Gifts%27+%26%26+0+%26%26+%27x

Probamos con la condición verdadera, al acceder a https://0ac100b804c954f18566cbf6003f001e.web-security-academy.net/filter?category=Gifts%27+%26%26+1+%26%26+%27x vemos que sí salen los tres productos. Esto sugiere que la condición falsa afecta la lógica de la consulta, pero la condición verdadera no y, por lo tanto, confirmamos la existencia de una Syntax Injection

Ahora que hemos identificado que podemos influir en las condiciones booleanas, podemos intentar anular las condiciones existentes para aprovechar la vulnerabilidad. Por ejemplo, inyectando una condición de JavaScript que siempre se evalúe como verdadera, como '||1==1||'. Esto nos llevaría a https://0ac100b804c954f18566cbf6003f001e.web-security-academy.net/filter?category=Gifts%27||1==1||%27 y nos mostraría todos los productos existentes independientemente de la categoría

Esta entrada está licenciada bajo CC BY 4.0 por el autor.