Introducció
La pèrdua d'autenticació és una de les vulnerabilitats més crítiques en aplicacions web segons l'OWASP Top Ten. Aquesta vulnerabilitat es produeix quan una aplicació no gestiona adequadament la identificació i autenticació dels usuaris, permetent a atacants accedir a comptes d'usuaris sense les credencials correctes.
Conceptes Clau
- Autenticació: Procés de verificar la identitat d'un usuari.
- Autenticació Multifactor (MFA): Utilització de múltiples mètodes d'autenticació per verificar la identitat d'un usuari.
- Gestió de Sessions: Control de la durada i validesa de les sessions d'usuari.
- Política de Contrasenyes: Normes que defineixen la complexitat i la caducitat de les contrasenyes.
Causes Comunes de la Pèrdua d'Autenticació
- Contrasenyes febles o predeterminades: Ús de contrasenyes fàcils de predir o no canviades des de la configuració inicial.
- Absència d'autenticació multifactor: No implementar MFA, facilitant l'accés als atacants amb només una contrasenya.
- Gestió inadequada de sessions: Sessions que no expiren o que no es tanquen correctament.
- Emmagatzematge insegur de credencials: Desar contrasenyes en text pla o utilitzar algoritmes de hash insegurs.
Exemples Pràctics
Exemple 1: Contrasenyes Febles
# Exemple de codi en Python que mostra una contrasenya feble def validar_contrasenya(contrasenya): if len(contrasenya) < 8: return False return True contrasenya = "123456" if validar_contrasenya(contrasenya): print("Contrasenya vàlida") else: print("Contrasenya feble")
Explicació: Aquest codi només comprova la longitud de la contrasenya, permetent contrasenyes molt febles com "123456".
Exemple 2: Autenticació Multifactor
# Exemple d'implementació d'autenticació multifactor en Python import random def enviar_codi_verificacio(usuari): codi = random.randint(100000, 999999) # Enviar el codi al correu electrònic o telèfon de l'usuari print(f"Codi de verificació enviat a {usuari}: {codi}") return codi def autenticar_usuari(usuari, contrasenya, codi_introduit): if validar_contrasenya(contrasenya): codi_correcte = enviar_codi_verificacio(usuari) if codi_introduit == codi_correcte: print("Autenticació exitosa") else: print("Codi de verificació incorrecte") else: print("Contrasenya incorrecta") usuari = "[email protected]" contrasenya = "contrasenyaSegura123" codi_introduit = 123456 # Aquest codi hauria de ser introduït per l'usuari autenticar_usuari(usuari, contrasenya, codi_introduit)
Explicació: Aquest codi implementa una autenticació multifactor enviant un codi de verificació a l'usuari.
Exercicis Pràctics
Exercici 1: Millora de la Política de Contrasenyes
Objectiu: Implementar una funció que validi contrasenyes seguint una política més estricta.
Requisits:
- Longitud mínima de 12 caràcters.
- Almenys una lletra majúscula.
- Almenys una lletra minúscula.
- Almenys un número.
- Almenys un caràcter especial.
Codi Inicial:
def validar_contrasenya(contrasenya): # Implementar la validació de la contrasenya segons els requisits pass contrasenya = "ContrasenyaSegura123!" if validar_contrasenya(contrasenya): print("Contrasenya vàlida") else: print("Contrasenya feble")
Solució:
import re def validar_contrasenya(contrasenya): if len(contrasenya) < 12: return False if not re.search("[A-Z]", contrasenya): return False if not re.search("[a-z]", contrasenya): return False if not re.search("[0-9]", contrasenya): return False if not re.search("[@#$%^&+=]", contrasenya): return False return True contrasenya = "ContrasenyaSegura123!" if validar_contrasenya(contrasenya): print("Contrasenya vàlida") else: print("Contrasenya feble")
Exercici 2: Implementació de Gestió de Sessions
Objectiu: Implementar una funció que gestioni la durada de les sessions d'usuari.
Requisits:
- Les sessions han de caducar després de 30 minuts d'inactivitat.
- Les sessions han de ser tancades correctament quan l'usuari es desconnecta.
Codi Inicial:
import time sessions = {} def iniciar_sessio(usuari): # Implementar l'inici de sessió pass def tancar_sessio(usuari): # Implementar el tancament de sessió pass def verificar_sessio(usuari): # Implementar la verificació de la sessió pass usuari = "[email protected]" iniciar_sessio(usuari) time.sleep(1800) # Simular 30 minuts d'inactivitat verificar_sessio(usuari)
Solució:
import time sessions = {} def iniciar_sessio(usuari): sessions[usuari] = time.time() print(f"Sessió iniciada per {usuari}") def tancar_sessio(usuari): if usuari in sessions: del sessions[usuari] print(f"Sessió tancada per {usuari}") else: print(f"No hi ha cap sessió activa per {usuari}") def verificar_sessio(usuari): if usuari in sessions: temps_actual = time.time() temps_inici = sessions[usuari] if temps_actual - temps_inici > 1800: # 30 minuts print(f"Sessió caducada per {usuari}") tancar_sessio(usuari) else: print(f"Sessió activa per {usuari}") else: print(f"No hi ha cap sessió activa per {usuari}") usuari = "[email protected]" iniciar_sessio(usuari) time.sleep(1800) # Simular 30 minuts d'inactivitat verificar_sessio(usuari)
Errors Comuns i Consells
- No implementar MFA: Sempre que sigui possible, implementa autenticació multifactor per augmentar la seguretat.
- Contrasenyes febles: Assegura't que les contrasenyes compleixin amb una política estricta de seguretat.
- Sessions que no expiren: Implementa mecanismes per assegurar que les sessions caduquin després d'un període d'inactivitat.
Conclusió
La pèrdua d'autenticació és una vulnerabilitat crítica que pot comprometre la seguretat de les aplicacions web. Implementar polítiques de contrasenyes estrictes, autenticació multifactor i una gestió adequada de sessions són mesures essencials per protegir les aplicacions contra aquest tipus d'atacs.
Curs d'OWASP: Directrius i Estàndards per a la Seguretat en Aplicacions Web
Mòdul 1: Introducció a OWASP
Mòdul 2: Principals Projectes d'OWASP
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Mòdul 3: OWASP Top Ten
- A1: Injecció
- A2: Pèrdua d'Autenticació
- A3: Exposició de Dades Sensibles
- A4: Entitats Externes XML (XXE)
- A5: Control d'Accés Trencat
- A6: Configuració Incorrecta de Seguretat
- A7: Cross-Site Scripting (XSS)
- A8: Deserialització Insegura
- A9: Ús de Components amb Vulnerabilitats Conegudes
- A10: Registre i Monitoratge Insuficients
Mòdul 4: OWASP ASVS (Application Security Verification Standard)
Mòdul 5: OWASP SAMM (Software Assurance Maturity Model)
Mòdul 6: OWASP ZAP (Zed Attack Proxy)
- Introducció a ZAP
- Instal·lació i Configuració
- Escaneig de Vulnerabilitats
- Automatització de Proves de Seguretat
Mòdul 7: Bones Pràctiques i Recomanacions
- Cicle de Vida de Desenvolupament Segur (SDLC)
- Integració de Seguretat en DevOps
- Capacitació i Sensibilització en Seguretat
- Eines i Recursos Addicionals
Mòdul 8: Exercicis Pràctics i Casos d'Estudi
- Exercici 1: Identificació de Vulnerabilitats
- Exercici 2: Implementació de Controls de Seguretat
- Cas d'Estudi 1: Anàlisi d'un Incident de Seguretat
- Cas d'Estudi 2: Millora de la Seguretat en una Aplicació Web