Blog
dark mode light mode Search Archivos descargables
Search

Qué es una Inyección SQL (SQL Injection) y cómo solucionarla

SQL Injection

8 minutos de lectura

La inyección SQL es un tipo de vulnerabilidad en la que un atacante inserta su propio código en un sitio web con el fin acceder a datos protegidos o sensibles.

Una vez que esto ocurre, el atacante puede realizar todo tipo de acciones: desde controlar la base de datos del sitio web hasta secuestrar la información de los usuarios.

Riesgos de la vulnerabilidad

Los ataques SQL pueden tener muy diversas consecuencias para las empresas, como por ejemplo:

  • Daños al sitio web: un atacante puede borrar o modificar la base de datos de una empresa y, en consecuencia, destruir el sitio web.
  • Robo o filtración de datos: muchos ataques tienen por objetivo robar datos confidenciales tales como secretos comerciales, información sensible, propiedad intelectual y, con más frecuencia, información de los usuarios o clientes de la empresa. Luego, esta información puede ser vendida a la competencia para adquirir ventajas comerciales.
  • Escalación de privilegios: un atacante podría usar el contenido de una base de datos quebrantada para acceder a otras partes de la red interna de una empresa.
  • Pérdida de reputación y confiabilidad: muchas veces, resulta difícil que una empresa recupere la confianza de sus clientes luego de recibir un ciberataque.

Casos comunes de Inyección SQL

Para estas alturas hemos hablado de los riesgos y el peligro que representa una inyección de SQL en tu página. Ahora es momento de ver un par de ejemplos para dimensionar mejor este tipo de vulnerabilidad.

1. Inyección SQL mediante introducción de datos del usuario

Esta es una de las formas más conocidas de perpetrar el ataque, ya que muchas páginas web recopilan las entradas de datos de los usuarios y las transmiten al servidor. 

Esto quiere decir que, por ejemplo, si alguien hace un pedido por Internet y pone la dirección de su hogar, este dato se recopila. Ocurre lo mismo en un apartado de comentarios o de reseñas de usuario, y así con miles de casos más.

Por ejemplo al iniciar sesión en una página web:

En lugar de completar los campos con contenido o respuestas comunes, los atacantes introducen su propia sentencia de código SQL.

Si el control de entrada de datos es deficiente, el sitio web envía el contenido del formulario a su servidor y el código malicioso inyectado se ejecuta.

2. Inyección SQL mediante parámetros de una aplicación

Al ingresar la URL de un sitio web en el navegador, tiene lugar una rápida secuencia de comunicaciones con un servidor cuyo propósito es ofrecer información al mismo. En este proceso, el sitio web solicita información a la base de datos (contraseñas, teléfonos, etc).

Un atacante puede meter sigilosamente su código SQL malicioso en las solicitudes del navegador, las cuales, si no se preparan y protegen correctamente, se ejecutarán en la base de datos del sitio web, localizada en el servidor.

3. Inyección SQL mediante herramientas de hackeo automáticas

Existen herramientas de inyección SQL automáticas, como SQLMAP, SQLHelper 2.7 SQL Injection o Pangolin que detectan y se aprovechan de las vulnerabilidades presentes en un sitio web determinado y en su base de datos.

Por ejemplo, SQLMAP es una herramienta popular entre los desarrolladores de sitios web que quieren proteger sus sitios de las inyecciones SQL. Pero, en definitiva, no hay nada que impida a las personas utilizar SQLMAP con malas intenciones.

¿Cómo prevenir la Inyección SQL?

1. Consultas parametrizadas

Las consultas parametrizadas no concatenan las variables a la consulta SQL, sino que usan una sintaxis específica para pasar un conjunto de parámetros predeterminados a la consulta SQL. Veámoslo en un ejemplo con las siguientes variables:

$nombre = “Jhon”
$clave = “123”

Con la consulta SQL convencional se vería así:

String consulta = “select nombre from Usuarios where nombre =
$nombre and clave = $clave;”

En este caso, las variables se concatenan a la consulta sin ningún tipo de control y un atacante podría inyectar código SQL malicioso con mucha facilidad.

Con la consulta SQL con parámetros, en cambio, se vería así:

String consulta = “select nombre from Usuarios where nombre =? and clave =?”; 

sentencia = conexion.prepareStatement(consulta);
sentencia.setString(1, $nombre);
sentencia.setString(2, $clave);

En este último caso, se construye de otra forma utilizando el carácter de interrogación ?

Luego, con el código sentencia.setString (1, $nombre) se pasan los valores a la consulta. 

El parámetro 1 refiere a la posición que tendrá en la consulta, en este caso al nombre. Si el valor fuera 2, se referiría a la clave. El parámetro $nombre refiere a la variable con el dato a pasar.

2. ORM (Object Relational Mapping)

El ORM es un modelo de programación que transforma las tablas de una base de datos en entidades para simplificar en gran medida la tarea del programador y acelerar el desarrollo de aplicaciones. Gracias al mapeo automático se puede cambiar de motor de base de datos fácilmente y cuando sea requerido.

Las acciones Insertar, Leer, Actualizar y Borrar a ejecutar sobre la base de datos se realizan de forma indirecta por medio del ORM.

Los ORM tienen el objetivo de liberarnos de la escritura o generación manual de código SQL necesario para realizar las consultas. Algunos ejemplos de estos son:

  • Java
    • Hibernate
    • iBatis
    • Ebean
  • .NET
    • nHibernate
    • Entity Framework
  • PHP
    • Doctrine
    • Propel

3. WAF (Web Application Firewall)

Un firewall de aplicaciones web o WAF ayuda a proteger las aplicaciones web al filtrar y monitorear el tráfico HTTP entre una aplicación e Internet. Al desplegar un WAF frente a una aplicación web, se coloca un escudo entre el sistema web e Internet. 

Por lo general, protege a las aplicaciones web de ataques tales como la ejecución de archivos maliciosos, cross-site-scripting (XSS), inyección de SQL, entre otros. 

Hackmetrix Insight: Si buscas un WAF, encontramos una relación precio-calidad bastante decente con CloudflareZone Lockdown de Cloudflare.

Un pentest nunca está de más

Recuerda que una inyección de SQL no es la única vulnerabilidad que amenaza tu plataforma, por lo tanto, es recomendable realizar pruebas de intrusión de forma periódica para detectar estas vulnerabilidades y otras fallas de seguridad que pudieran estar presentes tanto en la aplicación como en las redes de tu empresa. 

En Hackmetrix contamos con pentesters calificados que simulan ataques reales, reportan las vulnerabilidades encontradas y te brindan soporte durante todo el proceso de mitigación. 

Conclusión

El lenguaje de consultas SQL es conveniente para administrar las bases de datos relacionales y poder utilizarlas para aplicaciones y plataformas web. Pero lamentablemente estas están desprotegidas debido a las inyecciones SQL, a partir de las cuales se puede extraer información privada, insertar registros, modificar o eliminar datos, autorizar accesos, etc.

Para solucionar el problema de las inyecciones SQL guarda este artículo como favorito para que puedas consultarlo más adelante que decidas remediarlo. 

Si necesitas una consultoría más profunda, escríbenos para asesorarte.

Hackmetrix newsletter ciberseguridad