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

  1. Inyección SQL (SQLi): Inserción de código SQL malicioso en una consulta.
  2. Inyección de Comandos del Sistema Operativo: Ejecución de comandos del sistema operativo a través de la aplicación.
  3. Inyección LDAP: Manipulación de consultas LDAP para acceder o modificar información en un directorio.
  4. Inyección XPath: Inserción de código XPath malicioso en consultas XML.
  5. 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:

SELECT * FROM users WHERE userId = '' OR '1'='1'

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

  1. Validación: Asegúrate de que los datos de entrada cumplen con los requisitos esperados (por ejemplo, longitud, formato, tipo).
  2. 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

Módulo 3: OWASP Top Ten

Módulo 4: OWASP ASVS (Application Security Verification Standard)

Módulo 5: OWASP SAMM (Software Assurance Maturity Model)

Módulo 6: OWASP ZAP (Zed Attack Proxy)

Módulo 7: Buenas Prácticas y Recomendaciones

Módulo 8: Ejercicios Prácticos y Casos de Estudio

Módulo 9: Evaluación y Certificación

© Copyright 2024. Todos los derechos reservados