¿Qué es la inyección SQL? Cómo prevenir ataques SQLi

Publicado: 2023-09-15

Las aplicaciones web potencian nuestra experiencia en línea día tras día. Nos conectamos, interactuamos, compramos y miramos videos divertidos de gatos, todo usando aplicaciones web. Brindan servicios comerciales vitales y contienen datos confidenciales, pero cuanto más usamos algo, más propenso se vuelve a sufrir ataques.

Un ciberataque al que hay que prestar atención en aplicaciones que explotan vulnerabilidades en el lenguaje de consulta estructurado (SQL) es la común y peligrosa inyección de SQL.

Los ataques de inyección SQL provocan acceso inadecuado a los datos, manipulación, robo de identidad, pérdidas financieras, daños a la reputación y consecuencias legales. Los desarrolladores y las organizaciones deben comprender sus riesgos e implementar medidas de seguridad completas. Herramientas como el software de firewalls de aplicaciones web (WAF) y el software forense digital están diseñadas para protegerse contra ataques de inyección SQL. Las empresas también pueden depender de paquetes integrales de seguridad de sitios web para proteger sus aplicaciones.

Lea esta hoja de trucos de inyección SQL para saber cómo se ejecutan los ataques SQL con ejemplos, sus variaciones y cómo prevenir dichos ataques.

¿Por qué son peligrosos los ataques de inyección SQL?

La inyección SQL ha estado en la lista de los 10 principales riesgos de seguridad de aplicaciones web del Open Worldwide Application Security Project (OWASP) durante años. Sólo en 2022, OWASP encontró más de 274.000 casos de algún tipo de inyección en las aplicaciones que probaron; La inyección SQL y los scripts entre sitios (XSS) fueron los más comunes.

Los atacantes pueden utilizar inyecciones de SQl para provocar:

  • Errores en aplicaciones web al modificar o eliminar información dentro de una base de datos.
  • Violaciones de datos si los piratas informáticos obtienen acceso no autorizado a datos confidenciales almacenados en bases de datos, como información personal, registros financieros o contraseñas.
  • Sistemas comprometidos al acceder a sistemas adicionales no autorizados que utilizan las mismas bases de datos compartidas. Esto permite a los atacantes escalar sus ataques a otros sistemas en la misma red o realizar denegación de servicio distribuido (DDoS).

Estas acciones destructivas dañan irrevocablemente a las empresas. Los delitos comprometen la privacidad y la integridad de los datos, lo que provoca una pérdida de confianza del cliente y de reputación empresarial. También añade una carga financiera a la empresa que se enfrenta a las consecuencias.

Ejemplos de ataques de inyección SQL de la vida real

Han pasado más de dos décadas desde que la inyección SQL apareció por primera vez. Veinte años después, sigue siendo notorio, como lo demuestran los siguientes incidentes destacados de inyección SQL.

  • Heartland Payments Systems: En 2008, Heartland Payments Systems sufrió lo que fue una de las mayores filtraciones de datos de la historia, exponiendo más de 130 millones de detalles de tarjetas de crédito y débito a través de un ataque SQLi. Heartland pagó millones en multas.
  • Yahoo : en 2012, un ataque de inyección SQL comprometió los detalles de las cuentas de casi 5 millones de usuarios de Yahoo, incluidas direcciones de correo electrónico y contraseñas.
  • Freepik: los piratas informáticos robaron los correos electrónicos y las contraseñas de 8,3 millones de usuarios de Freepik y Flaticon en 2020 durante un ataque de inyección SQL contra el sitio web Flaticon de la empresa.
  • WooCommerce: el popular complemento de WordPress solucionó una vulnerabilidad de inyección SQL que expuso a 5 millones de sitios al robo de datos.
  • BillQuick: Los ciberdelincuentes aprovecharon una vulnerabilidad SQL ciega en la popular plataforma de facturación para difundir ransomware.
  • MOVEit: En mayo de 2023, la banda de ransomware Cl0p utilizó una vulnerabilidad de inyección SQL en la herramienta de software de transferencia de archivos administrada MOVEit, lo que afectó a más de 1000 organizaciones y al menos a 60 millones de personas, lo que la convierte en la mayor filtración de datos en lo que va del año.

¿Cómo funciona un ataque de inyección SQL?

Veamos los conceptos básicos de las bases de datos y las consultas SQL que utilizamos en las aplicaciones web modernas. Esto nos ayudará a comprender mejor el funcionamiento interno de la inyección SQL.

Todos los sitios web utilizan bases de datos relacionales, también llamadas bases de datos SQL, para almacenar datos sobre sus usuarios y aplicaciones. Podría ser información de usuario, credenciales de inicio de sesión, información de pago o cualquier otra cosa sobre la empresa. Tomemos como ejemplo un sitio web de comercio electrónico. Almacena datos de productos, cuentas de usuario, datos de pedidos e información de pago en su base de datos.

Luego, los sitios web toman los datos de estas bases de datos y ofrecen contenido o servicios específicos para los usuarios. Este proceso ocurre gracias a SQL, un lenguaje de programación estandarizado utilizado para administrar bases de datos. Siempre que necesita obtener algo de una aplicación, digamos su historial de compras, de hecho, está realizando una solicitud a la base de datos mediante consultas SQL, un comando que indica a una base de datos que realice una acción específica.

En un intento por hacer que las interacciones web sean fluidas, muchos sitios web permiten a los usuarios ingresar datos para realizar consultas SQL. Esto puede incluir cosas como términos de búsqueda, nombres de usuario o detalles de pago.

Considere el ejemplo del sitio web de comercio electrónico. Una consulta SQL simple para mostrar su historial de pedidos desde la base de datos con la tabla "pedidos" (o) y una tabla "productos" (p) será la siguiente:

SELECCIONE o.order_id, o.order_date, p.product_name, p.price

DE pedidos o

UNIRSE a productos p ON o.product_id = p.product_id

DONDE o.user_id = 12345;

Este código SQL selecciona el ID del pedido y la fecha de la tabla de pedidos, junto con el nombre del producto y el precio de la tabla de productos para el ID de USUARIO 12345 de la base de datos del sitio web. Normalmente, la identificación se basará en la entrada del usuario. Los problemas surgen cuando la entrada no se verifica y controla adecuadamente. Los atacantes aprovechan esta vulnerabilidad para llevar a cabo un ataque de inyección SQL.

Así es como suele desarrollarse.

  • Identificación de campos de entrada vulnerables: los atacantes comienzan por encontrar campos de entrada en la aplicación web donde potencialmente pueden inyectar código malicioso. Envían diferentes valores y ven cómo responde la aplicación. para saber si. Si la aplicación no valida o desinfecta adecuadamente la entrada del usuario, la aplicación procesa su entrada como código SQL. Esta vulnerabilidad potencial se utiliza para la inyección de código.
  • Inyección de código a través de la entrada del usuario: después de comprender cómo la aplicación maneja la entrada, los atacantes construyen una carga útil, que es una pieza de código SQL malicioso que aprovecha la vulnerabilidad. Esto incluye agregar caracteres de control SQL como comillas simples ('), comillas dobles (“) o iguales (=) para cambiar la estructura de la consulta SQL. El uso de estos caracteres de control con comandos SQL comunes como SELECT y FROM permite a los atacantes acceder o recuperar datos del servidor de la base de datos.

    Luego envían información especialmente diseñada junto con solicitudes legítimas, engañando a la aplicación para que trate el código sospechoso como una parte legítima de la consulta.
  • Ejecución: La base de datos, ajena al ataque, procesa la consulta y ejecuta el código inyectado como si fuera una solicitud legítima.
  • Explotación: dependiendo de la intención del atacante, el código SQL inyectado puede recuperar datos confidenciales, modificar o eliminar información o incluso otorgar acceso no autorizado. Esto compromete la seguridad de la aplicación, exponiendo potencialmente información confidencial.

Ejemplo de inyección SQL

Considere una aplicación web que utiliza un parámetro de URL para obtener detalles del producto en función de un ID de producto, como este:

http://ejemplo.com/products?id=1

Un atacante podría intentar inyectar código SQL malicioso para provocar un error y recuperar información como esta: http://example.com/products?id=1' OR 1=1;

Si la aplicación no valida y desinfecta adecuadamente la entrada del usuario, la consulta SQL podría manipularse de la siguiente manera:

SELECCIONE * DE productos DONDE OR 1=1; - - ';

En este caso, la consulta original fue diseñada para recuperar un producto con ID 1, pero la entrada del atacante modifica la consulta para devolver todos los productos debido a la adición de 1=1 y el doble guión adjunto (- -). Anula la comilla simple de cierre original y genera consecuencias que muestran todos los detalles del producto o revelan mensajes de error que los atacantes pueden aprovechar.

33%

de las vulnerabilidades críticas de aplicaciones web en 2022 se debieron a inyecciones de SQL.

Fuente: Estadista

La prevalencia generalizada de vulnerabilidades SQL y el atractivo de la base de datos de aplicaciones web con todos sus datos críticos para el negocio hacen de la inyección SQL uno de los ciberataques más persistentes.

Funcionamiento de la inyección SQL Fuente: Spiceworks

Tipos de ataques de inyección SQL

Hay tres tipos principales de ataques de inyección SQL según cómo los atacantes recuperan información o interactúan con la base de datos:

  1. SQLi clásico o en banda
  2. SQLi ciego o inferencial
  3. SQLi fuera de banda

1. SQLi clásico o en banda

Dentro de banda es el tipo más común de ataque de inyección SQL. El hacker clásico utiliza el mismo canal de comunicación (en banda) para inyectar código SQL malicioso y recuperar los resultados. Las dos variaciones principales de SQLi en banda son:

SQLi en banda basado en unión

Este ataque aprovecha el operador UNION SQL, utilizado para combinar datos del resultado de dos o más declaraciones SELECT. Al hacer esto, los atacantes pueden recuperar datos de tablas a las que no tienen acceso directo.

SQLi en banda basado en errores

En esta técnica, un atacante desencadena intencionalmente errores en una consulta SQL para explotar los mensajes de error devueltos por la base de datos. Los errores pueden revelar información valiosa sobre la estructura de la base de datos, los nombres de las tablas, los nombres de las columnas y, a veces, los datos mismos. SQLi basado en errores también se puede ejecutar como SQLi fuera de banda.

2. SQLi inferencial (ciego)

En un SQLi ciego, el atacante no puede ver directamente los resultados de su ataque. En cambio, infieren información observando el comportamiento de las aplicaciones o los mensajes de error que responden a sus consultas. Este tipo de ataque requiere mucho tiempo ya que los piratas informáticos deben realizar una serie de consultas SQL para encontrar posibles vulnerabilidades que explotar. Dos variaciones de SQLi ciego son:

SQLi ciego basado en tiempo

Aquí, los atacantes realizan consultas que hacen que la base de datos retrase su respuesta antes de reaccionar. Infieren información sobre la base de datos prestando atención al tiempo de respuesta.

SQLi ciego booleano

Para SQLi ciego booleano, los atacantes aprovechan la forma en que una aplicación responde a condiciones verdaderas o falsas en consultas SQL. Según las respuestas de la aplicación web, infieren información sobre la base de datos, aunque no se devuelven datos de la base de datos.

3. SQLi fuera de banda

Un ataque SQLi fuera de banda hace que la aplicación envíe datos a un punto final remoto controlado por los piratas informáticos. Un ataque como este requiere que los servidores SQL tengan ciertas características, como poder iniciar solicitudes de red externa como solicitudes de Protocolo de transferencia de hipertexto (HTTP).

Cómo prevenir ataques de inyección SQL: una hoja de trucos

Prevenir la inyección de SQL requiere un enfoque de múltiples capas que implique práctica de codificación segura y monitoreo continuo. Aquí hay una hoja de trucos con pasos esenciales para ayudarlo a mantenerse a salvo de ataques de inyección SQL.

Utilice declaraciones preparadas

La principal defensa contra los ataques de inyección SQL son las declaraciones preparadas con consultas parametrizadas. Las declaraciones preparadas garantizan que las entradas del usuario se traten como datos en lugar de código ejecutable.

Los desarrolladores compilan códigos SQL para consultas de antemano como plantillas con marcadores de posición para los valores de entrada del usuario. En el momento de la ejecución de la consulta, las declaraciones preparadas vinculan valores reales en lugar de marcadores de posición. Esto detiene la ejecución de código malicioso.

Se prefieren las declaraciones preparadas a las declaraciones SQL dinámicas. Escriben consultas SQL durante el tiempo de ejecución, lo que los debilita frente a ataques de inyección.

Declaraciones preparadas en lenguajes de programación populares:

A continuación se ofrecen recomendaciones específicas del lenguaje para utilizar declaraciones preparadas (consultas parametrizadas) en la programación de bases de datos populares:

  • Edición empresarial de Java (EE): utilice la clase PreparedStatement del paquete java.sql. Vincule parámetros utilizando métodos como setString , setInt , etc.
  • Python (SQLite3) : utilice marcadores de posición ( ? ) en consultas. Vincula parámetros usando una tupla o lista .
  • PHP: utilice la extensión PHP de objetos de datos (PDO) . Utilice declaraciones preparadas con marcadores de posición (:). Vincula parámetros con bindValue o bindParam .
  • .NET : utilice el objeto MySqlCommand . Vincule parámetros usando Parameters.AddWithValue .

Otro método de prevención de inyección SQL es el uso de procedimientos almacenados o un grupo de códigos SQL precompilados que se pueden usar una y otra vez.

Practica la validación de entradas

La validación de entradas implica verificar la entrada del usuario para asegurarse de que cumpla con criterios específicos antes de procesarla. Una lista de permitidos, también conocida como lista blanca, es un aspecto clave de la validación de entradas. Aquí, sólo se aceptan valores o patrones predefinidos y seguros como parte de las consultas SQL. Cualquier entrada que no coincida con los criterios establecidos se rechaza. Esto evita activamente que entradas malignas o inesperadas entren en el sistema.

Utilice bibliotecas de mapeo relacional de objetos

Las bibliotecas de mapeo relacional de objetos (ORM) son herramientas valiosas para los desarrolladores que trabajan con bases de datos relacionales. Permiten a los desarrolladores interactuar con bases de datos utilizando el lenguaje de programación de su elección y, por lo tanto, reducen la necesidad de escribir consultas SQL sin formato. Las bibliotecas ORM brindan protección integrada contra ataques de inyección SQL.

Capacite a los desarrolladores y equipos de TI sobre prácticas de codificación segura. Asegúrese de realizar auditorías de seguridad y pruebas de penetración periódicas para encontrar vulnerabilidades.

Consejo: Ayude a sus programadores y desarrolladores a aprender codificación segura más rápido con herramientas de capacitación en código seguro.

Hacer cumplir el principio de privilegio mínimo

El principio de privilegio mínimo sólo otorga a los usuarios de la base de datos el permiso mínimo necesario para realizar su trabajo. Seguir este principio reduce el impacto de posibles ataques de inyección SQL o cualquier ciberataque. Además, aplique un estricto control de acceso a su base de datos.

Implementar un firewall de aplicaciones web (WAF)

Un WAF monitorea el tráfico de red entrante de aplicaciones y bloquea el tráfico malicioso potencial basándose en una lista de firmas de ataques conocidas.

Las 5 principales herramientas de firewall de aplicaciones web (WAF):

  1. Firewall de aplicaciones web de Azure
  2. WAF de AWS
  3. Cortafuegos de aplicaciones web (WAF) Imperva
  4. Espectro de nube
  5. Firewall de aplicaciones web de Symantec y proxy inverso

* Arriba se muestran las cinco soluciones WAF líderes del Informe Grid de verano de 2023 de G2.

Un WAF emplea reglas predefinidas para detectar patrones sospechosos y anomalías en el tráfico entrante, como palabras clave SQL y cargas útiles maliciosas. Desinfecta y valida las entradas de los usuarios y bloquea o filtra solicitudes dañinas. Esto ayuda a detener consultas SQL peligrosas cuando ingresan al sistema.

Los WAF modernos se adaptan a nuevos métodos de ataque mediante el aprendizaje automático.

Otras herramientas de seguridad para prevenir ataques de inyección SQL

Además de WAF, otras plataformas de seguridad impiden los ataques de inyección SQL.

  • Los escáneres de vulnerabilidades buscan vulnerabilidades conocidas y desconocidas en aplicaciones web.
  • Las herramientas de prueba de seguridad de aplicaciones estáticas (SAST) y el software de análisis de código estático encuentran vulnerabilidades de seguridad sin ejecutar código.
  • El software de prueba de seguridad de aplicaciones dinámicas simula ataques a aplicaciones en ejecución e identifica debilidades.
  • Los sistemas de detección y prevención de intrusiones y el software forense digital investigan anomalías y ataques a aplicaciones en tiempo real.

Haga clic para chatear con G2s Monty-AI

Proteja sus fortalezas de datos

Los ataques de inyección SQL representan una grave amenaza para la seguridad de las aplicaciones web. Las empresas corren el riesgo de perder datos valiosos, la privacidad de los usuarios y su buena reputación si los ataques tienen éxito.

Si bien ninguna solución única garantiza una seguridad absoluta contra la inyección de SQL, la combinación de las medidas preventivas de las que hablamos aquí reduce significativamente la posibilidad de ataques. Los desarrolladores web y administradores de bases de datos deben emplear defensas estrictas y fortalecer sus aplicaciones web contra una posible explotación.

¿Quiere una solución integral para proteger su sitio web? Explore el software de seguridad web y cómo ayuda contra los ciberataques que provocan filtraciones de datos.