¿Qué es una inyección SQL (SQLi)?
Cuando desarrollamos sitios web debemos ser muy precavidos en lo que a la seguridad respecta. Las páginas web y aplicaciones web están permanentemente expuestos en Internet y susceptibles de ser atacados por bandidos electrónicos que puedan explotar alguna vulnerabilidad para robar datos o realizar otros tipos de actividad fraudulenta.
En este post vamos a analizar uno de los tipos de ataques más comunes, como es la Inyección de SQL. Al final dedicaremos un apartado a ofrecer consejos y buenas prácticas para evitar estos ataques.
¿Qué es una inyección SQL o SQL injection ?
La inyección de SQL, a veces conocida por las siglas SQLi, es una técnica de ataque de seguridad a sitios web o aplicaciones que usan algún tipo de sistema gestor de bases de datos. Se basa en la ejecución de SQL no planificadas por los desarrolladores y que pueden llegar a ejecutarse mediante la entrada de datos a través de usos de la aplicación.
Mediante una inyección de SQL el atacante podría ejecutar sentencias para la lectura de datos de la base de datos o la manipulación y borrado de la información. Por tanto, se trata de ataques bastantes delicados y que desafortunadamente son bastante sencillos de realizar por personas maliciosas.
¿Cómo funciona la inyección SQL?
Para realizar una inyección de SQL el atacante necesita alterar alguna de las sentencias que se ejecutan en la aplicación o sitio web. Para ello mediante la entrada de datos en algún formulario o similar envía cadenas de texto que sabe que la aplicación puede usar para componer las sentencias SQL.
La aplicación web puede recibir esas cadenas de texto maliciosas, que se componen de código SQL «inyectado» en la aplicación cuando se montan las cadenas SQL que ejecutará para implementar la funcionalidad. Así consigue que esas cadenas con código SQL puedan llegar a ser ejecutadas en el sistema gestor para realizar cualquier tipo de acción no deseada sobre la base de datos.
Proceso de un ataque con inyección SQL
No queremos entrar en muchos detalles sobre cómo realizar una inyección de SQL, ya que no es el objetivo de este artículo. Si queremos ahondar existen muchos documentos en Internet que lo explican con detalle. Lo que sí queremos es explicar las claves de este proceso para que podamos ser conscientes del peligro que suponen y la relativa facilidad con la que se pueden llegar a producir.
- El atacante comienza por identificar un punto de entrada vulnerable, como un campo de un formulario enviado al servidor que se usará a la hora de montar una sentencia SQL.
- El atacante introduce comandos SQL maliciosos en dicho punto de entrada. Estos comandos pueden simplemente consistir en unas comillas estratégicamente colocadas, un punto y coma para separar sentencias SQL y la creación de sentencias SQL totalmente arbitrarias que desea ejecutar sobre el sistema gestor..
- La aplicación web toma esa cadena de entrada, donde se ha inyectado el SQL malicioso y monta otra cadena de una sentencia SQL.
- La aplicación manda ejecutar sobre la base de datos la cadena con el comando SQL malicioso introducido.
- El atacante consigue ejecutar ese SQL y obtiene los resultados que buscaba.
Por medio de sentencias arbitrarias es capaz de alterar elementos de la base de datos, donde podría hacer cosas diversas, como crear usuarios o alterar los existentes, cambiar los permisos. Una vez realizado este paso podía llegar a tomar el control de las aplicaciones. También se pueden inyectar comandos para, borrar datos o cambiar los existentes de manera que se inutilicen las bases de datos.
Tipos de ataques de inyección SQL
Dentro de todos los ataques que se pueden conseguir existen clasificaciones de inyección de SQL que vamos a nombrar.
Inyección SQL Clásica
Este tipo de inyección es la que hemos descrito anteriormente y ocurre cuando el atacante puede insertar un comando SQL por medio de la entrada de datos. En este tipo de inyección el atacante puede ver el resultado de la ejecución de sus sentencias directamente mediante la respuesta o salida que produzca la aplicación web.
Inyección SQL Basada en Tiempo (Time-Based)
En este tipo de inyección el atacante no es capaz de saber si está o no está consiguiendo los efectos deseados por sus sentencias, sin embargo a partir del análisis sobre cuánto tiempo tarda en responder la base de datos es capaz de deducir la validez de las sentencias que está inyectando.
Inyección SQL Ciega (Blind SQL Injection)
En este caso ocurre igual que en el anterior. El atacante realiza la inyección pero no ve los datos directamente en la salida de la aplicación. En lugar de ello realiza consultas que le pueden dar respuestas verdaderas o falsas sobre hipótesis, como si existe una tabla o una columna, y consigue las respuestas basándose en el comportamiento de la aplicación en lugar de los datos que se puedan llegar a visualizar.
¿Por qué son posibles los ataques SQLI?
Como hemos dicho, los ataques de SQL son muy comunes y su origen puede deberse a muchas causas.
Desafortunadamente el más frecuente consiste en descuidos a la hora de implementar las funcionalidades de la aplicación, introducidos por desarrolladores que llevan a cabo malas prácticas o no tienen el suficiente conocimiento de los lenguajes que manejan. Sin embargo, también pueden ocurrir por razones tan simples como tener un software desactualizado en el servidor.
Versiones antiguas del sistema gestor de base de datos
Uno de los problemas que pueden llegar a producir vulnerabilidades por inyección de SQL es tener un software desactualizado, siendo especialmente importante el servidor de la base de datos, pero también los sistemas operativos, lenguajes de programación o los frameworks o librerías que se estén utilizando para el desarrollo del software.
Ausencia de contraseña o contraseñas poco seguras
Por supuesto, otro de los problemas críticos es la mala configuración de los sistemas gestores de bases de datos. Tener usuarios sin contraseñas o usar contraseñas débiles hacen que nuestro sistema sea un blanco fácil para los atacantes.
Mala configuración en los niveles de acceso y permisos
Otro factor consiste en la configuración incorrecta de los permisos de las bases de datos. Usuarios con claves débiles junto con permisos muy laxos pueden permitir a los atacantes realizar acciones de todo tipo en el sistema gestor.
Ausencia de firewalls o protecciones a la base de datos
Si tenemos un servidor que aloja un sistema gestor de base de datos que no bloquea el acceso desde fuera lo está exponiendo a posibles atacantes. Generalmente se recomienda no abrir los puertos de la base de datos para el tráfico que viene de Internet, ya que existen mecanismos para la conexión con el sistema gestor alternativos, como los túneles ssh.
Volcado de información en los banners de acceso
A veces cuando se programan las aplicaciones o se configuran los servidores se revelan datos innecesarios sobre los sistemas. Por ejemplo, cuando se muestra un error de acceso a la base de datos o se muestra la sentencia que ha producido un error es posible que el atacante obtenga una información valiosa para montar luego su estrategia.
¿Cómo evitar o prevenir ataques de Inyección SQL?
Nuestro trabajo como desarrolladores o administradores de bases de datos consiste en asegurarnos de tener sistemas suficientemente robustos y seguros. Aquí van algunos consejos y prácticas recomendables para evitar las SQLi.
Equipos y Software actualizados
Es extremadamente importante mantener los sistemas siempre actualizados. Esto incluye:
- Sistema operativo del servidor
- Sistema gestor de la base de datos instalado en el servidor
- Otros programas instalados en el servidor
- Lenguajes de programación que estemos usando
- Librerías en las que basamos las aplicaciones
- Frameworks de desarrollo
Es importante ser muy cuidadosos con todos estos puntos y evitar usar software en versiones que tengan vulnerabilidades conocidas.
Conocer las buenas prácticas de los lenguajes de programación
Los desarrolladores que realizan las aplicaciones deben conocer de manera sólida las interfaces de acceso a las bases de datos y cuáles son las herramientas que los lenguajes de programación ponen a disposición para componer sentencias SQL seguras. En este sentido podemos llevar en consideración:
- Depurar y validar toda la entrada de datos
- Montar las sentencias SQL mediante el bindeo de datos
- Usar sistemas de alto nivel para el acceso a las bases de datos como abstracciones o ORMs
- Leer documentación técnica de todas las herramientas que formen parte del desarrollo y los
- componentes de despliegue
Tener clara la instalación de MySQL
Debemos de tener clara la instalación y configuración de MySQL, o de otros sistemas gestores, junto con las prácticas recomendables para la seguridad. Por ejemplo, dejar un servidor de bases de datos instalado con las configuraciones «de fábrica» puede ser un problema.
Establecer usuarios y permisos con criterio y sabiendo lo que hacemos
Es crucial mantener unas políticas de usuarios suficientemente restrictivas. Por ejemplo es importante limitar los permisos de los usuarios para que realicen solamente aquellas tareas imprescindibles. Además es importante controlar los usuarios de acceso a administración de las máquinas.
Delegar responsabilidades en soluciones de terceros
Debemos tener mucho control sobre el software que instalamos en las máquinas y su grado de utilización. Por ejemplo, si tenemos un panel de administración del servidor, como Plesk o cPanel, dado que ese panel tiene permisos para realizar todo tipo de acciones en el servidor, debemos ser especialmente cuidadosos para que esté correctamente protegido.
Establecer contraseñas seguras
Este punto es básico, pero a día de hoy, por comodidad o desconocimiento, todavía hay desarrolladores o usuarios de los sistemas que configuran claves débiles que son fáciles de burlar.
Recordemos que una cadena es tan fuerte como su eslabón más débil. Por tanto podemos estar haciendo muchos esfuerzos para la seguridad, pero si hemos dado permisos a un usuario para realizar tareas y ese usuario ha usado una contraseña poco segura, estaremos poniendo en riesgo el sistema completo.
Actualizar a la última versión SQL
Mantén siempre las versiones de los servidores de las bases de datos a la última. Las versiones más recientes suelen incorporar las soluciones a vulnerabilidades conocidas.
Instalar los parches de seguridad
Por último, aunque consiste en redundar en lo anterior, debemos instalar todos los parches de seguridad de las aplicaciones y de los sistemas operativos.
Esperamos que con estos consejos logres mitigar en la mayor medida los problemas de seguridad debidos a las inyecciones de SQL y evites de este modo uno de los ataques de seguridad más frecuentes en la web.