Introducción
La exposición de datos sensibles es una de las vulnerabilidades más críticas en aplicaciones web. Ocurre cuando una aplicación no protege adecuadamente la información confidencial, como datos personales, credenciales, información financiera, etc. Esto puede llevar a robos de identidad, fraudes y otras actividades maliciosas.
Conceptos Clave
- Datos Sensibles: Información que, si se expone, puede causar daño a individuos o organizaciones. Ejemplos incluyen números de tarjetas de crédito, números de seguridad social, credenciales de usuario, etc.
- Cifrado: Proceso de convertir datos en un formato ininteligible para protegerlos de accesos no autorizados.
- Hashing: Técnica para transformar datos en una cadena de caracteres de longitud fija, que no puede revertirse a su forma original.
- Transmisión Segura: Uso de protocolos como HTTPS para proteger los datos mientras se transmiten entre el cliente y el servidor.
Ejemplos de Exposición de Datos Sensibles
- Almacenamiento Inseguro: Guardar datos sensibles en texto plano en bases de datos, archivos de log, etc.
- Transmisión Insegura: Enviar datos sensibles a través de conexiones no cifradas (HTTP en lugar de HTTPS).
- Falta de Protección en el Frontend: Exponer datos sensibles en el código fuente del lado del cliente (JavaScript, HTML).
Ejemplo Práctico
Código Inseguro
// Almacenamiento inseguro de contraseñas en texto plano String password = "userPassword"; database.save(password);
Código Seguro
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; // Almacenamiento seguro de contraseñas usando hashing public class SecureStorage { public static String hashPassword(String password) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(password.getBytes()); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { hexString.append(String.format("%02x", b)); } return hexString.toString(); } public static void main(String[] args) throws NoSuchAlgorithmException { String password = "userPassword"; String hashedPassword = hashPassword(password); database.save(hashedPassword); } }
Ejercicio Práctico
Ejercicio 1: Identificación de Datos Sensibles
Instrucciones:
- Revisa el siguiente fragmento de código y señala las partes donde se manejan datos sensibles de manera insegura.
- Propón soluciones para mejorar la seguridad.
import sqlite3 # Conexión a la base de datos conn = sqlite3.connect('example.db') c = conn.cursor() # Creación de tabla c.execute('''CREATE TABLE users (username text, password text)''') # Inserción de datos sensibles en texto plano c.execute("INSERT INTO users VALUES ('user1', 'password123')") # Recuperación de datos sensibles sin cifrado c.execute("SELECT * FROM users") print(c.fetchall()) conn.commit() conn.close()
Solución
-
Identificación de Problemas:
- Las contraseñas se almacenan en texto plano.
- No se utiliza cifrado para proteger los datos en la base de datos.
-
Propuesta de Soluciones:
- Utilizar hashing para almacenar las contraseñas.
- Asegurar la conexión a la base de datos si es remota.
Código Mejorado
import sqlite3 import hashlib # Función para hashear contraseñas def hash_password(password): return hashlib.sha256(password.encode()).hexdigest() # Conexión a la base de datos conn = sqlite3.connect('example.db') c = conn.cursor() # Creación de tabla c.execute('''CREATE TABLE users (username text, password text)''') # Inserción de datos sensibles con hashing hashed_password = hash_password('password123') c.execute("INSERT INTO users VALUES ('user1', ?)", (hashed_password,)) # Recuperación de datos sensibles (hash) c.execute("SELECT * FROM users") print(c.fetchall()) conn.commit() conn.close()
Resumen
En esta sección, hemos aprendido sobre la exposición de datos sensibles, una de las vulnerabilidades más críticas en aplicaciones web. Hemos discutido conceptos clave como cifrado y hashing, y hemos visto ejemplos prácticos de cómo proteger datos sensibles tanto en almacenamiento como en transmisión. Además, hemos realizado un ejercicio práctico para identificar y solucionar problemas de seguridad relacionados con la exposición de datos sensibles.
En la siguiente sección, exploraremos otra vulnerabilidad crítica: A4: Entidades Externas XML (XXE).
Curso de OWASP: Directrices y Estándares para la Seguridad en Aplicaciones Web
Módulo 1: Introducción a OWASP
Módulo 2: Principales Proyectos de OWASP
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Módulo 3: OWASP Top Ten
- A1: Inyección
- A2: Pérdida de Autenticación
- A3: Exposición de Datos Sensibles
- A4: Entidades Externas XML (XXE)
- A5: Control de Acceso Roto
- A6: Configuración Incorrecta de Seguridad
- A7: Cross-Site Scripting (XSS)
- A8: Deserialización Insegura
- A9: Uso de Componentes con Vulnerabilidades Conocidas
- A10: Registro y Monitoreo Insuficientes
Módulo 4: OWASP ASVS (Application Security Verification Standard)
- Introducción a ASVS
- Niveles de Verificación
- Requisitos de Seguridad
- Implementación de ASVS en Proyectos
Módulo 5: OWASP SAMM (Software Assurance Maturity Model)
Módulo 6: OWASP ZAP (Zed Attack Proxy)
- Introducción a ZAP
- Instalación y Configuración
- Escaneo de Vulnerabilidades
- Automatización de Pruebas de Seguridad
Módulo 7: Buenas Prácticas y Recomendaciones
- Ciclo de Vida de Desarrollo Seguro (SDLC)
- Integración de Seguridad en DevOps
- Capacitación y Concienciación en Seguridad
- Herramientas y Recursos Adicionales
Módulo 8: Ejercicios Prácticos y Casos de Estudio
- Ejercicio 1: Identificación de Vulnerabilidades
- Ejercicio 2: Implementación de Controles de Seguridad
- Caso de Estudio 1: Análisis de un Incidente de Seguridad
- Caso de Estudio 2: Mejora de la Seguridad en una Aplicación Web