JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Bases de datos NoSQL
  • Modelos de base de datos de NoSQL
  • Tipos de inyección NoSQL
  • NoSQL de sintaxis inyectable
  • NoSQL operador inyectable
  • Explotando la inyección de sintaxis para extraer datos
  • Explotando la inyección del operador NoSQL para extraer datos
  • Inyección a base de tiempo
  • Prevención de la inyección de NoSQL
  1. PortSwigger WebAcademy
  2. Server Side Topics

No-SQL Injection

La inyección de NoSQL es una vulnerabilidad cuando un atacante es capaz de interferir con las consultas que una aplicación hace a una base de datos NoSQL.

PreviousLaboratorio: Exploiting time-sensitive vulnerabilitiesNextLaboratorio: Detecting NoSQL injection

Last updated 2 months ago

La inyección de NoSQL puede permitir a un atacante:

  • Mecanismos de autenticación o protección.

  • Extrae o edite datos.

  • Porque una denegación de servicio.

  • ejecutar código en el servidor.

Las bases de datos de NoSQL almacenan y recuperan datos en un formato que no sean tablas relacionales tradicionales de SQL. Utilizan una amplia gama de lenguajes de consulta en lugar de un estándar universal como SQL, y tienen menos limitaciones relacionales.

  • Almacenan la información en un formato clave:valor y tipo JSON, almacenes de documentos,


Bases de datos NoSQL

Las bases de datos de NoSQL almacenan y recuperan datos en un formato que no sean tablas relacionales tradicionales de SQL. Están diseñados para manejar grandes volúmenes de datos no estructurados o semiestructurados. Como tales, normalmente tienen menos restricciones relacionales y controles de consistencia que SQL, y reclaman beneficios significativos en términos de escalabilidad, flexibilidad y rendimiento.

Al igual que las bases de datos SQL, los usuarios interactúan con los datos en las bases de datos de NoSQL utilizando consultas que son pasadas por la aplicación a la base de datos. Sin embargo, diferentes bases de datos de NoSQL utilizan una amplia gama de lenguajes de consulta en lugar de un estándar universal como SQL (Structured Consulta Language). Este puede ser un lenguaje de consulta personalizado o un lenguaje común como XML o JSON.

Modelos de base de datos de NoSQL

Hay una amplia variedad de bases de datos NoSQL. Con el fin de detectar vulnerabilidades en una base de datos NoSQL, ayuda a entender el marco del modelo y el lenguaje.

Algunos tipos comunes de bases de datos NoSQL incluyen:

  • Almacenes de documentos - Estos almacenan datos en documentos flexibles y semiestructurados. Normalmente usan formatos como JSON, BSON y XML, y se consultan en una API o lenguaje de consulta. Ejemplos incluyen MongoDB y Couchbase.

  • Tiendas de valor clave - Estos almacenan datos en un formato de valor clave. Cada campo de datos está asociado con una cadena de clave única. Los valores se recuperan en función de la clave única. Ejemplos incluyen Redis y Amazon DynamoDB.

  • Tiendas de columna ancha - Estos organizan datos relacionados en familias de columnas flexibles en lugar de filas tradicionales. Ejemplos incluyen Apache Cassandra y Apache HBase.

  • Bases de datos de gráficos - Estos utilizan nodos para almacenar entidades de datos, y bordes para almacenar las relaciones entre entidades. Ejemplos incluyen Neo4j y Amazon Neptune.

Tipos de inyección NoSQL

Hay dos tipos diferentes de inyección NoSQL:

  • Inyección de sintaxis - Esto ocurre cuando se puede romper la sintaxis de la consulta NoSQL, lo que le permite inyectar su propia carga. La metodología es similar a la utilizada en la inyección de SQL. Sin embargo, la naturaleza del ataque varía significativamente, ya que las bases de datos de NoSQL utilizan una gama de lenguajes de consulta, tipos de sintaxis de consulta y diferentes estructuras de datos.

  • Inyección del operador - Esto ocurre cuando se puede utilizar operadores de consultas NoSQL para manipular las consultas.

En este tema, vamos a ver cómo probar las vulnerabilidades de NoSQL en general, y luego nos centraremos en explotar vulnerabilidades en MongoDB, que es la base de datos NoSQL más popular. También hemos proporcionado algunos laboratorios para que puedas practicar lo que has aprendido.

NoSQL de sintaxis inyectable

Puede detectar potencialmente vulnerabilidades de inyección de NoSQL al intentar romper la sintaxis de consulta. Para ello, pruebe sistemáticamente cada entrada enviando cadenas de fuzz y caracteres especiales que desencadenen un error de base de datos o algún otro comportamiento detectable si no están adecuadamente desinfectados o filtrados por la aplicación.

Si conoce el lenguaje API de la base de datos de destino, utilice caracteres especiales y cadenas fuzz que sean relevantes para ese idioma. De lo contrario, utilice una variedad de cadenas de fuzz para apuntar a varios idiomas de la API.

Detectar la inyección de sintaxis en MongoDB

Considere una aplicación de compra que muestra productos en diferentes categorías. Cuando el usuario selecciona la categoría de bebidas Fizzy, su navegador solicita la siguiente URL:

<https://insecure-website.com/product/lookup?category=fizzy>

Esto hace que la solicitud envíe una consulta JSON para recuperar productos relevantes de la productla recopilación en la base de datos MongoDB:

this.category == 'fizzy'

Para comprobar si la entrada puede ser vulnerable, envíe una cadena de pequete en el valor de la categoryparámetro. Una cuerda de ejemplo para MongoDB es:

'"`{
;$Foo}
$Foo \\xYZ

Utile esta cuerda de fuzz para construir el siguiente ataque:

<https://insecure-website.com/product/lookup?category=>'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00

Si esto causa un cambio de la respuesta original, esto puede indicar que la entrada del usuario no se filtra o se desinfecta correctamente.

Nota

Las vulnerabilidades de inyección de NoSQL pueden ocurrir en una variedad de contextos, y necesita adaptar sus cadenas de fuzz en consecuencia. De lo contrario, puede simplemente desencadenar errores de validación que significan que la aplicación nunca ejecuta su consulta.

En este ejemplo, estamos inyectando la cadena de peluche a través de la URL, por lo que la cadena está codificada URL. En algunas aplicaciones, es posible que necesite inyectar su carga útil a través de una propiedad JSON en su lugar. En este caso, esta carga útil se convertiría en '\\"{\r;$Foo}\n$Foo \\xYZ\u0000`

Determinación de qué caracteres se procesan

Para determinar qué caracteres se interpretan como sintaxis por la aplicación, puede inyectar caracteres individuales. Por ejemplo, podrías presentarte. ', que resulta en la siguiente consulta de MongoDB:

this.category == '''

Si esto causa un cambio con respecto a la respuesta original, esto puede indicar que la 'El carácter ha roto la sintaxis de la consulta y ha causado un error de sintaxis. Puede confirmarlo mediante la presentación de una cadena de consulta válida en la entrada, por ejemplo, escapando de la cita:

this.category == '\\''

Si esto no causa un error de sintaxis, esto puede significar que la aplicación es vulnerable a un ataque de inyección.

Confirmando conducta condicional

Después de detectar una vulnerabilidad, el siguiente paso es determinar si puede influir en las condiciones boolenas usando sintaxis NoSQL.

Para probarlo, envíe dos solicitudes, una con una condición falsa y otra con una condición verdadera. Por ejemplo, podría utilizar las declaraciones condicionales ' && 0 && 'xy ' && 1 && 'xcomo sigue:

<https://insecure-website.com/product/lookup?category=fizzy'+%26%26+0+%26%26+'x>
<https://insecure-website.com/product/lookup?category=fizzy'+%26%26+1+%26%26+'x>

Si la aplicación se comporta de manera diferente, esto sugiere que la condición falsa impacta la lógica de la consulta, pero la condición verdadera no. Esto indica que inyectar este estilo de sintaxis afecta a una consulta del lado del servidor.

Exima de las condiciones existentes

Ahora que ha identificado que puede influir en las condiciones boolenas, puede intentar anular las condiciones existentes para explotar la vulnerabilidad. Por ejemplo, puede inyectar una condición JavaScript que siempre se evalúa a la verdad, como '||'1'=='1:

<https://insecure-website.com/product/lookup?category=fizzy%27%7c%7c%27%31%27%3d%3d%27%31>

Esto da como resultado la siguiente consulta de MongoDB:

this.category == 'fizzy'||'1'=='1'

Como la condición inyectada es siempre cierta, la consulta modificada devuelve todos los elementos. Esto le permite ver todos los productos en cualquier categoría, incluyendo categorías ocultas o desconocidas.

Advertencia

Tenga cuidado al inyectar una condición que siempre se evalúa a true en una consulta de NoSQL. Aunque esto puede ser inofenable en el contexto inicial en el que se está inyectando, es común que las aplicaciones usen datos de una sola solicitud en múltiples consultas diferentes. Si una aplicación lo utiliza al actualizar o eliminar datos, por ejemplo, esto puede resultar en pérdida accidental de datos.



También podría añadir un carácter nulo después del valor de categoría. MongoDB puede ignorar todos los caracteres después de un carácter nulo. Esto significa que cualquier condición adicional en la consulta de MongoDB es ignorada. Por ejemplo, la consulta puede tener un this.released restricción:

this.category == 'fizzy' && this.released == 1

La restricción this.released == 1se utiliza sólo para mostrar los productos que se liberan. Para productos inéditos, presumiblemente this.released == 0.

En este caso, un atacante podría construir un ataque de la siguiente manera:

<https://insecure-website.com/product/lookup?category=fizzy>'%00

Esto da como resultado la siguiente consulta de NoSQL:

this.category == 'fizzy'\\u0000' && this.released == 1

Si MongoDB ignora todos los caracteres después del carácter nulo, esto elimina el requisito de que el campo liberado se establezca en 1. Como resultado, todos los productos en el fizzyla categoría se muestra, incluyendo productos inéditos.

NoSQL operador inyectable

Las bases de datos de NoSQL suelen utilizar operadores de consultas, que proporcionan formas de especificar las condiciones que los datos deben reunirse para ser incluidos en el resultado de la consulta. Ejemplos de operadores de consultas de MongoDB incluyen:

  • $whereCoincide con documentos que satisfacen una expresión de JavaScript.

  • $neCoincide con todos los valores que no son iguales a un valor especificado.

  • $inCoincide con todos los valores especificados en un array.

  • $regexSelecciona los documentos en los que los valores coinciden con una expresión regular especificada.

Es posible que pueda inyectar a los operadores de consultas para manipular las consultas de NoSQL. Para ello, envíe sistemáticamente a diferentes operadores en una gama de entradas de usuario, luego revise las respuestas para mensajes de error u otros cambios.

Presentación de operadores de consultas

En los mensajes JSON, puede insertar a los operadores de consultas como objetos anidados. Por ejemplo, {"username":"wiener"}se convierte {"username":{"$ne":"invalid"}}.

Para entradas basadas en URL, puede insertar operadores de consulta a través de parámetros de URL. Por ejemplo, username=wienerse convierte username[$ne]=invalid. Si esto no funciona, puedes probar lo siguiente:

  1. Convertir el método de solicitud de GETa POST.

  2. Cambiar el Content-Typecabeza de a application/json.

  3. Añadir JSON al cuerpo del mensaje.

  4. Inyectar operadores de consulta en el JSON.

Detectando la inyección del operador en MongoDB

Considere una aplicación vulnerable que acepta un nombre de usuario y contraseña en el cuerpo de un POSTpetición:

{"username":"wiener","password":"peter"}

Pruebe cada entrada con una gama de operadores. Por ejemplo, para probar si la entrada de nombre de usuario procesa el operador de consulta, podría probar la siguiente inyección:

{"username":{"$ne":"invalid"},"password":"peter"}

Si el $neoperador se aplica, esto consulta a todos los usuarios donde el nombre de usuario no es igual a invalid.

Si tanto el nombre de usuario como las entradas de contraseña procesan al operador, puede ser posible eludir la autenticación utilizando la siguiente carga útil:

{"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}}

Esta consulta devuelve todas las credenciales de inicio de sesión donde tanto el nombre de usuario como la contraseña no son iguales a invalid. Como resultado, estás conectado a la aplicación como el primer usuario de la colección.

Para apuntar a una cuenta, puedes construir una carga útil que incluye un nombre de usuario conocido, o un nombre de usuario que has adivinado. Por ejemplo:

{"username":{"$in":["admin","administrator","superadmin"]},"password":{"$ne":""}}
{"username": {"$regex":"admin*"}, "password": {"$ne": null}}
{"username": {"$regex":"admin*"}, "password": {"$ne": "bicitetas23"}}
"ne" es not equal. 

in DATA
username[$ne]=toto&password[$ne]=toto
login[$regex]=a.*&pass[$ne]=lol
login[$gt]=admin&login[$lt]=test&pass[$ne]=1
login[$nin][]=admin&login[$nin][]=test&pass[$ne]=toto

in JSON
{"username": {"$ne": null}, "password": {"$ne": null}}
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"}}
{"username": {"$gt": undefined}, "password": {"$gt": undefined}}
{"username": {"$gt":""}, "password": {"$gt":""}}


Explotando la inyección de sintaxis para extraer datos

En muchas bases de datos de NoSQL, algunos operadores o funciones de consulta pueden ejecutar código JavaScript limitado, como MongoDB's $whereoperador y mapReduce()función. Esto significa que, si una aplicación vulnerable utiliza estos operadores o funciones, la base de datos puede evaluar el JavaScript como parte de la consulta. Por lo tanto, puede utilizar las funciones de JavaScript para extraer datos de la base de datos.

Exfiltrando datos en MongoDB

Considere una aplicación vulnerable que permita a los usuarios buscar otros nombres de usuario registrados y muestra su rol. Esto desencadena una petición a la URL:

<https://insecure-website.com/user/lookup?username=admin>

Esto da como resultado la siguiente consulta NoSQL de la userscolección:

{"$where":"this.username == 'admin'"}

Como la consulta utiliza el $whereoperador, puede intentar inyectar funciones JavaScript en esta consulta para que devuelve datos sensibles. Por ejemplo, podría enviar la siguiente carga útil:

admin' && this.password[0] == 'a' || 'a'=='b

Esto devuelve el primer carácter de la cadena de contraseñas del usuario, lo que le permite extraer el carácter de contraseña por carácter.

También podrías usar el JavaScript match()función para extraer información. Por ejemplo, la siguiente carga útil le permite identificar si la contraseña contiene dígitos:

admin' && this.password.match(/\d/) || 'a'=='b


Pendiente intalar Content-Type converter en Burp.

Identificar nombres de campo

Debido a que MongoDB maneja datos semiestructurados que no requieren un esquema fijo, es posible que necesite identificar campos válidos en la colección antes de poder extraer datos usando la inyección de JavaScript.

Por ejemplo, para identificar si la base de datos MongoDB contiene una passwordcampo, usted podría enviar la siguiente carga útil:

<https://insecure-website.com/user/lookup?username=admin'+%26%26+this.password!%3d'>

Envíe la carga útil de nuevo para un campo existente y para un campo que no existe. En este ejemplo, usted sabe que el usernameel campo existe, por lo que podría enviar las siguientes cargas útiles:

admin' && this.username!='
admin' && this.foo!='

Si el passwordcampo existe, usted esperaría que la respuesta fuera idéntica a la respuesta para el campo existente (username), pero diferente a la respuesta para el campo que no existe (foo).

Si desea probar diferentes nombres de campo, podría realizar un ataque de diccionario, usando una lista de palabras para recorrer diferentes nombres de campo potenciales.

Alternativamente, puede utilizar la inyección de operador de NoSQL para extraer el carácter de nombres de campo por carácter. Esto le permite identificar nombres de campo sin tener que adivinar o realizar un ataque de diccionario. Te enseñaremos cómo hacer esto en la siguiente sección.

Explotando la inyección del operador NoSQL para extraer datos

Incluso si la consulta original no utiliza ningún operador que le permita ejecutar JavaScript arbitrario, es posible que pueda inyectarse a uno de estos operadores usted mismo. A continuación, puede utilizar las condiciones boolenas para determinar si la aplicación ejecuta algún JavaScript que se inyecta a través de este operador.

Inyectan a operadores en MongoDB

Considere una aplicación vulnerable que acepta nombre de usuario y contraseña en el cuerpo de un POSTpetición:

{"username":"wiener","password":"peter"}

Para comprobar si puede inyectar operadores, podría intentar añadir el $whereoperador como parámetro adicional, luego envíe una solicitud donde la condición se evalúa a falso, y otro que se evalúe a true. Por ejemplo:

{"username":"wiener","password":"peter", "$where":"0"}
{"username":"wiener","password":"peter", "$where":"1"}

Si hay una diferencia entre las respuestas, esto puede indicar que la expresión JavaScript en el $wherese está evaluando la cláusula.

Extraer nombres de campo

Si ha inyectado un operador que le permite ejecutar JavaScript, es posible que pueda utilizar el keys()método para extraer el nombre de los campos de datos. Por ejemplo, podría presentar la siguiente carga útil:

"$where":"Object.keys(this)[0].match('^.{0}a.*')"

Esto inspecciona el primer campo de datos en el objeto de usuario y devuelve el primer carácter del nombre de campo. Esto le permite extraer el carácter de nombre de campo por carácter.



Exfiltración de datos utilizando operadores

Alternativamente, es posible que pueda extraer datos utilizando operadores que no le permiten ejecutar JavaScript. Por ejemplo, usted puede ser capaz de utilizar el $regexoperador para extraer el carácter de los datos por carácter.

Considere una aplicación vulnerable que acepta un nombre de usuario y contraseña en el cuerpo de un POSTpetición. Por ejemplo:

{"username":"myuser","password":"mypass"}

Podrías empezar probando si el $regexEl operador se transforma de la siguiente manera:

{"username":"admin","password":{"$regex":"^.*"}}

Si la respuesta a esta solicitud es diferente a la que recibe cuando envía una contraseña incorrecta, esto indica que la aplicación puede ser vulnerable. Puedes usar el $regexoperador para extraer el carácter de los datos por carácter. Por ejemplo, la siguiente carga útil comprueba si la contraseña comienza con un a:

{"username":"admin","password":{"$regex":"^a*"}}

Inyección a base de tiempo

A veces desencadenar un error de base de datos no causa una diferencia en la respuesta de la aplicación. En esta situación, usted todavía puede ser capaz de detectar y explotar la vulnerabilidad mediante el uso de la inyección JavaScript para desencadenar un retraso condicional del tiempo.

Para llevar a cabo la inyección de NoSQL basada en el tiempo:

  1. Cargar la página varias veces para determinar un tiempo de carga basal.

  2. Inserte una carga útil basada en el tiempo en la entrada. Una carga útil basada en el tiempo causa un retraso intencional en la respuesta cuando Ejecado. Por ejemplo, {"$where": "sleep(5000)"}causa un retraso intencional de 5000 ms en la inyección exitosa.

  3. Identificar si la respuesta se carga más lentamente. Esto indica una inyección exitosa.

Las siguientes cargas útiles basadas en el tiempo desencadenarán un retraso de tiempo si los seres de contraseña con la letra a:

admin'+function(x){var waitTill = new Date(new Date().getTime() + 5000);while((x.password[0]==="a") && waitTill > new Date()){};}(this)+'admin'+function(x){if(x.password[0]==="a"){sleep(5000)};}(this)+'

Prevención de la inyección de NoSQL

La forma adecuada de prevenir los ataques de inyección de NoSQL depende de la tecnología específica NoSQL en uso. Como tal, recomendamos leer la documentación de seguridad para su base de datos de elección NoSQL. Dicho esto, las siguientes orientaciones generales también ayudarán:

  • Sanitar y validar la entrada del usuario, utilizando una lista de caracteres aceptados.

  • Inserte la entrada del usuario usando consultas parametrizadas en lugar de concatenar la entrada de usuario directamente en la consulta.

  • Para evitar la inyección del operador, aplique una lista de la permitida de las llaves aceptadas.

🪱Laboratorio: Detecting NoSQL injection
💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
🪖Laboratorio: Exploiting NoSQL injection to extract data
🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields