Inyección SQL

SQL (Structured Query Language) es un lenguaje que nos permite interactuar con bases de datos. Las aplicaciones web modernas usan bases de datos para administrar datos y mostrar contenido dinámico a los lectores.

La inyección SQL, o SQLi, es un ataque a una aplicación web al comprometer su base de datos a través de declaraciones SQL maliciosas.

Como es un ataque común, tratemos de aprender más sobre qué es, cómo sucede y cómo defenderse de él.

¿Qué es una inyección SQL?

La inyección SQL es un tipo de ataque a una aplicación web que permite que un atacante inserte sentencias SQL maliciosas en la aplicación web, potencialmente obteniendo acceso a datos sensibles en la base de datos o destruyendo estos datos. La inyección SQL fue descubierta por primera vez por Jeff Forristal en 1998.

En las dos décadas transcurridas desde su descubrimiento, la inyección SQL ha sido siempre la principal prioridad de los desarrolladores web al diseñar aplicaciones.

Estas inyecciones permiten a los usuarios malintencionados eludir los controles de seguridad existentes y obtener acceso no autorizado para obtener, modificar y extraer datos, incluidos registros de clientes, propiedad intelectual o información personal.

Los atacantes también pueden usar esta técnica para localizar las credenciales de los administradores y obtener un control completo sobre los sitios web, aplicaciones y servidores de bases de datos afectados.

Los ataques de inyección SQL pueden afectar a cualquier aplicación que use una base de datos SQL y maneje datos, incluidos sitios web, computadoras de escritorio y aplicaciones telefónicas, con consecuencias extremadamente graves.

Se estimó que en 2012 el 97% de las violaciones de datos se inician con un ataque de inyección SQL. Incluso hoy en día prevalece una inyección SQL y se reconoce ampliamente la gravedad de los ataques de inyección en una aplicación web.

Es uno de los diez riesgos de seguridad de aplicaciones web más críticos de OWASP.

¿Cómo funciona?

Las inyecciones SQL generalmente se realizan a través de la página web o la entrada de la aplicación. Estos formularios de entrada a menudo se encuentran en características como cuadros de búsqueda, campos de formulario y parámetros de URL.

Para realizar un ataque de inyección SQL, los atacantes necesitan identificar vulnerabilidades dentro de una página web o aplicación. Después de localizar un objetivo, los atacantes crean cargas maliciosas y envían su contenido de entrada para ejecutar comandos maliciosos.

En algunos casos, los actores maliciosos pueden simplemente aprovechar un programa automatizado para llevar a cabo una inyección SQL para ellos; todo lo que necesitan proporcionar es la URL del sitio web objetivo para obtener datos robados de la víctima.

Vamos a ver un ejemplo de inyección SQL.

Imagina el flujo de trabajo de una aplicación web típica que involucra solicitudes de bases de datos a través de las entradas del usuario. Toma la entrada del usuario a través de un formulario, digamos un formulario de inicio de sesión. Luego consulta su base de datos con los campos enviados por el usuario para autenticarlos.

La estructura de la consulta a su base de datos es algo como esto:

select * from user_table
where username = ‘sdaityari’
and password = ‘mypassword’;

Para simplificar, supongamos que estás almacenando tus contraseñas como texto sin cifrar. Sin embargo, es una buena práctica saltear las contraseñas y luego hacerlas hash. Continuando, si has recibido el nombre de usuario y la contraseña del formulario, puedes definir la consulta en PHP de la siguiente manera:

// Connect to SQL database
$db_query = «select * from user_table where
username = ‘».$user.»‘
AND password = ‘».$password.»‘;»;
// Execute query

Si alguien ingresa el valor «admin ‘; -» en el campo de nombre de usuario, la consulta SQL resultante que genera la variable $ db_query será la siguiente:

select * from user_table where
username = ‘admin’;–‘ and password = ‘mypassword’

¿Qué hace esa consulta?

Un comentario en SQL comienza con guiones dobles (-). La consulta resultante solo se filtra por el nombre de usuario sin tener en cuenta la contraseña. Si no existiera seguridad para evitar esto, se le otorgaría acceso administrativo a la aplicación web simplemente usando este truco.

Alternativamente, un ataque booleano también puede usarse en este ejemplo para obtener acceso. Si un atacante ingresa «contraseña» o 1 = 1; – «en el campo de contraseña, la consulta resultante sería la siguiente:

select * from user_table where
username = ‘admin’ and
password = ‘password’ or 1=1;–‘;

En este caso, incluso si tu contraseña es incorrecta, se autenticará en la aplicación. Si tu página web muestra los resultados de la consulta de la base de datos, un atacante puede usar el comando show tables, el comando para mostrar las tablas en la base de datos y luego soltar selectivamente las tablas si así lo desea.

Tipos

Las inyecciones SQL se enumeraron como la amenaza número uno para la seguridad de las aplicaciones web en el OWASP Top 10, y las vulnerabilidades de inyección SQL se pueden explotar de varias maneras diferentes.

Algunos métodos comunes para inyecciones SQL incluyen ejecutar comandos en el servidor de la base de datos, recuperar datos basados ​​en errores o interferir con la lógica de la consulta.

1. Inyección SQL basada en la unión

Este tipo de inyección SQL es el método más popular realizado por los atacantes.

Esta técnica de inyección permite a los actores maliciosos extraer datos de la base de datos al extender los resultados de la consulta original. Utiliza el operador UNION SQL para integrar dos instrucciones SELECT en un solo resultado, luego lo devuelve como parte de la respuesta.

2. Inyección SQL ciega

Por lo general, más sofisticadas y difíciles de realizar que otras variedades de inyecciones, los atacantes realizan inyecciones SQL ciegas cuando se reciben mensajes de error genéricos del objetivo.

Las inyecciones SQL ciegas se diferencian de las inyecciones SQL normales en el método en el que recuperan información de la base de datos. En esta técnica, los atacantes consultan la base de datos en busca de preguntas verdaderas o falsas, luego determinan la respuesta en función de la respuesta, así como el tiempo que lleva recuperar una respuesta del servidor cuando la usa con ataques basados ​​en el tiempo.

3. Inyección SQL basada en Boolean

Este tipo de ataque sobrescribe la lógica y las condiciones de la consulta. Se usa comúnmente en consultas de permisos o autenticación, donde engañan a la base de datos para que piense que tienen permisos elevados o credenciales correctas.

Las inyecciones SQL basadas en booleanos también se usan en inyecciones SQL ciegas, donde proceden por eliminación para extraer datos de la base de datos. Al enviar toneladas de solicitudes, cada una con una condición ligeramente diferente de los precedentes, los atacantes pueden averiguar cuáles son los datos almacenados en función del resultado de la operación.

4. Inyección SQL basada en errores

En una inyección de SQL basada en errores, los atacantes explotan los errores de la base de datos de una página web o aplicación que han sido activados por entradas no desinfectadas.

Durante un ataque, esta técnica utiliza mensajes de error para devolver los resultados completos de la consulta y revelar información confidencial de la base de datos. Este método también se puede utilizar para identificar si un sitio web o aplicación web es vulnerable y obtener información adicional para reestructurar consultas maliciosas.

5. Inyección SQL basada en el tiempo

Durante una inyección SQL normal, los actores maliciosos simplemente pueden leer el texto a medida que se devuelve. Sin embargo, cuando los atacantes no pueden recuperar información de un servidor de base de datos, a menudo emplean inyecciones SQL basadas en el tiempo para lograr sus resultados. Esto funciona mediante operaciones que tardan mucho tiempo en completarse, a menudo muchos segundos.

Las inyecciones SQL basadas en el tiempo se usan comúnmente para determinar si hay vulnerabilidades en una aplicación web o sitio web, así como en combinación con técnicas booleanas durante las inyecciones SQL ciegas.

Cómo detectar una inyección SQL

Las inyecciones SQL son notoriamente difíciles de detectar. A diferencia de las secuencias de comandos entre sitios, la inyección remota de código y otros tipos de infecciones, las inyecciones SQL son vulnerabilidades que no dejan rastros en el servidor.

En cambio, el exploit ejecuta consultas genuinas en la base de datos. Como resultado, la mayoría de los ataques se detectan una vez que un atacante ha utilizado una vulnerabilidad para realizar acciones maliciosas o ha obtenido acceso administrativo.

Al tomar medidas de precaución y monitorizar activamente tu base de datos y sus consultas, puedes identificar si un atacante está ejecutando inyecciones maliciosas en tu sitio web.

Cómo prevenir ataques de inyección SQL

Los atacantes con frecuencia se dirigen a sitios web que usan vulnerabilidades conocidas. Las vulnerabilidades no reveladas, sin parches o de día cero también representan un gran porcentaje de inyecciones SQL durante los ataques dirigidos.

La forma más fácil de proteger tu sitio web contra las inyecciones de SQL es mantener actualizado todo el software y los componentes de terceros. Sin embargo, existen varias técnicas que puedes usar para ayudar a prevenir vulnerabilidades de inyección SQL.

Usa declaraciones preparadas con consultas parametrizadas

Las declaraciones preparadas se utilizan para garantizar que ninguna de las variables dinámicas que necesita en una consulta pueda escapar de su posición. La consulta principal se define de antemano, con los argumentos y sus tipos después.

Como la consulta conoce el tipo de datos que se esperan, como la cadena o el número, saben exactamente cómo integrarlos a la consulta sin causar problemas.

Incluso si las variables de nombre de usuario o contraseña intentan escapar de la consulta, las declaraciones preparadas escapan correctamente de sus caracteres para evitar comportamientos inesperados o inyecciones SQL.

Usa procedimientos almacenados

Los procedimientos almacenados son operaciones frecuentes de SQL que se almacenan en la propia base de datos, que varían solo con sus argumentos. Los procedimientos almacenados hacen que sea mucho más difícil para los atacantes ejecutar su SQL malicioso, ya que no se puede insertar dinámicamente en las consultas.

Validación de entrada de la lista blanca

Como regla general, no confíes en los datos enviados por el usuario. Puedes realizar la validación de la lista blanca para probar la entrada del usuario en un conjunto existente de entrada conocida, aprobada y definida.

Cada vez que se reciben datos que no cumplen con los valores asignados, se rechazan, protegiendo la aplicación o el sitio web de las inyecciones SQL maliciosas en el proceso.

Hacer cumplir el principio de menor privilegio

El Principio de Privilegio Mínimo es un principio de informática que fortalece los controles de acceso a tu sitio web para mitigar las amenazas de seguridad.

Para implementar este principio y defenderte de las inyecciones SQL:

  • Usa el conjunto mínimo de privilegios en sus sistemas para realizar acciones.
  • Otorga privilegios solo por el tiempo que la acción sea necesaria.
  • No asignes derechos de acceso de tipo administrador a las cuentas de la aplicación.
  • Minimiza los privilegios para cada cuenta de base de datos en tu entorno.

Entrada proporcionada por el usuario de escape

Durante una inyección SQL normal, los actores maliciosos simplemente pueden leer el texto a medida que se devuelve. Sin embargo, cuando los atacantes no pueden recuperar información de un servidor de base de datos, a menudo emplean inyecciones SQL basadas en el tiempo para lograr sus resultados. Esto funciona mediante operaciones que tardan mucho tiempo en completarse, a menudo muchos segundos.

Las inyecciones SQL basadas en el tiempo se usan comúnmente para determinar si hay vulnerabilidades en una aplicación web o sitio web, así como en combinación con técnicas booleanas durante las inyecciones SQL ciegas.

Usa un firewall de aplicaciones web

Puedes protegerte contra inyecciones genéricas de SQL con un firewall de aplicación web. Al filtrar solicitudes web potencialmente peligrosas, los firewalls de aplicaciones web pueden detectar y evitar inyecciones SQL.

Qué hacer si tu sitio web ha sido pirateado por inyección SQL

En el caso de una inyección SQL, hay varios pasos que puedes seguir para arreglar tu sitio web.

Localiza el código vulnerable

El primer paso para recuperarse de un ataque de inyección SQL es identificar dónde se encuentra la vulnerabilidad. Puedes iniciar un ataque manualmente o ejecutar una herramienta de ataque de inyección SQL automatizada como Havij, SQLmap o jSQL para identificar el código vulnerable.

Eliminar contenido inyectado y puertas traseras

Una vez que haya obtenido información sobre la ubicación del malware, elimine las inyecciones maliciosas y los datos incorrectos de su base de datos y restaure a un estado limpio. También querrá verificar el resto de su sitio web y sistemas de archivos para puertas traseras.

Parchea la vulnerabilidad

Las vulnerabilidades en bases de datos, aplicaciones y componentes de terceros son frecuentemente explotadas por hackers. Una vez que hayas identificado el software vulnerable, aplica parches y actualizaciones al código vulnerable junto con cualquier otro componente desactualizado.

Actualiza tus datos

Cuando se produce un compromiso, es importante cambiar todas las contraseñas y los secretos de la aplicación tan pronto como se repare la vulnerabilidad. Evita la reinfección limpiando tus datos para asegurarte de que no haya usuarios administradores corruptos o puertas traseras presentes en la base de datos.

Supervisar declaraciones SQL

Configura un monitor para identificar las declaraciones SQL falsas en tu base de datos. Una herramienta que utiliza análisis de comportamiento y / o aprendizaje automático puede ayudar a detectar indicadores de compromiso (IoC) en tu sitio web.

Configurar un WAF

Considera configurar un firewall de aplicación web para filtrar solicitudes maliciosas a tu sitio web. Estos pueden ser particularmente útiles para proporcionar protección contra nuevas vulnerabilidades antes de que los parches estén disponibles.

¿Es legal la inyección SQL?

Definitivamente sí! Aunque existe una vulnerabilidad real, un atacante todavía está tratando de obtener acceso a datos que de otra manera no estarían disponibles para ellos.

Imagina un escenario en el que alguien deja sus llaves en el coche. ¿Conducir en él constituye un delito solo porque se dejó abierto y desatendido?

El acto de inyección SQL cae bajo diferentes leyes en varios países. Se incluye en la Ley de abuso y fraude informático (1986) en los EEUU, y en la Ley de uso indebido de la computadora (1990) en el Reino Unido.

Resumen

Las vulnerabilidades de inyección SQL fueron descubiertas hace mucho tiempo. Sin embargo, un informe de 2018 sobre sitios web pirateados sugiere que SQLi es el pirateo de sitios web más común después de los ataques XSS.

Para evitar que sucedan, debes:

  • Comprender cómo funciona la vulnerabilidad de inyección SQL
  • Explorar varias formas en que los atacantes pueden usar SQLi para obtener acceso no autorizado a tu aplicación web
  • Implementar métodos para proteger tu sitio web de ataques SQLi, como escapar de las entradas de los usuarios y usar declaraciones preparadas
  • Seguir una rutina de control de seguridad

Hay muchos tipos de inyecciones de código, no solo SQL. También hay muchos tipos de inyección SQL, no solo los ejemplos anteriores.

La mayoría de las veces, este problema deriva de administradores y programadores perezosos que deberían hacerlo mejor. Otras veces, este es un vector altamente complicado que requiere un poco de conocimiento para lograrlo.

Algunos factores atenuantes incluyen mantener todos los scripts SQL definidos dentro de los procedimientos almacenados y administrar los permisos en consecuencia para que un compromiso no hunda todo el barco. Dicho esto, la mayoría de las veces, simplemente un error del programador.

Ahora ya sabes qué vigilar y qué buscar.