Introducció a XSS
Cross-Site Scripting (XSS) és una vulnerabilitat de seguretat que permet a un atacant injectar scripts maliciosos en pàgines web vistes per altres usuaris. Aquest tipus d'atac pot permetre a l'atacant robar informació sensible, com ara cookies de sessió, credencials d'usuari, o manipular el contingut de la pàgina web.
Tipus de XSS
Hi ha tres tipus principals de XSS:
-
XSS Reflected (Reflexiu):
- L'script maliciós es reflecteix des del servidor en la resposta immediata.
- Exemple: Un atacant envia un enllaç amb un script maliciós que es reflecteix en la resposta del servidor.
-
XSS Stored (Emmagatzemat):
- L'script maliciós es guarda en el servidor i es serveix a múltiples usuaris.
- Exemple: Un atacant publica un comentari amb un script maliciós en un fòrum, i aquest script s'executa quan altres usuaris visualitzen el comentari.
-
XSS DOM-Based:
- L'script maliciós es manipula directament en el Document Object Model (DOM) del navegador.
- Exemple: Un atacant manipula el DOM de la pàgina web per executar un script maliciós.
Exemple Pràctic de XSS
Exemple de XSS Reflected
Imagina't una pàgina web que mostra el nom de l'usuari en la seva resposta:
<!DOCTYPE html> <html> <head> <title>Benvingut</title> </head> <body> <h1>Benvingut, <?php echo $_GET['name']; ?>!</h1> </body> </html>
Si un atacant envia una URL com aquesta:
El navegador executarà el següent codi:
<!DOCTYPE html> <html> <head> <title>Benvingut</title> </head> <body> <h1>Benvingut, <script>alert('XSS');</script>!</h1> </body> </html>
Això farà que aparegui una alerta amb el missatge "XSS".
Exemple de XSS Stored
Imagina't un fòrum on els usuaris poden publicar comentaris:
// Guardar el comentari en la base de dades $comment = $_POST['comment']; mysqli_query($conn, "INSERT INTO comments (comment) VALUES ('$comment')");
Si un atacant publica un comentari amb un script maliciós:
Aquest script es guardarà en la base de dades i s'executarà cada vegada que un usuari visualitzi el comentari.
Protecció contra XSS
Validació i Escapament de Dades
-
Validació de Dades:
- Valida totes les dades d'entrada per assegurar-te que només contenen el que esperes.
- Exemple: Utilitza expressions regulars per validar que un camp de nom només conté lletres.
-
Escapament de Dades:
- Escapa totes les dades d'usuari abans de mostrar-les en la pàgina web.
- Exemple en PHP:
$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); echo "Benvingut, $name!";
Utilització de Capçaleres de Seguretat
-
Content Security Policy (CSP):
- Utilitza CSP per restringir les fonts des de les quals es poden carregar scripts.
- Exemple de capçalera CSP:
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com
-
X-XSS-Protection:
- Activa la protecció XSS en el navegador.
- Exemple de capçalera:
X-XSS-Protection: 1; mode=block
Exercicis Pràctics
Exercici 1: Identificació de XSS
Troba la vulnerabilitat XSS en el següent codi PHP:
<!DOCTYPE html> <html> <head> <title>Benvingut</title> </head> <body> <h1>Benvingut, <?php echo $_GET['user']; ?>!</h1> </body> </html>
Solució:
El codi és vulnerable a XSS perquè no escapa la dada d'entrada $_GET['user']
. Un atacant podria enviar una URL com aquesta:
Per solucionar-ho, utilitza htmlspecialchars
per escapar la dada d'entrada:
<!DOCTYPE html> <html> <head> <title>Benvingut</title> </head> <body> <h1>Benvingut, <?php echo htmlspecialchars($_GET['user'], ENT_QUOTES, 'UTF-8'); ?>!</h1> </body> </html>
Exercici 2: Implementació de Protecció CSP
Implementa una política CSP en una pàgina HTML per prevenir XSS:
<!DOCTYPE html> <html> <head> <title>Exemple CSP</title> </head> <body> <h1>Exemple de Pàgina amb CSP</h1> <script src="https://example.com/script.js"></script> </body> </html>
Solució:
Afegiu la capçalera CSP per permetre només scripts de self
i https://example.com
:
<!DOCTYPE html> <html> <head> <title>Exemple CSP</title> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com"> </head> <body> <h1>Exemple de Pàgina amb CSP</h1> <script src="https://example.com/script.js"></script> </body> </html>
Conclusió
Cross-Site Scripting (XSS) és una de les vulnerabilitats més comunes i perilloses en aplicacions web. La seva prevenció requereix una combinació de bones pràctiques de codificació, com la validació i l'escapament de dades, així com l'ús de capçaleres de seguretat com CSP. Amb una comprensió clara de com funciona XSS i com protegir-se'n, els desenvolupadors poden crear aplicacions web més segures.
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