SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
Desarrollo seguro
en NodeJS
OWASP Top Ten y JWT
Raúl Requero García
Arquitecto FullStack y Formador en Boream
CTO en MrLooquer (https://mrlooquer.com)
Twitter: @rrequero
Linkedin: www.linkedin.com/in/requerogarciaraul
Quien soy
● Proyecto abierto de seguridad en aplicaciones web (OWASP Open Web
Application Security Project)
● Comunidad abierta para la divulgación, formación y buenas prácticas
aplicables a mejorar la aplicaciones y apis de las empresas. De este modo
puedas construir aplicaciones y apis en las que se pueda confiar.
● Podemos encontrar:
○ Herramientas gratuitas: Por ejemplo ZASP
(https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project)
○ Presentaciones y videos: Canal de Youtube (https://www.youtube.com/user/OWASPGLOBAL)
○ Listas de correo
○ OWASP Top 10
○ Meetup y eventos
○ Etc
¿Que es OWASP?
● Es una lista de las 10 vulnerabilidades más críticas encontradas en las
aplicaciones web.
● Suele haber una nueva versión cada 3 o 4 años.
● Pretende sensibilizar y ser la base para que las empresas comiencen a crear
código más seguro.
OWASP Top 10: ¿Que es?
https://www.owasp.org/index.php/Top_10-2017_Top_10
PDF:
https://www.owasp.org/images/5/5e/OWASP-Top-10-2017
-es.pdf
OWASP Top 10 - 2017
Dentro de esta vulnerabilidad podemos tener 2 tipos:
● Inyección de JavaScript
● Inyección de SQL o NoSQL
A1:2017 Inyección
Descripción
- Si utilizamos funciones como eval, setTimeout, setInterval, Function()
pasándole como parámetro el texto introducido por el usuario puede ser
utilizado por un atacante para obtener información
Problema:
- Obtención de información o ataque de denegación de servicio
Solución
- Sanitizar siempre la entrada de información por parte del usuario
- No utilizar eval en el código
A1:2017 Inyección - Inyección de JS
Descripción
- Las inyecciones de SQL o NoSQL permiten a un usuario inyectar código en la consulta que se
ejecutará en la bbdd. Estos fallos suelen ocurrir al crear consultas dinámicas que añaden
información proveniente del usuario.
Problema:
- Obtención de información o ataque de denegación de servicio
Solución
- Utilizar siempre prepared statements
- Validar la entrada del usuario
- Para minimizar el riesgo no ejecutar los procesos con usuario administrador ni dar permisos de
ADMIN a las bbdd
A1:2017 Inyección - Inyección de SQL o NoSQL
Descripción
- Esta vulnerabilidad se produce cuando tenemos accesos no autorizados a nuestra aplicación. Esto
puede ser debido a ataques de fuerza bruta con diccionario por parte del atacante o robos de
sesión.
Problema:
- Accesos no autorizados
Solución
- Guardar las password encriptadas o hasheadas en la bbdd usando un salt en el proceso de
encriptación (bcrypt)
- No enviar el sessionId en la url y utilizar cookies firmadas (express-session o koa-session)
- Invalidar la sesión o token del usuario al hacer logout o por timeout (blacklist o whitelist)
- Utilizar 2FA (passport-totp) y establecer una validación de contraseñas fuertes
- Establecer un número máximo de reintentos en el login
A2:2017 Pérdida de autenticación
Descripción
- Esta vulnerabilidad se produce cuando un atacante puede obtener datos sensibles de la aplicación
por no estar bien protegido (números de tarjetas, datos médicos, etc)
Problema:
- Robo de información sensible
Solución
- Guardar los datos sensibles encriptados
- Utilizar siempre https para evitar ataques man-in-the-middle (Let’s Encrypt)
- Evitar cachear datos sensibles
- Utiliza algoritmos de encriptación estándar (no implementes tus propios algoritmos)
A3:2017 Exposición de datos sensibles
Descripción
- Esta vulnerabilidad se produce al procesar documentos XML se cargan referencias externas no
confiables.
Problema:
- Denegación de servicio u obtención de información
Solución
- No cargar referencias externas en las que no confiemos
- Intentar utilizar sistemas menos complejos (JSON)
- Validación de los datos de entrada del usuario
A4:2017 Entidades externas XML
Descripción
- Esta vulnerabilidad se produce cuando solo chequeamos los permisos de acceso en el front y no en
la API (confiando toda la gestión de roles/permisos al front), nuestra API es accesible por todo el
mundo, etc.
Problema:
- Obtención, modificación o destrucción de información por parte de usuarios no autorizados
Solución
- Chequear siempre los permisos en el lado del servidor (uso de middlewares de autorización)
- Generar tokens JWT seguros (JWT y JWKS)
- Establecer una política de CORS correcta para evitar el acceso a la API por parte de otras
aplicaciones
- Validar siempre la obtención de información
- Obtener los datos del usuario logado de la sesion y nunca de los datos enviados por el usuario.
A5:2017 Pérdida de control de acceso
Descripción
- Esta vulnerabilidad se produce cuando tenemos cuentas por defecto habilitadas, software
desactualizado, puertos desprotegidos, la aplicación da más información de la estrictamente
necesaria (cabeceras con versiones, errores muy descriptivos en producción, etc)
Problema:
- Obtención de versiones y software usado por la aplicación por parte del atacante que le da
información para obtener las vulnerabilidades de los sistemas.
Solución
- Uso de librerías como Helmet que eliminan toda la información innecesaria y agrega las cabeceras
necesarias para securizar la aplicación. (https://helmetjs.github.io/)
- Usar ultimas versiones de librerías y servicios (npm audit)
- No exponer puertos directamente a internet sin securizar. No exponer nuestro node directamente a
internet. Hacerlo a través de un servidor web.
- Eliminar configuración y cuentas por defecto.
A6:2017 Configuración de seguridad incorrecta
Descripción
- Esta vulnerabilidad se produce cuando utiliza datos de los usuarios sin validar ni escapar
directamente como parte del HTML de la página. Esta vulnerabilidad es más grave cuando además
estos datos son guardados por parte de la API y pueden ser mostrados para usuarios
Administradores.
Problema:
- Obtención de información sensible y control de la aplicación.
Solución
- Escapar siempre la entrada de información del usuario antes de mostrarla o guardarla.
- Utilizar librerías que escapen de forma automática el contenido que se vaya a pintar (librerías como
react, angular, etc ya lo hacen por defecto)
A7:2017 Cross-Site Scripting (XSS)
Descripción
- Esta vulnerabilidad se produce cuando un atacante utiliza objetos deserializados en los que inyecta
código malicioso y al serializarse consigue ejecutar ese código o modifica el contenido de los
objetos para darse más privilegios (si por ejemplo va el rol en ese objeto)
Problema:
- Obtención de información sensible y control de la aplicación.
Solución
- Validar el esquema antes de deserializar el objeto (jsonschema, joi, etc)
- Deserializar el objeto en un entorno con los menos privilegios posibles.
A8:2017 Deserialización Insegura
Descripción
- Esta vulnerabilidad se produce cuando un atacante utiliza vulnerabilidades conocidas de las
librerías o software que utiliza la aplicación para hacerse con datos o el control de esta.
Problema:
- Obtención de información sensible y control de la aplicación.
Solución
- Mantener actualizadas versiones de la librerías(npm audit), servicios y servidores
- Utilizar fuentes confiables para la instalación de librerías
- Uso de retire.js para la detección de librerías con vulnerabilidades conocidas
(https://github.com/RetireJS/retire.js)
- No ejecutes nunca el proceso node como root para minimizar el daño en el caso de que consigan
acceder a través de una vulnerabilidad
A9:2017 Uso de componentes con
vulnerabilidades conocidas
Descripción
- Esta vulnerabilidad se produce cuando no registramos los suficientes logs de eventos en la
aplicación. Logs de fallos de inicio de sesión, los errores no son lo suficientemente claros, no
mantenemos trazas de acciones de alto valor (borrado de datos importantes, accesos, etc),
registros de búsqueda de vulnerabilidades por parte de robots, etc.
Problema:
- Al no tener logs o no mantenerlos lo suficiente, no podemos realizar un análisis forense despues de
un ataque o prevenirlos si está ocurriendo.
Solución
- Registrar errores de inicio de sesión, control de acceso o validación de entrada de datos para
identificar cuentas o acciones sospechosas.
- Mantener registros para acciones de alto impacto.
A10:2017 Registro y monitoreo insuficientes
2017 vs 2013
- Uso de CSRF para evitar llamadas por parte de un código malicioso
(https://github.com/expressjs/csurf)
- Limitar el número de peticiones por segundo (rate limit)
(https://www.npmjs.com/package/express-rate-limit)
- Nunca expongas tu servidor node directamente a internet y limita el tamaño de los payload. Para
ello utiliza un servidor web que haga de reverse proxy y limite el tamaño de los payload.
- Protégete contra las “evil Regex”. Utiliza librerías de validación en lugar de tus propias regex para
validar la entrada de datos del usuario. En el caso de que necesites utilizar tus propias regex utiliza
safe-regex para validar tus regex.
- Utilizar linters para chequear tu código (TSLint, ESLint, JSHint)
Otras a tener en cuenta
https://github.com/OWASP/NodeGoat
Practicar
JWT y JWK
● JSON Web Token
● Estándar RFC 7519
● Modo compacto y autónomo de transmitir información de forma segura
● Se puede verificar y confiar porque va firmado
¿Que es JWT?
header.payload.signature
Se compone de 3 partes:
- Header
- Payload
- Signature
¿Que es JWT?
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXR
hIjp7Im5hbWUiOiJDb21taXQgQ29uZiIsImlkIjoyMD
E4fSwiaXNzIjoiUmEiLCJhdWQiOiJjb21taXRDb25m
IiwiaWF0IjoxNTQyOTAzNjU5LCJleHAiOjE1NDI5OT
AxMDZ9.e4znIBYG2VWsS3X2VrI_tkZMtBKzM5-i1
Nu_A8_yBdE
Header
Se compone de 3 partes:
- Header
- Payload
- Signature
Payload
Se compone de 3 partes:
- Header
- Payload
- Signature
Signature
Se compone de 3 partes:
- Header
- Payload
- Signature
● JWK: JSON Web Key
Mecanismo para distribuir las claves públicas que se usan para verificar
tokens JWT firmados con clave privada.
● JWKS: JSON Web Key Set
Conjunto de JWK’s
JWK y JWKs
https://github.com/rrequero/jwt-jwks-example
Implementación en NodeJS
Preguntas
Preguntas
Muchas gracias
@rrequero

Weitere ähnliche Inhalte

Was ist angesagt?

Processing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesProcessing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesFlink Forward
 
Requirements Engineering - Stakeholders
Requirements Engineering - StakeholdersRequirements Engineering - Stakeholders
Requirements Engineering - StakeholdersBirgit Penzenstadler
 
Building secure applications with keycloak
Building secure applications with keycloak Building secure applications with keycloak
Building secure applications with keycloak Abhishek Koserwal
 
Data Loss and Duplication in Kafka
Data Loss and Duplication in KafkaData Loss and Duplication in Kafka
Data Loss and Duplication in KafkaJayesh Thakrar
 
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...confluent
 
Apache web-server-architecture
Apache web-server-architectureApache web-server-architecture
Apache web-server-architectureIvanGeorgeArouje
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyVMware Tanzu
 
Welcome to the Flink Community!
Welcome to the Flink Community!Welcome to the Flink Community!
Welcome to the Flink Community!Flink Forward
 
Distributed Caching in Kubernetes with Hazelcast
Distributed Caching in Kubernetes with HazelcastDistributed Caching in Kubernetes with Hazelcast
Distributed Caching in Kubernetes with HazelcastMesut Celik
 
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP Ververica
 
Introduction to Apache Kafka
Introduction to Apache KafkaIntroduction to Apache Kafka
Introduction to Apache KafkaJeff Holoman
 
Cocomo model
Cocomo modelCocomo model
Cocomo modelMZ5512
 
Introduction to Kong API Gateway
Introduction to Kong API GatewayIntroduction to Kong API Gateway
Introduction to Kong API GatewayYohann Ciurlik
 
Proxy design pattern (Class Ambassador)
Proxy design pattern (Class Ambassador)Proxy design pattern (Class Ambassador)
Proxy design pattern (Class Ambassador)Sameer Rathoud
 
Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Sudarshan Dhondaley
 
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...Amazon Web Services
 
Presto At Treasure Data
Presto At Treasure DataPresto At Treasure Data
Presto At Treasure DataTaro L. Saito
 
Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014P. Taylor Goetz
 
REQUIREMENT ENGINEERING
REQUIREMENT ENGINEERINGREQUIREMENT ENGINEERING
REQUIREMENT ENGINEERINGSaqib Raza
 
Basic Software Effort Estimation
Basic Software Effort EstimationBasic Software Effort Estimation
Basic Software Effort Estimationumair khan
 

Was ist angesagt? (20)

Processing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesProcessing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial Services
 
Requirements Engineering - Stakeholders
Requirements Engineering - StakeholdersRequirements Engineering - Stakeholders
Requirements Engineering - Stakeholders
 
Building secure applications with keycloak
Building secure applications with keycloak Building secure applications with keycloak
Building secure applications with keycloak
 
Data Loss and Duplication in Kafka
Data Loss and Duplication in KafkaData Loss and Duplication in Kafka
Data Loss and Duplication in Kafka
 
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...
Everything You Always Wanted to Know About Kafka's Rebalance Protocol but Wer...
 
Apache web-server-architecture
Apache web-server-architectureApache web-server-architecture
Apache web-server-architecture
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor Netty
 
Welcome to the Flink Community!
Welcome to the Flink Community!Welcome to the Flink Community!
Welcome to the Flink Community!
 
Distributed Caching in Kubernetes with Hazelcast
Distributed Caching in Kubernetes with HazelcastDistributed Caching in Kubernetes with Hazelcast
Distributed Caching in Kubernetes with Hazelcast
 
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP
Kostas Kloudas - Complex Event Processing with Flink: the state of FlinkCEP
 
Introduction to Apache Kafka
Introduction to Apache KafkaIntroduction to Apache Kafka
Introduction to Apache Kafka
 
Cocomo model
Cocomo modelCocomo model
Cocomo model
 
Introduction to Kong API Gateway
Introduction to Kong API GatewayIntroduction to Kong API Gateway
Introduction to Kong API Gateway
 
Proxy design pattern (Class Ambassador)
Proxy design pattern (Class Ambassador)Proxy design pattern (Class Ambassador)
Proxy design pattern (Class Ambassador)
 
Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5
 
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...
Using Performance Insights to Optimize Database Performance (DAT402) - AWS re...
 
Presto At Treasure Data
Presto At Treasure DataPresto At Treasure Data
Presto At Treasure Data
 
Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014
 
REQUIREMENT ENGINEERING
REQUIREMENT ENGINEERINGREQUIREMENT ENGINEERING
REQUIREMENT ENGINEERING
 
Basic Software Effort Estimation
Basic Software Effort EstimationBasic Software Effort Estimation
Basic Software Effort Estimation
 

Ähnlich wie Desarrollo seguro en NodeJS (OWASP top ten y JWT)

Seguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_securitySeguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_securityseguridadelinux
 
Los 10 principales riesgos en aplicaciones web #CPMX5
Los 10 principales riesgos en aplicaciones web #CPMX5Los 10 principales riesgos en aplicaciones web #CPMX5
Los 10 principales riesgos en aplicaciones web #CPMX5SemanticWebBuilder
 
Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5Jose Gratereaux
 
Los 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo WebLos 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo Webacksec
 
Seguridad en servidores
Seguridad en servidoresSeguridad en servidores
Seguridad en servidoresTaty Millan
 
Seguridad web para desarrolladores - OWASP
Seguridad web para desarrolladores - OWASPSeguridad web para desarrolladores - OWASP
Seguridad web para desarrolladores - OWASPMarcos Harasimowicz
 
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]RootedCON
 
Cómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebCómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebEduardo Jalon
 
OWASP Top 10 2017
OWASP Top 10 2017OWASP Top 10 2017
OWASP Top 10 2017superserch
 
Owasp top 10_2007_spanish
Owasp top 10_2007_spanishOwasp top 10_2007_spanish
Owasp top 10_2007_spanishTommy Clive
 
Samurai Web Testing Framework 2.0
Samurai Web Testing Framework 2.0Samurai Web Testing Framework 2.0
Samurai Web Testing Framework 2.0Alonso Caballero
 
Vulnerabilidades en sitios web(español)
Vulnerabilidades en sitios web(español)Vulnerabilidades en sitios web(español)
Vulnerabilidades en sitios web(español)Miguel de la Cruz
 

Ähnlich wie Desarrollo seguro en NodeJS (OWASP top ten y JWT) (20)

Temas owasp
Temas owaspTemas owasp
Temas owasp
 
Seguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_securitySeguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_security
 
Los 10 principales riesgos en aplicaciones web #CPMX5
Los 10 principales riesgos en aplicaciones web #CPMX5Los 10 principales riesgos en aplicaciones web #CPMX5
Los 10 principales riesgos en aplicaciones web #CPMX5
 
Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5
 
Los 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo WebLos 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo Web
 
Seguridad en servidores
Seguridad en servidoresSeguridad en servidores
Seguridad en servidores
 
Owasp proyecto
Owasp proyectoOwasp proyecto
Owasp proyecto
 
Seguridad web para desarrolladores - OWASP
Seguridad web para desarrolladores - OWASPSeguridad web para desarrolladores - OWASP
Seguridad web para desarrolladores - OWASP
 
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
 
Owasp Top10 Spanish
Owasp Top10 SpanishOwasp Top10 Spanish
Owasp Top10 Spanish
 
Cómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebCómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación Web
 
OWASP Top 10 2017
OWASP Top 10 2017OWASP Top 10 2017
OWASP Top 10 2017
 
Owasp top 10_2007_spanish
Owasp top 10_2007_spanishOwasp top 10_2007_spanish
Owasp top 10_2007_spanish
 
CodeCamp 2010 | Diez formas de escribir código (in)seguro
CodeCamp 2010 | Diez formas de escribir código (in)seguroCodeCamp 2010 | Diez formas de escribir código (in)seguro
CodeCamp 2010 | Diez formas de escribir código (in)seguro
 
Samurai Web Testing Framework 2.0
Samurai Web Testing Framework 2.0Samurai Web Testing Framework 2.0
Samurai Web Testing Framework 2.0
 
Proyecto 6
Proyecto 6Proyecto 6
Proyecto 6
 
Owasp top ten 2019
Owasp top ten 2019Owasp top ten 2019
Owasp top ten 2019
 
WebAttack - Presentación
WebAttack - PresentaciónWebAttack - Presentación
WebAttack - Presentación
 
Aplicaciones Web Seguras (Anti-SQLi)
Aplicaciones Web Seguras (Anti-SQLi)Aplicaciones Web Seguras (Anti-SQLi)
Aplicaciones Web Seguras (Anti-SQLi)
 
Vulnerabilidades en sitios web(español)
Vulnerabilidades en sitios web(español)Vulnerabilidades en sitios web(español)
Vulnerabilidades en sitios web(español)
 

Desarrollo seguro en NodeJS (OWASP top ten y JWT)

  • 2. Raúl Requero García Arquitecto FullStack y Formador en Boream CTO en MrLooquer (https://mrlooquer.com) Twitter: @rrequero Linkedin: www.linkedin.com/in/requerogarciaraul
  • 4. ● Proyecto abierto de seguridad en aplicaciones web (OWASP Open Web Application Security Project) ● Comunidad abierta para la divulgación, formación y buenas prácticas aplicables a mejorar la aplicaciones y apis de las empresas. De este modo puedas construir aplicaciones y apis en las que se pueda confiar. ● Podemos encontrar: ○ Herramientas gratuitas: Por ejemplo ZASP (https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project) ○ Presentaciones y videos: Canal de Youtube (https://www.youtube.com/user/OWASPGLOBAL) ○ Listas de correo ○ OWASP Top 10 ○ Meetup y eventos ○ Etc ¿Que es OWASP?
  • 5. ● Es una lista de las 10 vulnerabilidades más críticas encontradas en las aplicaciones web. ● Suele haber una nueva versión cada 3 o 4 años. ● Pretende sensibilizar y ser la base para que las empresas comiencen a crear código más seguro. OWASP Top 10: ¿Que es?
  • 7. Dentro de esta vulnerabilidad podemos tener 2 tipos: ● Inyección de JavaScript ● Inyección de SQL o NoSQL A1:2017 Inyección
  • 8. Descripción - Si utilizamos funciones como eval, setTimeout, setInterval, Function() pasándole como parámetro el texto introducido por el usuario puede ser utilizado por un atacante para obtener información Problema: - Obtención de información o ataque de denegación de servicio Solución - Sanitizar siempre la entrada de información por parte del usuario - No utilizar eval en el código A1:2017 Inyección - Inyección de JS
  • 9. Descripción - Las inyecciones de SQL o NoSQL permiten a un usuario inyectar código en la consulta que se ejecutará en la bbdd. Estos fallos suelen ocurrir al crear consultas dinámicas que añaden información proveniente del usuario. Problema: - Obtención de información o ataque de denegación de servicio Solución - Utilizar siempre prepared statements - Validar la entrada del usuario - Para minimizar el riesgo no ejecutar los procesos con usuario administrador ni dar permisos de ADMIN a las bbdd A1:2017 Inyección - Inyección de SQL o NoSQL
  • 10. Descripción - Esta vulnerabilidad se produce cuando tenemos accesos no autorizados a nuestra aplicación. Esto puede ser debido a ataques de fuerza bruta con diccionario por parte del atacante o robos de sesión. Problema: - Accesos no autorizados Solución - Guardar las password encriptadas o hasheadas en la bbdd usando un salt en el proceso de encriptación (bcrypt) - No enviar el sessionId en la url y utilizar cookies firmadas (express-session o koa-session) - Invalidar la sesión o token del usuario al hacer logout o por timeout (blacklist o whitelist) - Utilizar 2FA (passport-totp) y establecer una validación de contraseñas fuertes - Establecer un número máximo de reintentos en el login A2:2017 Pérdida de autenticación
  • 11. Descripción - Esta vulnerabilidad se produce cuando un atacante puede obtener datos sensibles de la aplicación por no estar bien protegido (números de tarjetas, datos médicos, etc) Problema: - Robo de información sensible Solución - Guardar los datos sensibles encriptados - Utilizar siempre https para evitar ataques man-in-the-middle (Let’s Encrypt) - Evitar cachear datos sensibles - Utiliza algoritmos de encriptación estándar (no implementes tus propios algoritmos) A3:2017 Exposición de datos sensibles
  • 12. Descripción - Esta vulnerabilidad se produce al procesar documentos XML se cargan referencias externas no confiables. Problema: - Denegación de servicio u obtención de información Solución - No cargar referencias externas en las que no confiemos - Intentar utilizar sistemas menos complejos (JSON) - Validación de los datos de entrada del usuario A4:2017 Entidades externas XML
  • 13. Descripción - Esta vulnerabilidad se produce cuando solo chequeamos los permisos de acceso en el front y no en la API (confiando toda la gestión de roles/permisos al front), nuestra API es accesible por todo el mundo, etc. Problema: - Obtención, modificación o destrucción de información por parte de usuarios no autorizados Solución - Chequear siempre los permisos en el lado del servidor (uso de middlewares de autorización) - Generar tokens JWT seguros (JWT y JWKS) - Establecer una política de CORS correcta para evitar el acceso a la API por parte de otras aplicaciones - Validar siempre la obtención de información - Obtener los datos del usuario logado de la sesion y nunca de los datos enviados por el usuario. A5:2017 Pérdida de control de acceso
  • 14. Descripción - Esta vulnerabilidad se produce cuando tenemos cuentas por defecto habilitadas, software desactualizado, puertos desprotegidos, la aplicación da más información de la estrictamente necesaria (cabeceras con versiones, errores muy descriptivos en producción, etc) Problema: - Obtención de versiones y software usado por la aplicación por parte del atacante que le da información para obtener las vulnerabilidades de los sistemas. Solución - Uso de librerías como Helmet que eliminan toda la información innecesaria y agrega las cabeceras necesarias para securizar la aplicación. (https://helmetjs.github.io/) - Usar ultimas versiones de librerías y servicios (npm audit) - No exponer puertos directamente a internet sin securizar. No exponer nuestro node directamente a internet. Hacerlo a través de un servidor web. - Eliminar configuración y cuentas por defecto. A6:2017 Configuración de seguridad incorrecta
  • 15. Descripción - Esta vulnerabilidad se produce cuando utiliza datos de los usuarios sin validar ni escapar directamente como parte del HTML de la página. Esta vulnerabilidad es más grave cuando además estos datos son guardados por parte de la API y pueden ser mostrados para usuarios Administradores. Problema: - Obtención de información sensible y control de la aplicación. Solución - Escapar siempre la entrada de información del usuario antes de mostrarla o guardarla. - Utilizar librerías que escapen de forma automática el contenido que se vaya a pintar (librerías como react, angular, etc ya lo hacen por defecto) A7:2017 Cross-Site Scripting (XSS)
  • 16. Descripción - Esta vulnerabilidad se produce cuando un atacante utiliza objetos deserializados en los que inyecta código malicioso y al serializarse consigue ejecutar ese código o modifica el contenido de los objetos para darse más privilegios (si por ejemplo va el rol en ese objeto) Problema: - Obtención de información sensible y control de la aplicación. Solución - Validar el esquema antes de deserializar el objeto (jsonschema, joi, etc) - Deserializar el objeto en un entorno con los menos privilegios posibles. A8:2017 Deserialización Insegura
  • 17. Descripción - Esta vulnerabilidad se produce cuando un atacante utiliza vulnerabilidades conocidas de las librerías o software que utiliza la aplicación para hacerse con datos o el control de esta. Problema: - Obtención de información sensible y control de la aplicación. Solución - Mantener actualizadas versiones de la librerías(npm audit), servicios y servidores - Utilizar fuentes confiables para la instalación de librerías - Uso de retire.js para la detección de librerías con vulnerabilidades conocidas (https://github.com/RetireJS/retire.js) - No ejecutes nunca el proceso node como root para minimizar el daño en el caso de que consigan acceder a través de una vulnerabilidad A9:2017 Uso de componentes con vulnerabilidades conocidas
  • 18. Descripción - Esta vulnerabilidad se produce cuando no registramos los suficientes logs de eventos en la aplicación. Logs de fallos de inicio de sesión, los errores no son lo suficientemente claros, no mantenemos trazas de acciones de alto valor (borrado de datos importantes, accesos, etc), registros de búsqueda de vulnerabilidades por parte de robots, etc. Problema: - Al no tener logs o no mantenerlos lo suficiente, no podemos realizar un análisis forense despues de un ataque o prevenirlos si está ocurriendo. Solución - Registrar errores de inicio de sesión, control de acceso o validación de entrada de datos para identificar cuentas o acciones sospechosas. - Mantener registros para acciones de alto impacto. A10:2017 Registro y monitoreo insuficientes
  • 20. - Uso de CSRF para evitar llamadas por parte de un código malicioso (https://github.com/expressjs/csurf) - Limitar el número de peticiones por segundo (rate limit) (https://www.npmjs.com/package/express-rate-limit) - Nunca expongas tu servidor node directamente a internet y limita el tamaño de los payload. Para ello utiliza un servidor web que haga de reverse proxy y limite el tamaño de los payload. - Protégete contra las “evil Regex”. Utiliza librerías de validación en lugar de tus propias regex para validar la entrada de datos del usuario. En el caso de que necesites utilizar tus propias regex utiliza safe-regex para validar tus regex. - Utilizar linters para chequear tu código (TSLint, ESLint, JSHint) Otras a tener en cuenta
  • 23. ● JSON Web Token ● Estándar RFC 7519 ● Modo compacto y autónomo de transmitir información de forma segura ● Se puede verificar y confiar porque va firmado ¿Que es JWT?
  • 24. header.payload.signature Se compone de 3 partes: - Header - Payload - Signature ¿Que es JWT? eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXR hIjp7Im5hbWUiOiJDb21taXQgQ29uZiIsImlkIjoyMD E4fSwiaXNzIjoiUmEiLCJhdWQiOiJjb21taXRDb25m IiwiaWF0IjoxNTQyOTAzNjU5LCJleHAiOjE1NDI5OT AxMDZ9.e4znIBYG2VWsS3X2VrI_tkZMtBKzM5-i1 Nu_A8_yBdE
  • 25. Header Se compone de 3 partes: - Header - Payload - Signature
  • 26. Payload Se compone de 3 partes: - Header - Payload - Signature
  • 27. Signature Se compone de 3 partes: - Header - Payload - Signature
  • 28. ● JWK: JSON Web Key Mecanismo para distribuir las claves públicas que se usan para verificar tokens JWT firmados con clave privada. ● JWKS: JSON Web Key Set Conjunto de JWK’s JWK y JWKs