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:

  1. 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.
  2. 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.
  3. 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:

http://example.com/welcome.php?name=<script>alert('XSS');</script>

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:

<script>alert('XSS');</script>

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

  1. 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.
  2. 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

  1. 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
    
  2. 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:

http://example.com/welcome.php?user=<script>alert('XSS');</script>

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

Mòdul 3: OWASP Top Ten

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)

Mòdul 7: Bones Pràctiques i Recomanacions

Mòdul 8: Exercicis Pràctics i Casos d'Estudi

Mòdul 9: Avaluació i Certificació

© Copyright 2024. Tots els drets reservats