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 = "usuari@example.com"
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 = "usuari@example.com"
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 = "usuari@example.com"
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
