La inyección de SQL es un ataque que manipula ilegalmente una base de datos mediante la inyección de declaraciones no intencionadas de Structured Query Language (SQL) en una aplicación que tiene una base de datos relacional (RDBMS). Hay varios tipos de inyección de SQL dependiendo del método y el propósito, y desde la perspectiva de los ciberatacantes, van desde robar información, falsificar datos e investigar vulnerabilidades. Aunque se trata de un ataque antiguo, sigue causando muchos daños en la actualidad, por lo que es uno de los ataques de los que las organizaciones corporativas deben tener especial cuidado.
Antes de entrar en la explicación de la inyección de SQL, vamos a explicar primero las bases de datos relacionales y SQL. Una base de datos relacional es un tipo de base de datos que gestiona los datos de la aplicación en un formato de tabla. Se utiliza en muchas aplicaciones empresariales debido a la alta fiabilidad de las transacciones (cada proceso individual).
SQL es un lenguaje (lenguaje de base de datos) para las bases de datos relacionales operativas. Las operaciones se dividen ampliamente en tres categorías:
ISO estipula las especificaciones para SQL. Por lo tanto, si es una base de datos relacional, en principio, es posible operarla de la misma manera incluso si el proveedor es diferente.
Un día, un ciberatacante descubre una aplicación y la convierte en el objetivo de un ataque. Asumimos que el ciberatacante sabe que ya existe un usuario legítimo "Ken Sato" en esta aplicación web. El ciberataque intenta iniciar sesión ilegalmente haciéndose pasar por el usuario "Ken Sato". En el formulario de inicio de sesión, el ciberatacante introduce la cadena que se muestra en la Figura 1. Cuando se visualiza desde la perspectiva de la aplicación, se genera la sentencia SQL que se muestra en la Figura 2. ¿Cómo se interpreta esta sentencia SQL en una base de datos relacional?
Figura 1: Ejemplo de entradas utilizadas por ciberataques
Figura 2: Declaración SQL creada a partir de la entrada en la Figura 1
Cuando la base de datos relacional recibe esta sentencia SQL, primero busca una fila en la tabla USERS donde el NOMBRE DE USUARIO es "Ken Sato". Dado que el nombre de usuario "Ken Sato" ya existe, la base de datos relacional pasa a la siguiente condición de búsqueda. Aquí es donde comienza el problema.
Según la condición de búsqueda, la base de datos relacional busca un usuario cuyo nombre de usuario es "Ken Sato" y cuya contraseña está "en blanco" o "'1' = '1'". Dado que las contraseñas son necesarias en muchas aplicaciones, digamos que no se ha encontrado ningún usuario con una contraseña "en blanco" esta vez. Pero, ¿qué pasa con "1" = "1"? Esta es una fórmula que compara si "1" y "1" son iguales. Naturalmente, este resultado siempre es cierto. Por lo tanto, la base de datos relacional reconoce que existe un usuario cuyo NOMBRE DE USUARIO es "Ken Sato" y cuya CONTRASEÑA está "en blanco" o "'1' = '1'". Como resultado, el servidor de la base de datos responde con información asociada con el nombre de usuario "Ken Sato" al servidor de la aplicación sin comprobar la contraseña para ese nombre de usuario. El servidor de aplicaciones crea una pantalla de éxito de inicio de sesión basada en esa información y la envía como respuesta al navegador del ciberatacante.
Este es el mecanismo básico de la inyección de SQL. Hemos dado un inicio de sesión de aplicación web como ejemplo fácil de entender, pero las operaciones de base de datos que utilizan sentencias SQL se utilizan en muchas funciones de aplicación. Por lo tanto, este ataque puede tener éxito no solo en la pantalla de inicio de sesión, sino en diversas situaciones en la aplicación.
Hay varios tipos de inyección de SQL dependiendo del propósito y el método
Esta es una técnica de inyección de SQL utilizada para explorar configuraciones y vulnerabilidades de aplicaciones. Se genera un error introduciendo intencionadamente una entrada no válida en la aplicación y los detalles del sistema objetivo se exploran en función del mensaje de error. Aunque la posibilidad de falsificar o filtrar datos directamente utilizando esta técnica es baja, los ciberatacantes pueden utilizar la información obtenida utilizando esta técnica para lanzar ataques dirigidos a vulnerabilidades u otros ataques de inyección de SQL descritos a continuación.
Esta es una técnica de inyección de SQL que utiliza el operador UNION, un tipo de SQL, para hacer referencia a datos arbitrarios. El operador UNION es un operador que combina los resultados de varias declaraciones SELECT. Si un ciberatacante añade una nueva declaración SELECT que comienza con el operador UNION a una declaración SELECT emitida por una aplicación, es posible que la aplicación obtenga datos que no están destinados a la aplicación. Si el ataque tiene éxito, el ciberatacante puede obtener datos arbitrarios a nivel de tabla de base de datos. Por este motivo, es un método que puede causar un daño particularmente grande entre las inyecciones SQL.
Esta es una técnica de inyección de SQL que envía una sentencia SQL a una aplicación y explora la estructura de la aplicación observando las diferencias de comportamiento en lugar de los resultados directos. Al igual que con la inyección SQL basada en errores, la posibilidad de falsificar o filtrar datos directamente utilizando esta técnica es baja, pero los ciberatacantes pueden utilizar la información obtenida utilizando esta técnica para lanzar ataques dirigidos a vulnerabilidades u otros ataques de inyección SQL.
Esta es una técnica de inyección de SQL en la que un ciberataque envía una sentencia SQL creada a una aplicación que no es efectiva en el momento de la ejecución y luego la ejecuta más tarde. Debido a que esta técnica se ejecuta en un entorno en el que no se espera acceso directo al usuario, en el peor de los casos, podría provocar intrusiones a nivel de base de datos, como cambios en la configuración y los permisos de la base de datos.
Las aplicaciones actuales se componen de varios elementos. Por lo tanto, son necesarias medidas adecuadas para cada elemento, en otras palabras, defensa multicapa.
Estas son las principales medidas para evitar daños causados por la inyección de SQL.
Una contramedida a nivel de base de datos es optimizar los privilegios de usuario en la base de datos. Como se mencionó anteriormente, las operaciones de bases de datos relacionales se dividen ampliamente en tres categorías: Data Definition Language (DDL), que configura la base de datos; Data Manipulation Language (DML), que lee y actualiza datos; y Data Control Language (DCL), que gestiona diversos controles como privilegios. Sin embargo, en muchos casos, DML como las cláusulas SELECT son lo que la mayoría de las aplicaciones utilizan normalmente. Al restringir los privilegios para otras operaciones, es posible evitar la eliminación no intencionada de datos y los cambios de configuración.
Hay una variedad de contramedidas disponibles a nivel de aplicación
Uso de marcadores de posición
Es posible evitar la inyección de SQL creando sentencias SQL utilizando marcadores de posición. Los marcadores de posición asignan mecánicamente valores de entrada a sentencias SQL preparadas previamente por la aplicación, e incluso si se proporcionan valores no válidos como entrada a la aplicación, son valores no válidos y se detiene la creación de la sentencia SQL final
Escapación adecuada de los valores de entrada
Los símbolos y las cadenas de caracteres que tienen significados especiales en las sentencias SQL se escapan y se tratan como cadenas de caracteres normales para evitar operaciones no intencionadas de bases de datos relacionales. Algunos ejemplos de caracteres que se pueden escapar incluyen "`(comilla única)", "; (semograma/significado: el símbolo en cuestión se considera el Final de la sentencia SQL)", "-- (dos guiones/significado consecutivos: el símbolo después del símbolo se trata como un comentario)" y "UNION (cláusula/significado de UNION: combina los resultados de dos o más sentencias SELECT)". Además, en el caso de números como "1", es necesario definir explícitamente si se tratan como "números" o "caracteres" en la base de datos y convertirlos adecuadamente.
Ocultar errores
Los mensajes de error que muestran las aplicaciones pueden proporcionar mucha información a los ciberatacantes. Como se describe en "Inyección de SQL basada en errores", los atacantes pueden utilizar estos mensajes para lanzar más ataques. Al desarrollar aplicaciones, es importante no mostrar directamente mensajes de error que puedan llevar a una comprensión del entorno interno del sistema, no solo de la base de datos.
Aplicación de programas de parches a sistemas de paquetes
Si utiliza un sistema de paquetes, le recomendamos que aplique el parche oficialmente proporcionado por el proveedor lo antes posible. Esto le ayudará a proteger su sistema de diversas vulnerabilidades, incluida la inyección de SQL.
Las medidas a nivel de red incluyen el uso de IPS (sistema de prevención de intrusiones) y WAF (cortafuegos de aplicaciones web). IPS es una solución que supervisa la red y detecta/bloquea comunicaciones maliciosas. WAF es una solución que protege las aplicaciones web y, mediante la inspección de las comunicaciones web, detecta/bloquea ataques dirigidos a vulnerabilidades en aplicaciones web.
Después de implementar las medidas mencionadas anteriormente, es posible evaluar objetivamente la efectividad de las medidas y cualquier deficiencia realizando pruebas de penetración externas y evaluaciones de vulnerabilidad.
Aunque ambas vulnerabilidades pueden estar causadas por código malicioso o datos enviados por usuarios y administradores de sitios web/aplicaciones, difieren en términos de impacto. CSS/XSS normalmente causa interrupciones en el cliente o el visitante y se puede utilizar para secuestrar sesiones, desfigurar sitios web, descargar contenido malicioso y redirigir URL. Por otro lado, las inyecciones afectan gravemente al lado del servidor y pueden provocar la pérdida de datos y otras consecuencias.
Aunque la inyección de SQL es un ataque antiguo, todavía hay muchos casos confirmados de ello que han causado grandes daños en los últimos años. Por lo tanto, sigue siendo un ataque del que las organizaciones deben tener cuidado. Si se utiliza una técnica como la inyección UNION y el ataque tiene éxito, puede provocar una fuga de información a gran escala. Sin embargo, al tomar las medidas adecuadas, es posible evitar dichos daños antes de que ocurran. Como medida de seguridad para las organizaciones corporativas, además de las medidas desde la perspectiva de la defensa en profundidad mencionadas anteriormente, recomendamos que las evaluaciones de seguridad se lleven a cabo regularmente, como pruebas de penetración externas y diagnóstico de vulnerabilidades.