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:
- Injecció SQL (SQLi): Permet a l'atacant executar comandes SQL no autoritzades.
- Injecció de Comandes del Sistema Operatiu: Permet a l'atacant executar comandes del sistema operatiu.
- Injecció LDAP: Permet a l'atacant modificar consultes LDAP.
- Injecció XPath: Permet a l'atacant modificar consultes XPath.
- 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
- 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