SQLi: ataque de inyección

Nov 30 2022
¿Qué es la inyección SQL? SQLi es un tipo de ataque en una aplicación basada en web donde el atacante puede ejecutar consultas maliciosas en la base de datos de un sitio web. SQL es una técnica de inyección de código utilizada para ejecutar sentencias SQL maliciosas.

¿Qué es la inyección SQL?

SQLi es un tipo de ataque en una aplicación basada en web donde el atacante puede ejecutar consultas maliciosas en la base de datos de un sitio web. SQL es una técnica de inyección de código utilizada para ejecutar sentencias SQL maliciosas.

Por ejemplo, si desea iniciar sesión en el sitio web y olvidó el nombre de usuario y la contraseña, mediante la inyección de SQLi podemos iniciar sesión o acceder a la página web sin saber la contraseña.

¿Cómo funciona la inyección SQL?

La inyección SQL contiene insertar o inyectar la consulta SQL a través de los datos de entrada del cliente en la aplicación. Estos se inyectan en el plano de datos que afectan a los comandos SQL predefinidos.

Los ataques de inyección SQL tienen como objetivo las vulnerabilidades de las sentencias SQL dinámicas. Piense en una instrucción SQL dinámica como una función matemática multivariante cuyos parámetros son fijos mientras que el resultado está determinado por los valores colocados en las variables independientes.

De manera similar, una declaración SQL dinámica también consta de un conjunto predefinido de parámetros (como un formulario web) y la declaración completa se genera solo cuando el usuario proporciona una entrada.

Vea el siguiente ejemplo de una declaración SQL de un formulario de inicio de sesión:

SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')

Si existe una vulnerabilidad en una declaración SQL dinámica, un atacante podría ingresar un script complejo en un formulario para corromper los parámetros existentes y cambiar el significado de toda la declaración.

Tipos de inyección SQL:

SQLi en banda: la inyección SQL en banda es un tipo de inyección SQL donde el atacante recibe el resultado como respuesta directa a través del mismo canal de comunicación. Por ejemplo, si un atacante lanza manualmente un ataque a través de su navegador web, los resultados del ataque se mostrarán en el mismo navegador web. La inyección de SQL en banda también se conoce como inyección de SQL tradicional.

Inyección SQL basada en errores: aquí el atacante realiza ciertas acciones que hacen que la base de datos genere un mensaje de error. Puede usar el mensaje de error para determinar qué base de datos se está usando, qué versión de servidor está usando el controlador, etc.

Inyección SQL basada en unión: declaración generada por la base de datos para obtener una única respuesta HTTP. Puede construir la consulta en la URL o combinar varias declaraciones en el campo de entrada para intentar generar la respuesta.

Blind SQLi: la inyección de SQL ciego es un tipo de inyección de SQL en el que el atacante no obtiene una respuesta explícita de la base de datos atacada, sino que observa el comportamiento del servidor de la base de datos y la aplicación para reconstruir la estructura de la base de datos de forma incremental. La inyección ciega de SQL también se conoce como inyección inferencial de SQL.

Basado en booleanos: aquí, el atacante envía una consulta SQL a la base de datos y le pide a la aplicación que devuelva diferentes resultados dependiendo de si la consulta devuelve Verdadero o Falso.

Basado en el tiempo: en este ataque, un atacante envía una consulta SQL a una base de datos y hace que la base de datos espere una cantidad específica de tiempo antes de compartir los resultados. El tiempo de respuesta ayuda a un atacante a determinar si una consulta es verdadera o falsa.

SQLi fuera de banda: la inyección de SQL fuera de banda (OOB SQLi) es un tipo de inyección de SQL en el que el atacante no recibe una respuesta de la aplicación atacada a través del mismo canal de comunicación, pero puede ser engañado para que envíe datos a un punto final remoto controlado por el atacante. La inyección SQL fuera de banda solo es posible si el servidor que está utilizando tiene comandos que activan solicitudes DNS o HTTP. Sin embargo, esto se aplica a todos los servidores SQL populares.

Ejemplo en SQLi

El primer ejemplo es muy simple. Muestra cómo un atacante puede usar una vulnerabilidad de inyección SQL para eludir la seguridad de la aplicación y autenticarse como administrador.

El siguiente script es un pseudocódigo ejecutado en un servidor web. Es un ejemplo simple de autenticación con un nombre de usuario y una contraseña. La base de datos de ejemplo tiene una tabla denominada userscon las siguientes columnas: usernamey password.

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)

password' OR 1=1

SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'

-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16

Las organizaciones pueden aplicar las siguientes políticas para protegerse contra los ataques de inyección SQL.

  1. Nunca confíes en la entrada del usuario. Siempre deben desinfectarse antes de usarlos en sentencias SQL dinámicas.
    Procedimientos almacenados: le permite encapsular declaraciones SQL y tratar todas las entradas como parámetros.
  2. Declaraciones preparadas: declaraciones preparadas que funcionan construyendo primero una declaración SQL y luego procesando los datos de usuario enviados como parámetros. Esto no afecta la sintaxis de las sentencias SQL.
    Expresiones regulares: se pueden usar para detectar código potencialmente malicioso y eliminarlo antes de que se ejecute una instrucción SQL.
  3. Permisos de usuario de conexión a la base de datos: la cuenta utilizada para conectarse a la base de datos solo debe tener los permisos necesarios. Esto ayuda a reducir el rendimiento de las sentencias SQL en el servidor.
  4. Mensajes de error: no revelan información confidencial ni la ubicación exacta del error. “Lo siento, ha ocurrido un error técnico. He contactado con el equipo técnico. Vuelva a intentarlo más tarde” en lugar de mostrar la instrucción SQL que provocó el error.

Esto es exactamente lo que hace un firewall de aplicaciones web (WAF). Analice todas las entradas de los usuarios en su aplicación web en busca de coincidencias con código sospechoso.

Esperamos que hayas entendido la comparación y claro con los conceptos.

¡Deja un comentario y comparte tus pensamientos!

del autor:

Akash Shekhavat ,Madhuri Shelke ,Chetan Shinde ,Swarali Sole

Referencias:

https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16

https://systemweakness.com/sql-injection-attacks-53e942aae1f8

https://qawerk.com/blog/que-es-la-inyeccion-sql/

https://brightsec.com/blog/sql-injection-attack/