Introducción
La inyección es una de las vulnerabilidades más críticas y comunes en aplicaciones web. Ocurre cuando un atacante puede enviar datos no confiables a un intérprete como parte de un comando o consulta. Los datos maliciosos pueden engañar al intérprete para ejecutar comandos no intencionados o acceder a datos sin autorización.
Conceptos Clave
- Inyección SQL (SQLi): Inserción de código SQL malicioso en una consulta.
- Inyección de Comandos del Sistema Operativo: Ejecución de comandos del sistema operativo a través de la aplicación.
- Inyección LDAP: Manipulación de consultas LDAP para acceder o modificar información en un directorio.
- Inyección XPath: Inserción de código XPath malicioso en consultas XML.
- Inyección NoSQL: Manipulación de consultas en bases de datos NoSQL.
Ejemplo de Inyección SQL
Código Vulnerable
String userId = request.getParameter("userId"); String query = "SELECT * FROM users WHERE userId = '" + userId + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(query);
Explicación
En este ejemplo, el valor de userId
se inserta directamente en la consulta SQL sin validación ni sanitización. Un atacante podría enviar un valor como ' OR '1'='1
para manipular la consulta.
Ejemplo de Ataque
Si userId
es igual a ' OR '1'='1
, la consulta resultante sería:
Esta consulta siempre será verdadera y devolverá todos los registros de la tabla users
.
Prevención de Inyección
Uso de Consultas Preparadas
Las consultas preparadas son una técnica eficaz para prevenir la inyección SQL. Separan los datos de los comandos SQL, evitando que los datos maliciosos se interpreten como comandos.
Ejemplo Seguro
String userId = request.getParameter("userId"); String query = "SELECT * FROM users WHERE userId = ?"; PreparedStatement pstmt = connection.prepareStatement(query); pstmt.setString(1, userId); ResultSet rs = pstmt.executeQuery();
Validación y Sanitización de Entradas
- Validación: Asegúrate de que los datos de entrada cumplen con los requisitos esperados (por ejemplo, longitud, formato, tipo).
- Sanitización: Limpia los datos de entrada para eliminar o escapar caracteres peligrosos.
Uso de ORM (Object-Relational Mapping)
Los ORM como Hibernate o Entity Framework pueden ayudar a prevenir inyecciones al abstraer las consultas SQL y manejar automáticamente la sanitización de datos.
Ejercicio Práctico
Ejercicio 1: Identificación de Vulnerabilidades
Instrucciones: Revisa el siguiente código y encuentra las posibles vulnerabilidades de inyección.
import sqlite3 def get_user_data(user_id): conn = sqlite3.connect('example.db') cursor = conn.cursor() query = "SELECT * FROM users WHERE user_id = " + user_id cursor.execute(query) return cursor.fetchall()
Solución:
El código es vulnerable a inyección SQL porque concatena directamente el user_id
en la consulta SQL. Un atacante podría pasar un valor malicioso para manipular la consulta.
Ejercicio 2: Implementación de Controles de Seguridad
Instrucciones: Modifica el código anterior para prevenir la inyección SQL utilizando consultas preparadas.
Solución:
import sqlite3 def get_user_data(user_id): conn = sqlite3.connect('example.db') cursor = conn.cursor() query = "SELECT * FROM users WHERE user_id = ?" cursor.execute(query, (user_id,)) return cursor.fetchall()
Resumen
En esta sección, hemos aprendido sobre la vulnerabilidad de inyección, sus tipos y cómo prevenirla. La inyección SQL es una de las formas más comunes y peligrosas de inyección, pero se puede mitigar eficazmente mediante el uso de consultas preparadas, validación y sanitización de entradas, y el uso de ORM.
Conceptos Clave
- Inyección SQL: Inserción de código SQL malicioso en una consulta.
- Consultas Preparadas: Técnica para separar datos de comandos SQL.
- Validación y Sanitización: Métodos para asegurar que los datos de entrada sean seguros.
Ejercicios
- Identificación de Vulnerabilidades: Revisión de código para encontrar posibles inyecciones.
- Implementación de Controles de Seguridad: Modificación de código para prevenir inyecciones.
En el próximo tema, exploraremos la vulnerabilidad de Pérdida de Autenticación y cómo proteger nuestras aplicaciones contra este tipo de ataques.
Curso de OWASP: Directrices y Estándares para la Seguridad en Aplicaciones Web
Módulo 1: Introducción a OWASP
Módulo 2: Principales Proyectos de OWASP
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Módulo 3: OWASP Top Ten
- A1: Inyección
- A2: Pérdida de Autenticación
- A3: Exposición de Datos Sensibles
- A4: Entidades Externas XML (XXE)
- A5: Control de Acceso Roto
- A6: Configuración Incorrecta de Seguridad
- A7: Cross-Site Scripting (XSS)
- A8: Deserialización Insegura
- A9: Uso de Componentes con Vulnerabilidades Conocidas
- A10: Registro y Monitoreo Insuficientes
Módulo 4: OWASP ASVS (Application Security Verification Standard)
- Introducción a ASVS
- Niveles de Verificación
- Requisitos de Seguridad
- Implementación de ASVS en Proyectos
Módulo 5: OWASP SAMM (Software Assurance Maturity Model)
Módulo 6: OWASP ZAP (Zed Attack Proxy)
- Introducción a ZAP
- Instalación y Configuración
- Escaneo de Vulnerabilidades
- Automatización de Pruebas de Seguridad
Módulo 7: Buenas Prácticas y Recomendaciones
- Ciclo de Vida de Desarrollo Seguro (SDLC)
- Integración de Seguridad en DevOps
- Capacitación y Concienciación en Seguridad
- Herramientas y Recursos Adicionales
Módulo 8: Ejercicios Prácticos y Casos de Estudio
- Ejercicio 1: Identificación de Vulnerabilidades
- Ejercicio 2: Implementación de Controles de Seguridad
- Caso de Estudio 1: Análisis de un Incidente de Seguridad
- Caso de Estudio 2: Mejora de la Seguridad en una Aplicación Web