Introducció

La seguretat en aplicacions web és una disciplina crítica dins de la ciberseguretat que se centra en protegir les aplicacions web contra diverses amenaces i vulnerabilitats. Les aplicacions web són objectius freqüents per als atacants perquè sovint contenen dades sensibles i ofereixen múltiples punts d'entrada.

Conceptes Clau

  1. Vulnerabilitats Comunes en Aplicacions Web

a. Injecció SQL

  • Descripció: Els atacs d'injecció SQL ocorren quan un atacant pot inserir codi SQL maliciós en una consulta SQL.
  • Exemple:
    SELECT * FROM usuaris WHERE usuari = 'admin' AND contrasenya = ' ' OR '1'='1';
    
  • Prevenció: Utilitzar consultes preparades i paràmetres en lloc de concatenar cadenes SQL.

b. Cross-Site Scripting (XSS)

  • Descripció: Els atacs XSS permeten als atacants injectar scripts maliciosos en pàgines web vistes per altres usuaris.
  • Exemple:
    <script>alert('XSS');</script>
    
  • Prevenció: Escapar correctament les dades d'entrada i utilitzar funcions de sanitització.

c. Cross-Site Request Forgery (CSRF)

  • Descripció: Els atacs CSRF forcen a un usuari autenticat a executar accions no desitjades en una aplicació web.
  • Exemple: Enviar una petició POST maliciosa des d'un altre lloc web.
  • Prevenció: Utilitzar tokens CSRF per verificar la legitimitat de les peticions.

  1. Autenticació i Gestió de Sessions

a. Autenticació Segura

  • Descripció: Assegurar que només els usuaris autoritzats puguin accedir a l'aplicació.
  • Bones Pràctiques:
    • Utilitzar autenticació multifactor (MFA).
    • Emmagatzemar contrasenyes de manera segura amb hashing i salting.

b. Gestió de Sessions

  • Descripció: Protegir les sessions dels usuaris contra el robatori i la suplantació.
  • Bones Pràctiques:
    • Utilitzar cookies segures (Secure, HttpOnly).
    • Regenerar els identificadors de sessió després de l'autenticació.

  1. Control d'Accés

  • Descripció: Assegurar que els usuaris només puguin accedir als recursos per als quals tenen permisos.
  • Bones Pràctiques:
    • Implementar controls d'accés basats en rols (RBAC).
    • Revisar i actualitzar regularment les polítiques d'accés.

Exemples Pràctics

Exemple 1: Prevenir Injecció SQL amb Consultes Preparades

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# Consulta insegura
usuari = 'admin'
contrasenya = 'password'
cursor.execute(f"SELECT * FROM usuaris WHERE usuari = '{usuari}' AND contrasenya = '{contrasenya}'")

# Consulta segura amb paràmetres
cursor.execute("SELECT * FROM usuaris WHERE usuari = ? AND contrasenya = ?", (usuari, contrasenya))

Exemple 2: Implementar Tokens CSRF en una Aplicació Web

<!-- Formulari HTML amb token CSRF -->
<form method="POST" action="/submit">
    <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
    <input type="text" name="dada">
    <input type="submit" value="Enviar">
</form>
# Generar i verificar tokens CSRF en Flask (Python)
from flask import Flask, request, session
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)

@app.before_request
def protect_csrf():
    if request.method == "POST":
        token = session.pop('_csrf_token', None)
        if not token or token != request.form.get('csrf_token'):
            abort(403)

def generate_csrf_token():
    if '_csrf_token' not in session:
        session['_csrf_token'] = os.urandom(24).hex()
    return session['_csrf_token']

app.jinja_env.globals['csrf_token'] = generate_csrf_token

Exercicis Pràctics

Exercici 1: Identificar Vulnerabilitats

Descripció: Revisa el codi següent i identifica les vulnerabilitats de seguretat.

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

usuari = input("Usuari: ")
contrasenya = input("Contrasenya: ")

query = f"SELECT * FROM usuaris WHERE usuari = '{usuari}' AND contrasenya = '{contrasenya}'"
cursor.execute(query)
resultat = cursor.fetchall()

if resultat:
    print("Accés concedit")
else:
    print("Accés denegat")

Solució:

  • Vulnerabilitat: Injecció SQL.
  • Correcció: Utilitzar consultes preparades.

Exercici 2: Implementar Autenticació Multifactor

Descripció: Implementa un sistema d'autenticació multifactor en una aplicació web utilitzant Python i Flask.

Pistes:

  • Utilitza una biblioteca com pyotp per generar codis OTP.
  • Emmagatzema els secrets OTP de manera segura.

Solució:

import pyotp
from flask import Flask, request, session, redirect, url_for

app = Flask(__name__)
app.secret_key = os.urandom(24)

# Generar secret OTP per a l'usuari
secret = pyotp.random_base32()

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        usuari = request.form['usuari']
        contrasenya = request.form['contrasenya']
        # Verificar usuari i contrasenya (omès per simplicitat)
        session['usuari'] = usuari
        return redirect(url_for('otp'))
    return '''
        <form method="post">
            Usuari: <input type="text" name="usuari"><br>
            Contrasenya: <input type="password" name="contrasenya"><br>
            <input type="submit" value="Login">
        </form>
    '''

@app.route('/otp', methods=['GET', 'POST'])
def otp():
    if request.method == 'POST':
        otp_code = request.form['otp']
        totp = pyotp.TOTP(secret)
        if totp.verify(otp_code):
            return "Autenticació completada"
        else:
            return "Codi OTP incorrecte"
    return '''
        <form method="post">
            Codi OTP: <input type="text" name="otp"><br>
            <input type="submit" value="Verificar">
        </form>
    '''

if __name__ == '__main__':
    app.run()

Conclusió

La seguretat en aplicacions web és essencial per protegir les dades i la integritat de les aplicacions. Comprendre les vulnerabilitats comunes i implementar bones pràctiques de seguretat pot ajudar a prevenir atacs i protegir els usuaris. En el proper tema, explorarem les proves de penetració i l'avaluació de vulnerabilitats per identificar i mitigar riscos en les aplicacions web.

© Copyright 2024. Tots els drets reservats