Introducción

La pérdida de autenticación es una de las vulnerabilidades más críticas en aplicaciones web. Ocurre cuando una aplicación no maneja adecuadamente la autenticación de usuarios, permitiendo a atacantes obtener acceso no autorizado a cuentas y datos sensibles. Este módulo cubre los conceptos clave, ejemplos y prácticas recomendadas para mitigar esta vulnerabilidad.

Conceptos Clave

  1. Autenticación: Proceso de verificar la identidad de un usuario o sistema.
  2. Autorización: Proceso de determinar si un usuario tiene permiso para realizar una acción específica.
  3. Sesión: Estado de interacción entre un usuario y una aplicación, generalmente mantenido a través de cookies o tokens.
  4. Gestión de Sesiones: Prácticas y mecanismos para manejar la creación, mantenimiento y destrucción de sesiones de usuario de manera segura.

Ejemplos Comunes de Pérdida de Autenticación

  1. Credenciales Débiles: Uso de contraseñas fáciles de adivinar o comunes.
  2. Almacenamiento Inseguro de Contraseñas: Guardar contraseñas en texto plano o con algoritmos de hash inseguros.
  3. Fallas en el Control de Sesiones: No invalidar sesiones después de un tiempo de inactividad o al cerrar sesión.
  4. Falta de Protección contra Ataques de Fuerza Bruta: No limitar el número de intentos de inicio de sesión fallidos.

Ejemplo Práctico

Ejemplo de Código Inseguro

# Ejemplo de código Python para autenticación insegura
def login(username, password):
    # Consulta SQL insegura susceptible a inyección SQL
    query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
    result = database.execute(query)
    if result:
        return "Login successful"
    else:
        return "Login failed"

Problemas en el Código

  1. Inyección SQL: El código es vulnerable a inyección SQL.
  2. Almacenamiento Inseguro de Contraseñas: Las contraseñas se comparan directamente en texto plano.

Ejemplo de Código Seguro

import hashlib
import sqlite3

# Función para hashear contraseñas
def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()

# Función de autenticación segura
def login(username, password):
    hashed_password = hash_password(password)
    query = "SELECT * FROM users WHERE username=? AND password=?"
    result = database.execute(query, (username, hashed_password))
    if result:
        return "Login successful"
    else:
        return "Login failed"

Explicación del Código Seguro

  1. Hashing de Contraseñas: Las contraseñas se hashean antes de almacenarse y compararse.
  2. Consultas Parametrizadas: Uso de consultas parametrizadas para prevenir inyección SQL.

Ejercicios Prácticos

Ejercicio 1: Mejorar la Seguridad de la Autenticación

Instrucciones: Mejora el siguiente código de autenticación para hacerlo más seguro.

def login(username, password):
    query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
    result = database.execute(query)
    if result:
        return "Login successful"
    else:
        return "Login failed"

Solución:

import hashlib
import sqlite3

def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()

def login(username, password):
    hashed_password = hash_password(password)
    query = "SELECT * FROM users WHERE username=? AND password=?"
    result = database.execute(query, (username, hashed_password))
    if result:
        return "Login successful"
    else:
        return "Login failed"

Ejercicio 2: Implementar Control de Sesiones

Instrucciones: Implementa un sistema básico de gestión de sesiones que invalide la sesión después de un tiempo de inactividad.

Solución:

import time

# Diccionario para almacenar sesiones
sessions = {}

def create_session(user_id):
    session_id = hashlib.sha256(str(time.time()).encode()).hexdigest()
    sessions[session_id] = {'user_id': user_id, 'last_active': time.time()}
    return session_id

def validate_session(session_id):
    session = sessions.get(session_id)
    if session and time.time() - session['last_active'] < 1800:  # 30 minutos de inactividad
        session['last_active'] = time.time()
        return True
    return False

def logout(session_id):
    if session_id in sessions:
        del sessions[session_id]

Resumen

En este módulo, hemos cubierto la pérdida de autenticación, una vulnerabilidad crítica en aplicaciones web. Hemos discutido ejemplos comunes, revisado código inseguro y seguro, y proporcionado ejercicios prácticos para reforzar los conceptos aprendidos. La autenticación segura es fundamental para proteger las aplicaciones web y los datos de los usuarios.

En el próximo módulo, exploraremos la Exposición de Datos Sensibles y cómo proteger la información confidencial en nuestras aplicaciones.

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

Módulo 3: OWASP Top Ten

Módulo 4: OWASP ASVS (Application Security Verification Standard)

Módulo 5: OWASP SAMM (Software Assurance Maturity Model)

Módulo 6: OWASP ZAP (Zed Attack Proxy)

Módulo 7: Buenas Prácticas y Recomendaciones

Módulo 8: Ejercicios Prácticos y Casos de Estudio

Módulo 9: Evaluación y Certificación

© Copyright 2024. Todos los derechos reservados