Coders Conquer Security: Share & Learn Series - Inyección NoSQL

Publicado el 20 de diciembre de 2018
por Jaap Karan Singh
ESTUDIO DE CASO

Coders Conquer Security: Share & Learn Series - Inyección NoSQL

Publicado el 20 de diciembre de 2018
por Jaap Karan Singh
Ver recurso
Ver recurso

Las bases de datos NoSQL son cada vez más populares. Es difícil negar su velocidad y facilidad para tratar datos no estructurados, especialmente con equipos de desarrollo que trabajan con metodologías cada vez más ágiles.

Los desarrolladores tardan en eliminar las vulnerabilidades y otros problemas de la tecnología emergente. Sólo cuando se ha utilizado durante algún tiempo en aplicaciones de producción, los problemas empiezan a salir a la superficie.

Las bases de datos NoSQL son similares. Hay riesgos clave que los desarrolladores deben conocer para poder mantener sus aplicaciones seguras. Uno de estos riesgos es la inyección NoSQL.

Veamos qué es la inyección NoSQL, qué daños puede causar y cómo solucionarla:

Entender la inyección NoSQL

La inyección NoSQL es causada por muchas de las mismas vulnerabilidades de inyección como la inyección XML o SQL.

La inyección NoSQL permite a los atacantes colocar comandos arbitrarios en una consulta NoSQL. Esto les permite robar datos e incluso realizar cambios en la base de datos si sus privilegios son lo suficientemente altos.

Cuando una aplicación coloca datos controlados por el usuario directamente en una expresión de consulta NoSQL, estas expresiones a menudo toman funciones o tienen operadores incorporados que pueden ser manipulados para robar o cambiar datos. Y cuando algo así se ejecuta con intención maliciosa, las consecuencias pueden ser nefastas.

Las bases de datos MongoDB son uno de los terrenos de juego más populares para explotar esta vulnerabilidad. "$ne: ""'es el operador equivalente a 1=1 en el mundo SQL, por lo que, a modo de ejemplo, un atacante podría colocar los caracteres "$ne: ""' en los campos de nombre de usuario y contraseña de una interfaz de usuario. Si el código es vulnerable a la inyección NoSQL, la base de datos buscará todos los registros en los que el nombre de usuario y la contraseña no sean iguales a una cadena vacía. En otras palabras: todos. Vaya.

Si esta base de datos no está cifrada, el atacante podría robar los nombres de usuario y las contraseñas de cada uno de los usuarios que la componen. Esto incluye los nombres de usuario y las contraseñas de los administradores, dándoles un pase de acceso a toda la base de datos.

Los atacantes a menudo tratan de pasar valores que siempre son verdaderos. Otro ataque común es inyectar código malicioso en las propiedades que se establecen en las funciones.

Por ejemplo, MongoDB utiliza una función find que toma un objeto con una propiedad llamada $where. La propiedad $where se establece en una función que debe evaluarse como verdadera o falsa. Si esta función se modifica de alguna manera por la entrada del usuario, es probable que una inyección NoSQL esté al acecho.

Para conocer con detalle los entresijos de la inyección NoSQL, consulte este artículo de InfoQ.

Sepa por qué la inyección NoSQL es peligrosa

La inyección NoSQL es peligrosa sobre todo porque todavía no ha recibido el escrutinio de la comunidad de seguridad que merece.

Los impactos de la inyección NoSQL son muy parecidos a los de la inyección SQL tradicional. Los datos pueden ser robados o modificados, las cuentas pueden verse comprometidas por el robo de datos y, tal vez lo más cruel, los datos podrían ser completamente borrados si se emite con éxito un comando de borrado.

La conclusión es que MongoDB y otros motores de bases de datos NoSQL son vulnerables a los ataques. "No SQL" no significa que no haya inyecciones.
Afortunadamente, algunos miembros de la comunidad están tomando nota y corriendo la voz. Es necesario que más desarrolladores se eduquen para poder proteger sus aplicaciones de peligros poco conocidos que pueden convertirse en un gran dolor de cabeza si son explotados.

Derrotar la inyección NoSQL

La inyección NoSQL puede ser difícil de vencer. Por desgracia, no existe la opción de realizar consultas parametrizadas como ocurre con la inyección SQL. Sin embargo, no es imposible. Hay algunas opciones para ayudarte:

  • Los fuzzers pueden utilizarse como un método para detectar vulnerabilidades. Aunque, como ocurre con muchas cosas en la vida, el enfoque más sencillo puede ser el más eficaz. En este caso, la vieja revisión de código es tu mejor aliado.
  • Cuando revise el código, busque posibles lugares donde la entrada del usuario pueda establecer el valor de una expresión o cambiar una función. No permitas que la entrada del usuario cambie tus consultas.
  • Asegúrese de convertir la entrada del usuario a su clase correcta. Si es un número, cámbialo a un número, si es una cadena, cámbialo a una cadena y así sucesivamente.
  • Nunca utilice $where o funciones eval similares junto con la entrada del usuario. En la mayoría de los casos, se puede evitar cambiando el modelo de datos o el esquema.
  • Prueba a utilizar Mongoose como tu controlador de MongoDB. Mongoose le permite definir un esquema para su base de datos NoSQL. Si le dices a Mongoose que tus entradas son cadenas, se convertirán en cadenas. Así, cualquier objeto pasado por un atacante no será tratado como objeto, sino como cadena.
  • Endurezca su base de datos. Cree cuentas de usuario con pocos privilegios, maximice el tiempo de ejecución de las consultas y siga siempre las mejores prácticas de seguridad aplicables a su organización.

Una desventaja de la facilidad de uso de las bases de datos NoSQL es la tendencia de los desarrolladores a montarlas y empezar a utilizarlas sin pensar en la seguridad.

Es esencial que te tomes el tiempo necesario para aprender a levantar de forma segura una base de datos NoSQL y protegerte de las inyecciones NoSQL.

Por ejemplo, MongoDB Enterprise Edition tiene capacidades avanzadas de control de acceso para sus documentos. Aplicar el "mínimo privilegio" puede ser una buena estrategia de Defensa en Profundidad (DiD) en caso de que alguien encuentre una vulnerabilidad en tu aplicación.

En resumen, esto es lo que tenemos:

  • Sanear la entrada antes de utilizarla en una expresión de consulta NoSQL
  • Utiliza controladores que te ayuden, como Mongoose
  • Realización de revisiones de código que examinen específicamente cómo se utilizan los datos de entrada en las consultas
  • Utilice fuzzers y escáneres para tratar de ayudar a encontrar vulnerabilidades en su código.

NoSQL no es sin inyecciones

Las bases de datos NoSQL están ganando rápidamente popularidad debido a sus características de escalabilidad y a la velocidad de configuración. La novedad de la tecnología puede llevar a los desarrolladores a utilizar las bases de datos NoSQL sin pensar en cómo asegurarlas.

Las bases de datos NoSQL pueden ser tan vulnerables como las bases de datos SQL a los ataques de inyección, así que actúa con precaución y presta atención a tus consultas. Si quieres saber más, echa un vistazo a nuestros recursos de aprendizaje o pon a prueba tus habilidades con nuestra demo gratuita.

Prepárese con antelación y no tendrá que preocuparse por las inyecciones NoSQL en sus aplicaciones. Demasiado fácil!

¿Crees que estás preparado para localizar, identificar y arreglar la inyección NoSQL ahora mismo? Entra en el terreno del código seguro, guerrero:

Y con esto terminamos el 2018! Este será nuestro último post del año, pero volveremos con la próxima guía de Coders Conquer Security el 10 de enero de 2019. Nos vemos pronto!

Ver recurso
Ver recurso

Autor

Jaap Karan Singh

¿Quieres más?

Sumérjase en nuestras últimas ideas sobre codificación segura en el blog.

Nuestra amplia biblioteca de recursos tiene como objetivo potenciar el enfoque humano de la mejora de la codificación segura.

Ver blog
¿Quieres más?

Obtenga las últimas investigaciones sobre la seguridad impulsada por los desarrolladores

Nuestra amplia biblioteca de recursos está repleta de recursos útiles, desde libros blancos hasta seminarios web, que le ayudarán a iniciarse en la codificación segura orientada a los desarrolladores. Explórela ahora.

Centro de recursos

Coders Conquer Security: Share & Learn Series - Inyección NoSQL

Publicado el 20 de diciembre de 2018
Por Jaap Karan Singh

Las bases de datos NoSQL son cada vez más populares. Es difícil negar su velocidad y facilidad para tratar datos no estructurados, especialmente con equipos de desarrollo que trabajan con metodologías cada vez más ágiles.

Los desarrolladores tardan en eliminar las vulnerabilidades y otros problemas de la tecnología emergente. Sólo cuando se ha utilizado durante algún tiempo en aplicaciones de producción, los problemas empiezan a salir a la superficie.

Las bases de datos NoSQL son similares. Hay riesgos clave que los desarrolladores deben conocer para poder mantener sus aplicaciones seguras. Uno de estos riesgos es la inyección NoSQL.

Veamos qué es la inyección NoSQL, qué daños puede causar y cómo solucionarla:

Entender la inyección NoSQL

La inyección NoSQL es causada por muchas de las mismas vulnerabilidades de inyección como la inyección XML o SQL.

La inyección NoSQL permite a los atacantes colocar comandos arbitrarios en una consulta NoSQL. Esto les permite robar datos e incluso realizar cambios en la base de datos si sus privilegios son lo suficientemente altos.

Cuando una aplicación coloca datos controlados por el usuario directamente en una expresión de consulta NoSQL, estas expresiones a menudo toman funciones o tienen operadores incorporados que pueden ser manipulados para robar o cambiar datos. Y cuando algo así se ejecuta con intención maliciosa, las consecuencias pueden ser nefastas.

Las bases de datos MongoDB son uno de los terrenos de juego más populares para explotar esta vulnerabilidad. "$ne: ""'es el operador equivalente a 1=1 en el mundo SQL, por lo que, a modo de ejemplo, un atacante podría colocar los caracteres "$ne: ""' en los campos de nombre de usuario y contraseña de una interfaz de usuario. Si el código es vulnerable a la inyección NoSQL, la base de datos buscará todos los registros en los que el nombre de usuario y la contraseña no sean iguales a una cadena vacía. En otras palabras: todos. Vaya.

Si esta base de datos no está cifrada, el atacante podría robar los nombres de usuario y las contraseñas de cada uno de los usuarios que la componen. Esto incluye los nombres de usuario y las contraseñas de los administradores, dándoles un pase de acceso a toda la base de datos.

Los atacantes a menudo tratan de pasar valores que siempre son verdaderos. Otro ataque común es inyectar código malicioso en las propiedades que se establecen en las funciones.

Por ejemplo, MongoDB utiliza una función find que toma un objeto con una propiedad llamada $where. La propiedad $where se establece en una función que debe evaluarse como verdadera o falsa. Si esta función se modifica de alguna manera por la entrada del usuario, es probable que una inyección NoSQL esté al acecho.

Para conocer con detalle los entresijos de la inyección NoSQL, consulte este artículo de InfoQ.

Sepa por qué la inyección NoSQL es peligrosa

La inyección NoSQL es peligrosa sobre todo porque todavía no ha recibido el escrutinio de la comunidad de seguridad que merece.

Los impactos de la inyección NoSQL son muy parecidos a los de la inyección SQL tradicional. Los datos pueden ser robados o modificados, las cuentas pueden verse comprometidas por el robo de datos y, tal vez lo más cruel, los datos podrían ser completamente borrados si se emite con éxito un comando de borrado.

La conclusión es que MongoDB y otros motores de bases de datos NoSQL son vulnerables a los ataques. "No SQL" no significa que no haya inyecciones.
Afortunadamente, algunos miembros de la comunidad están tomando nota y corriendo la voz. Es necesario que más desarrolladores se eduquen para poder proteger sus aplicaciones de peligros poco conocidos que pueden convertirse en un gran dolor de cabeza si son explotados.

Derrotar la inyección NoSQL

La inyección NoSQL puede ser difícil de vencer. Por desgracia, no existe la opción de realizar consultas parametrizadas como ocurre con la inyección SQL. Sin embargo, no es imposible. Hay algunas opciones para ayudarte:

  • Los fuzzers pueden utilizarse como un método para detectar vulnerabilidades. Aunque, como ocurre con muchas cosas en la vida, el enfoque más sencillo puede ser el más eficaz. En este caso, la vieja revisión de código es tu mejor aliado.
  • Cuando revise el código, busque posibles lugares donde la entrada del usuario pueda establecer el valor de una expresión o cambiar una función. No permitas que la entrada del usuario cambie tus consultas.
  • Asegúrese de convertir la entrada del usuario a su clase correcta. Si es un número, cámbialo a un número, si es una cadena, cámbialo a una cadena y así sucesivamente.
  • Nunca utilice $where o funciones eval similares junto con la entrada del usuario. En la mayoría de los casos, se puede evitar cambiando el modelo de datos o el esquema.
  • Prueba a utilizar Mongoose como tu controlador de MongoDB. Mongoose le permite definir un esquema para su base de datos NoSQL. Si le dices a Mongoose que tus entradas son cadenas, se convertirán en cadenas. Así, cualquier objeto pasado por un atacante no será tratado como objeto, sino como cadena.
  • Endurezca su base de datos. Cree cuentas de usuario con pocos privilegios, maximice el tiempo de ejecución de las consultas y siga siempre las mejores prácticas de seguridad aplicables a su organización.

Una desventaja de la facilidad de uso de las bases de datos NoSQL es la tendencia de los desarrolladores a montarlas y empezar a utilizarlas sin pensar en la seguridad.

Es esencial que te tomes el tiempo necesario para aprender a levantar de forma segura una base de datos NoSQL y protegerte de las inyecciones NoSQL.

Por ejemplo, MongoDB Enterprise Edition tiene capacidades avanzadas de control de acceso para sus documentos. Aplicar el "mínimo privilegio" puede ser una buena estrategia de Defensa en Profundidad (DiD) en caso de que alguien encuentre una vulnerabilidad en tu aplicación.

En resumen, esto es lo que tenemos:

  • Sanear la entrada antes de utilizarla en una expresión de consulta NoSQL
  • Utiliza controladores que te ayuden, como Mongoose
  • Realización de revisiones de código que examinen específicamente cómo se utilizan los datos de entrada en las consultas
  • Utilice fuzzers y escáneres para tratar de ayudar a encontrar vulnerabilidades en su código.

NoSQL no es sin inyecciones

Las bases de datos NoSQL están ganando rápidamente popularidad debido a sus características de escalabilidad y a la velocidad de configuración. La novedad de la tecnología puede llevar a los desarrolladores a utilizar las bases de datos NoSQL sin pensar en cómo asegurarlas.

Las bases de datos NoSQL pueden ser tan vulnerables como las bases de datos SQL a los ataques de inyección, así que actúa con precaución y presta atención a tus consultas. Si quieres saber más, echa un vistazo a nuestros recursos de aprendizaje o pon a prueba tus habilidades con nuestra demo gratuita.

Prepárese con antelación y no tendrá que preocuparse por las inyecciones NoSQL en sus aplicaciones. Demasiado fácil!

¿Crees que estás preparado para localizar, identificar y arreglar la inyección NoSQL ahora mismo? Entra en el terreno del código seguro, guerrero:

Y con esto terminamos el 2018! Este será nuestro último post del año, pero volveremos con la próxima guía de Coders Conquer Security el 10 de enero de 2019. Nos vemos pronto!

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.