Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 2023-2024
Contenido
Introducción .................................................................................................................................. 2
Instalación de node.js.................................................................................................................... 4
Instalación de MongoDB ............................................................................................................... 4
Instalación y configuración del IDE ............................................................................................... 8
Inicialización del proyecto ............................................................................................................. 8
Primera prueba de node.js ............................................................................................................ 9
Instalación de módulos con NPM................................................................................................ 11
Creación y prueba del API REST .................................................................................................. 13
API REST con MongoDB............................................................................................................... 15
Establecer el modelo ............................................................................................................... 15
POST: altas en el API REST ....................................................................................................... 15
GET: Consultas al API REST ...................................................................................................... 21
PUT: modificaciones API REST ................................................................................................. 22
DELETE: eliminación API REST ................................................................................................. 23
Inyecciones NoSQL .................................................................................................................. 24
Página 1 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Introducción
En esta práctica crearemos un API REST en la cual simularemos dispositivos IoT por los que se
puede acceder a sus servicios a través de peticiones HTTP como POST, GET, PUT y DELETE que
devolverán la información en formato JSON. Para ello crearemos un servidor en node.js en el
cual instalaremos módulos para programar el API REST y almacenaremos los datos en MongoDB,
una base de datos NoSQL.
Finalmente veremos cómo se puede realizar un ataque de inyección NoSQL para obtener
información reservada y medidas para evitar este tipo de ataques.
El API REST que desarrollaremos proporcionará diferentes servicios según las rutas a las que se
acceda por ejemplo “http:localhost/devices” o “http:localhost/devices/temperature ” (donde
“temperature” es el tipo ‘type’ del dispositivo) y estos servicios serán diferente servicio según
el tipo de petición HTTP, es decir GET, POST, PUT o DELETE
Página 2 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
De tal manera que nuestro API REST ofrecerá los siguientes servicios:
Petición
Ruta Descripción
HTTP
/devices GET Mensaje de que el API REST funciona
Página 3 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Instalación de MongoDB
Desde la página oficial de MongoDB https://www.mongodb.com/download-center/community
en versión elegimos la 7.0.3, durante la instalación seleccionamos la opción “complete”.
Página 4 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Desactivamos que instale mongo como servicio, para no tener siempre el servicio de mongo
activo cuando se inicia el equipo,
Página 5 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Una vez terminada la instalación creamos las variables de entorno para utilizar MongoDB desde
la línea de comandos para ello vamos a propiedades del sistema variables del entorno.
Página 6 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
cd C:\
md "\data\db"
Página 7 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
mongod --version
En primer lugar, crearemos una carpeta que llamaremos “APIrest” dentro del directorio
“documentos” donde realizaremos nuestro proyecto
Como entorno de desarrollo utilizaremos el editor “Visual Studio Code” que se puede descargar
desde su página oficial https://code.visualstudio.com/ es un editor de texto ligero que
pertenece a la familia de editores livianos y modernos como Atom, Brackets y sublime text que
se adapta a nuestras necesidades a través de la utilización de extensiones
npm init
Esto nos da un asistente para la configuración del proyecto que se guarda en el fichero
package.json, como se muestra a continuación:
Página 8 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
En esta primera prueba utilizaremos el módulo ‘http’ propio de node.js y empezaremos a utilizar
funciones callback.
Página 9 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Los callbacks son funciones que reciben como parámetro otras funciones, se utilizan para
programar de manera asíncrona y orientada a eventos, es decir, cuando ocurre un evento se
utiliza el callback que trata los parámetros de ese evento. En el caso de este primer en ejemplo
“http.createServer” el parámetro es una función de callback que recibe el objeto del request
‘req’ y la respuesta ‘res‘ que devolveremos al navegador. En esta función de callback podemos
hacer cualquier procesamiento necesario para generar una respuesta, la cual deberá ser cargada
sobre el objeto res.
var http = require('http');
var puerto = 9000;
var host='127.0.0.1';
//como parametro de crate server hay un callback con dos argumentos,
pregunta/ respuesta
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
// en req.url viene la ruta que se esta solicitando
res.end('Servidor node funcionando en ' + host + ':' + puerto + req.url
+ '\n');
}).listen(puerto, host, function(){
//mostrar por consola que el servidor esta corriendo
console.log('Servidor node corriendo en ' + host + ':' + puerto);
});
Para ejecutar el servidor desde la ruta donde se encuentra server.js ejecutamos el comando
node server.js
Con esto probamos un sencillo servidor en node.js utilizando el módulo propio de node.js “http”
Página 10 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Con el parámetro --save-dev para la instalación de módulos útiles solo para el entorno de
desarrollo
Al añadir las dependencias en el documento package.json hace más portable el proyecto, por
ejemplo, así no es necesario subir a un repositorio todos ficheros del directorio “node_modules”
ya que los módulos se instalan simplemente utilizando npm install desde la ruta del proyecto.
Página 11 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
También hay que tener consideraciones de seguridad a la hora de instalar los paquetes NPM ya
que existen paquetes fraudulentos que utilizan la técnica denominada ‘typo-squatting’ que
consiste en nombrar al paquete fraudulento con un nombre ligeramente similar al nombre de
un paquete real. Se busca engañar al usuario para su instalación e infección.
Algunos de los paquetes detectados son
• babelcli
• cross-env.js
• crossenv
• d3.js
• fabric-js
• ffmepg
• gruntcli
• http-proxy.js
• jquery.js
• mariadb
• mongose
• mssql-node
• mssql.js
• mysqljs
• node-fabric
• node-opencv
• node-opensl
• node-openssl
• node-sqlite
• node-tkinter
fuente: https://blog.npmjs.org/post/163723642530/crossenv-malware-on-the-npm-registry
Página 12 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Una vez cambiado el código es necesario parar el servidor node.js con el ejemplo anterior con
el comando ‘ctrl+c’ y volver a iniciar el servidor con “node server.js”
Página 13 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
También podemos consultar las cabeceras, pulsando la pestaña “headers”, que nos da
información relevante sobre la conexión y el API REST, como puede ser el tipo de acceso o con
que esta creado, en este caso Express
Página 14 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Establecer el modelo
En este paso nos conectaremos a una base de datos MongoDB en la cual a través del API REST
realizaremos altas bajas y modificaciones
Instalamos el módulo mongoose que utilizaremos para modelar (definir que estructura tendrán
los datos) y conectarnos a la base de datos MongoDB
Como datos almacenaremos información que simulará dispositivos IoT por lo tanto
establecemos que estructura de los datos recibidos por estos dispositivos
Creamos el modelo para la colección devices (donde se almacenarán los dispositivos) para ello
en el directorio de nuestro proyecto “APIrest” creamos la carpeta “models” y dentro de ella el
fichero JavaScript device.js. En este fichero escribimos el código del esquema o estructura de la
colección devices.
Una vez creado el modelo se exporta como un módulo de node.js es muy importante tener en
cuenta que el nombre del modelo tiene que ser el nombre de la colección en singular
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// definimos el esquema de nuestro modelo de datos
var DeviceSchema = new Schema({
type: String,
name: String,
description: String,
unit: String,
value: Number
});
// importante nombre de la colección en SINGULAR
module.exports = mongoose.model('device', DeviceSchema);
A continuación añadimos POST en la ruta “ /devices” para dar de alta un nuevo dispositivo, que
toma los datos de “req.body” es decir lo enviado por post y lo almacena en la colección “devices”
Página 15 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 16 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Primero es necesario iniciar la base de datos de MongoDB para ello ejecutamos desde un
terminal nuevo ejecutamos el comando
mongod
Desde otro terminal o el que teníamos abierto del ejemplo anterior, paramos la ejecución del
servidor anterior, y volvemos a iniciar este con
node server.js
Se añaden los diferentes datos del nuevo dispositivo a añadir como clave/valor, por ejemplo:
type: temperature
unit: Celsius
value: 0
Página 17 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Una vez realizado el alta se verá por la consola de node.js el json enviado en “req.body”
Página 18 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
La base de datos se puede consultar a través de la terminal para ello es necesario descargar la
herramienta del siguiente enlace
https://www.mongodb.com/try/download/shell
copiar los dos ficheros de la carpeta “bin” en la capreta “bin” del directorio de instalación de
mongodb tipo “C:\Program Files\MongoDB\Server\7.0\bin”
Desde otro terminal ejecutamos los siguientes pasos (sin importar el directorio donde nos
encontremos)
mongosh
show dbs
use demoAPIREST
show collections
db.devices.find().pretty()
Página 19 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Type: humidity
unit: %
value: 0
Página 20 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 21 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 22 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 23 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Inyecciones NoSQL
Las bases de datos NoSQL tienen menos restricciones de coherencia y son más flexibles que las
relacionales, pero sin embargo esto ocasiona vulnerabilidades pudiendo ser posible realizar
consultas maliciosas que dejen ver información privada, o dar como afirmativo el acceso a un
login.
Vamos a añadir el código para poder realizar búsquedas por una petición post, ya que puede
surgir por requerimientos en el desarrollo de una aplicación. Para ello añadimos este apartado
en el código de server.js
//peticion post para buscar dispositivos
app.post('/devices/find', async (req, res) => {
try {
console.log(JSON.stringify(req.body, null, 2));
// Realiza la búsqueda con un filtro, por ejemplo, {"type":
"temperature"}
const devices = await Device.find(req.body).exec();
res.json(devices);
} catch (err) {
res.status(500).json({
msg: 'Error al buscar dispositivos',
error: err
});
}
});
Se va a realizar un ataque de inyección NoSQL anidando una consulta en este caso {"$gt": ""}
esta consulta devuelve todos los resultados en los que el tipo de dispositivo sea mayor que “” lo
que resulta verdadero y devuelve todos los datos en “Postman” se realiza de la siguiente
manera:
Página 24 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
"type": {"$gt":""}
Con esta inyección podemos ver todos los elementos de una colección, no solo los de las
consultas pudiendo de esta manera acceder a información que podría ser privada de otro
usuario.
Página 25 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 26 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Página 27 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Crear routes
var express = require('express');
var router = express.Router();
res.json({
msg: 'el API REST funciona!'
});
});
module.exports = router;
Página 28 de 29
Internet de las Cosas (IoT), Ciberseguridad y Aplicaciones. Curso 2023-2024
Crear controllers
app.delete('/devices/:type', deviceControllers.deleteDevice);
Página 29 de 29