Introducció

La injecció és una de les vulnerabilitats més comunes i perilloses en aplicacions web. Es produeix quan un atacant pot enviar dades malicioses a una aplicació, que després són processades de manera insegura. Aquest tipus d'atac pot permetre a l'atacant executar comandes arbitràries, accedir a dades sensibles o alterar el comportament de l'aplicació.

Tipus d'Injecció

Hi ha diversos tipus d'injecció, però els més comuns són:

  1. Injecció SQL (SQLi): Permet a l'atacant executar comandes SQL no autoritzades.
  2. Injecció de Comandes del Sistema Operatiu: Permet a l'atacant executar comandes del sistema operatiu.
  3. Injecció LDAP: Permet a l'atacant modificar consultes LDAP.
  4. Injecció XPath: Permet a l'atacant modificar consultes XPath.
  5. Injecció NoSQL: Permet a l'atacant modificar consultes a bases de dades NoSQL.

Exemples Pràctics

Exemple 1: Injecció SQL

Codi Vulnerable

# Exemple en Python
import sqlite3

def login(username, password):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
    cursor.execute(query)
    result = cursor.fetchone()
    conn.close()
    return result

# Ús del codi vulnerable
login("admin", "password123")

Explicació

En aquest exemple, l'entrada de l'usuari es concatena directament a la consulta SQL, la qual cosa permet a un atacant injectar codi SQL maliciós.

Codi Segur

# Exemple en Python amb paràmetres preparats
import sqlite3

def login(username, password):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    query = "SELECT * FROM users WHERE username = ? AND password = ?"
    cursor.execute(query, (username, password))
    result = cursor.fetchone()
    conn.close()
    return result

# Ús del codi segur
login("admin", "password123")

Explicació

En aquest exemple, s'utilitzen paràmetres preparats per evitar la injecció SQL. Els paràmetres preparats asseguren que les dades de l'usuari es tractin com a dades i no com a part de la consulta SQL.

Exemple 2: Injecció de Comandes del Sistema Operatiu

Codi Vulnerable

# Exemple en Python
import os

def list_files(directory):
    os.system(f"ls {directory}")

# Ús del codi vulnerable
list_files("/home/user")

Explicació

En aquest exemple, l'entrada de l'usuari es concatena directament a la comanda del sistema operatiu, la qual cosa permet a un atacant injectar comandes malicioses.

Codi Segur

# Exemple en Python amb subprocess
import subprocess

def list_files(directory):
    subprocess.run(["ls", directory])

# Ús del codi segur
list_files("/home/user")

Explicació

En aquest exemple, s'utilitza la funció subprocess.run amb una llista d'arguments per evitar la injecció de comandes del sistema operatiu. Això assegura que cada argument es tracti com a dades separades.

Exercicis Pràctics

Exercici 1: Identificació de Vulnerabilitats d'Injecció

Descripció

Revisa el següent codi i identifica possibles vulnerabilitats d'injecció. Proposa una solució segura.

import sqlite3

def search_user(username):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    query = f"SELECT * FROM users WHERE username = '{username}'"
    cursor.execute(query)
    result = cursor.fetchall()
    conn.close()
    return result

# Ús del codi
search_user("admin")

Solució

import sqlite3

def search_user(username):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    query = "SELECT * FROM users WHERE username = ?"
    cursor.execute(query, (username,))
    result = cursor.fetchall()
    conn.close()
    return result

# Ús del codi segur
search_user("admin")

Exercici 2: Implementació de Controls de Seguretat

Descripció

Implementa un sistema de login segur que eviti la injecció SQL utilitzant paràmetres preparats.

Solució

import sqlite3

def login(username, password):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    query = "SELECT * FROM users WHERE username = ? AND password = ?"
    cursor.execute(query, (username, password))
    result = cursor.fetchone()
    conn.close()
    return result

# Ús del codi segur
login("admin", "password123")

Conclusió

La injecció és una vulnerabilitat crítica que pot tenir conseqüències greus per a la seguretat de les aplicacions web. És essencial utilitzar pràctiques de codificació segures, com ara l'ús de paràmetres preparats, per protegir les aplicacions contra aquests atacs. En el proper tema, explorarem la vulnerabilitat de la pèrdua d'autenticació i com prevenir-la.

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