Saltar al contenido

SQL Injection (SQLi) Básico

Compartir en:

SQL Injection (SQLi) es una técnica de ataque que permite a los atacantes insertar código malicioso en una consulta SQL y ejecutarlo en una base de datos. Esto puede permitir a los atacantes acceder a información confidencial almacenada en la base de datos, como contraseñas, números de tarjeta de crédito y otros datos sensibles. Pueden también modificar o eliminar datos, creando así un gran daño en la integridad de los datos y la disponibilidad de la aplicación.

Una de las principales razones por las que los ataques SQLi son tan comunes es debido a la falta de validación adecuada en las aplicaciones web. A menudo, los desarrolladores concatenan cadenas de entrada de usuario directamente en consultas SQL, lo que permite a los atacantes insertar su propio código malicioso en las consultas.

Para prevenir ataques SQLi, es esencial utilizar sentencias preparadas en lugar de concatenar cadenas. Esto permite a los desarrolladores especificar parámetros en las consultas SQL, en lugar de incluir directamente los datos de entrada del usuario. Esto significa que el código malicioso insertado por el atacante no será ejecutado como una consulta SQL válida.

En lenguaje C#, se puede utilizar una clase SqlCommand para preparar y ejecutar una consulta, como en el siguiente ejemplo:

string query = "SELECT * FROM users WHERE username = @username";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
    cmd.Parameters.AddWithValue("@username", userInput);
    cmd.ExecuteNonQuery();
    // Procesar resultados
}

Aquí, el parámetro @username es especificado en la consulta, y su valor es proporcionado mediante el uso del método AddWithValue(). Esto significa que el valor de userInput no es concatenado directamente en la consulta, lo que previene que un atacante pueda insertar código malicioso.

Probablemente alguna vez os ha tocado ver cosas como esta:

string query = "SELECT * FROM users WHERE username = '" + userInput + "'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
    cmd.ExecuteNonQuery();
    // Procesar resultados
}

O aún peor, como esta:

string query = "SELECT * FROM users WHERE username = '" + userInput + "'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
    cmd.ExecuteNonQuery();
    // Procesar resultados
}

Se debe tener muchísimo cuidado en la manera que tratamos las variables, ¿En los tres casos Funciona? Sí, pero un código es mucho mas seguro que los otros dos. De hecho, los dos últimos son una calamidad.

Aquí tenéis otro ejemplo típico:

string query = string.Format("SELECT * FROM users WHERE username = '{0}'", userInput);
using (SqlCommand cmd = new SqlCommand(query, connection))
{
    cmd.ExecuteNonQuery();
    // Procesar resultados
}

Se deben utilizar sentencias preparadas (por norma) , también es importante validar y sanitizar los datos de entrada. Esto incluye asegurarse de que los datos de entrada cumplen con ciertos requisitos, como ser solo caracteres alfanuméricos, y eliminar cualquier caracteres no deseados o peligrosos.

En C#, se puede utilizar una expresión regular para validar que los datos de entrada cumplen con ciertos requisitos, como solo contener caracteres alfanuméricos, como en el siguiente ejemplo:

if (!Regex.IsMatch(userInput, @"^[a-zA-Z0-9]+$"))
{
    // Mostrar mensaje de error y detener la ejecución
}

La expresión regular verifica que userInput solo contiene caracteres alfanuméricos, lo que previene que un atacante pueda insertar caracteres no deseados o peligrosos en los datos de entrada.

Mantener actualizado el sistema y las aplicaciones web es también importante para protegerse contra ataques SQLi.

Los desarrolladores a menudo publican parches de seguridad para corregir vulnerabilidades conocidas, por lo que es importante mantener todo actualizado para minimizar el riesgo de un ataque exitoso.

Además, es recomendable usar herramientas de seguridad como firewalls y soluciones de detección de intrusos para detectar y bloquear cualquier actividad sospechosa en la base de datos.

Un firewall de base de datos es una herramienta de seguridad que se coloca entre la aplicación y la base de datos para controlar y monitorear el tráfico entrante y saliente. El firewall analiza las consultas SQL y detecta cualquier actividad sospechosa, como patrones de ataques conocidos o inyección de código malicioso, y bloquea automáticamente cualquier actividad maliciosa. Además, muchos firewalls de base de datos también pueden registrar y alertar sobre cualquier actividad sospechosa para permitir una respuesta rápida.

Otra herramienta de seguridad que se puede utilizar para detectar y bloquear actividad sospechosa es una solución de detección de intrusos. Esta herramienta analiza el tráfico en tiempo real y utiliza algoritmos avanzados para detectar patrones de actividad maliciosa, como ataques SQLi. Si se detecta cualquier actividad sospechosa, la solución de detección de intrusos puede bloquear automáticamente la actividad y alertar al equipo de seguridad.

https://csecmagazine.com/2022/02/05/owasp-a032021-injection-como-referente-para-el-desarrolloseguro-de-aplicaciones-web/ 6

¡En conclusión, amigos! Los ataques SQLi son como una tormenta en un día despejado para la seguridad de tu aplicación web o sistema. Pero no te preocupes, hay medidas que puedes tomar para protegerte, como preparar tus sentencias, validar y sanitizar tus datos de entrada, y mantener tus sistemas y aplicaciones actualizadas. Así, podrás reducir significativamente el riesgo de un ataque SQLi exitoso y estarás tranquilo como un lago en un día de verano.


Juan Ibero

Inmerso en la Evolución Tecnológica. Ingeniero Informático especializado en la gestión segura de entornos TI e industriales, con un profundo énfasis en seguridad, arquitectura y programación. Siempre aprendiendo, siempre explorando.

Compartir en:
Etiquetas:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *