Bases de datos y conceptos básicos de SQL que todo hacker debería saber en el 2019

La clave para convertirse en un pirata informático competente es saber cómo funciona la tecnología, la vulnerabilidad que está intentando explotar. Las inyecciones de SQL son con mucho, uno de los métodos de ataque más populares y fáciles de aprender. Y para comprender cómo funcionan estos ataques, debe conocer bien SQL.

Comenzaremos este artículo con los conceptos básicos de inyección de SQL, luego continuaremos identificando la base de datos y temas más avanzados, y finalmente terminaremos con métodos que pueden ayudar a prevenir o reducir el daño de tales ataques.

¿Qué es la inyección SQL?

SQL significa Structured Query Language, un lenguaje estándar utilizado para extraer y procesar datos en sistemas de gestión de bases de datos relacionales (RDBMS). Se accede a los datos mediante consultas que le permiten crear (Crear), leer (Leer), actualizar (Actualizar) y eliminar (Eliminar) (por este motivo, a menudo verá aplicaciones web denominadas aplicaciones CRUD).

Las bases de datos se pueden utilizar en diversas situaciones, pero una de las situaciones más comunes para su uso es el uso de una base de datos en el backend de una aplicación web. Al realizar ciertas acciones, como iniciar sesión en el sistema o realizar una búsqueda, las solicitudes correspondientes se envían desde la aplicación web a la base de datos.

La inyección se puede usar cuando los campos de entrada HTML no escapan (escapan) o no sanean los datos de entrada. Como resultado, un atacante puede ingresar comandos SQL maliciosos para obtener acceso a datos que normalmente deberían estar ocultos al usuario. Las inyecciones de SQL, como regla general, se consideran medios de influencia bastante fuertes y efectivos, ya que permiten a los piratas informáticos obtener información confidencial, falsificar datos, destruir datos o incluso obtener derechos de administrador y usar comandos del sistema operativo en el propio servidor.

Cualquier campo de entrada de datos en cualquier página web es potencialmente vulnerable a la inyección de SQL, porque aquí es donde tiene lugar la interacción con la base de datos. Formularios de autorización, donde el usuario, al ingresar su nombre de usuario y contraseña, ingresa al sistema, estos son los campos más comunes para el ingreso de datos, que se utilizan principalmente. Pero además de ellos, también hay formularios HTML para buscar, formularios de contacto y para descargar archivos. Y todos estos son objetivos potenciales para realizar inyecciones de SQL.

En la primera parte de esta serie, veremos los conceptos básicos de SQL para comprender mejor los tipos de ataques realizados.

Base de datos anatomica

Los datos contenidos en las bases de datos relacionales se almacenan en objetos llamados tablas. Estas tablas son una representación virtual de la relación entre diferentes elementos y consisten en filas y columnas. Las filas, llamadas registros, contienen datos para cada registro individual en la base de datos. Los campos que son columnas de una tabla son información específica para cada registro. Esto está bien ilustrado en la siguiente tabla de «Usuarios»:

Esta tabla contiene tres registros y cuatro campos; A cada usuario de la base de datos se le asigna un identificador, nombre, nombre de usuario y contraseña. De hecho, las tablas son mucho más grandes que esto y pueden contener millones de registros, y la base de datos en sí puede contener tantas tablas. ¿Entiende lo valiosos que pueden ser los datos para los piratas informáticos en tablas tan grandes y qué tan importante es la capacidad de utilizar inyecciones de SQL para un pirata informático?

Tipos de datos y operadores

Para comprender cómo se almacenan los datos con los que trabajamos, necesitamos saberVarios tipos de datos utilizados en SQL. Aunque los tipos de datos específicos pueden diferir de un sistema de base de datos a otro, en la mayoría de los casos son lo suficientemente similares para decir que lo son. Normalmente se clasifican en texto, números y fechas.

Los operadores nos permiten manipular e interactuar con los datos en SQL. Hay cinco categorías principales de operadores: aritmética, bitwise, comparativa, compuesta y lógica. La mayoría de ellos son similares a los disponibles en otros lenguajes de programación, pero con matices.

Instrucciones y sintaxis.

Las sentencias de SQL son códigos que se pasan a la base de datos para obtener o cambiar datos. Veamos la siguiente consulta y dividámosla en sus componentes:

SELECCIONAR * DE LOS Usuarios DONDE Nombre = 'John Smith';

La primera parte de esta declaración (SELECT * FROM Users) selecciona (selecciona) todos los campos de la tabla Users. La palabra clave WHERE indica que queremos ver solo los datos del registro donde el valor «John Smith» se encuentra en el campo «Nombre».

SQL usa comillas simples para cadenas, aunque la mayoría de los sistemas de bases de datos permiten comillas dobles, y los puntos y coma indican el final de una declaración. Cabe señalar que las palabras clave como SELECT y WHERE no distinguen entre mayúsculas y minúsculas.

Los comentarios en SQL se pueden escribir en una línea o en varias:

--este es un comentario de una sola línea.
 SELECCIONAR * DE Usuarios;

/ * esto
 comentario multilínea * /

Las inyecciones SQL utilizan la forma en que se procesan los comentarios al comentar sobre una parte específica de la consulta, lo que la hace opcional. La siguiente inyección evita la necesidad de ingresar una contraseña:

SELECCIONAR * DE LOS Usuarios DONDE Nombre de usuario = '' o 1 = 1 --ANDAND Contraseña = '';

Esta instrucción devolverá todos los registros de la base de datos como un valor, porque la expresión: “o 1 = 1 siempre devuelve Verdadero, y los guiones dobles (-) comentarán el campo Contraseña.

También existen palabras clave para simplificar la clasificación de datos, como MIN y MAX, BETWEEN y ORDER BY.

Veamos esta tabla llamada LoginSessions:

Supongamos que queremos saber qué usuario se ha registrado durante más tiempo y cuándo: la solicitud a continuación devolverá el ID de usuario, el nombre de usuario y los valores de la sesión más corta y más larga entre dos fechas:

SELECCIONAR ID, nombre de usuario, MIN (SessionLength), MAX (SessionLength) DE LoginSessions
 DONDE LoginDate ENTRE '2018-01-01' Y '2018-05-01'
 GRUPO POR ID
 ORDER BY MAX (SessionLength) DESC;

GROUP BY combina cadenas por ID (por ID) y ORDER BY MAX (SessionLength) y las ordena por duración de sesión. DESC define un orden de asignación de usuario descendente, que primero nos mostrará al usuario con la sesión más larga.

Otras instrucciones útiles incluyen: INSERT INTO, que inserta nuevos registros en una tabla; ACTUALIZACIÓN, que actualiza las entradas existentes en la tabla y ELIMINAR, que se usa para eliminar entradas de la tabla. Estos tipos de consultas pueden ser útiles para la inyección de SQL cuando desea hacer algo más que obtener datos de una base de datos.

Un atacante puede insertar una nueva entrada que contenga información de que compró algo en una tienda en línea, por ejemplo, y luego puede reclamar que nunca ha recibido este producto y exigir un reembolso u otra compensación. Si quieren infligir el mayor daño posible, pueden usar la instrucción DROP. DROP TABLE eliminará la tabla existente en la base de datos y DROP DATABASE eliminará toda la base de datos.

Join – Union

La instrucción JOIN se utiliza para unir filas de diferentes tablas cuando existe una relación entre estas tablas. Aquí hay una tabla de nuestros usuarios Usuarios:

Y aquí hay otra tabla llamada Logins:

La siguiente declaración SQL devolverá la fecha en que Bob Jones inició sesión en el sistema por última vez:

SELECCIONAR Users.Username, Logins.Date FROM Users INNER JOIN Logins ON Users.ID = Logins.ID;

INNER JOIN o simplemente JOIN, como se indicó anteriormente, devolverá todos los registros que tengan datos coincidentes en ambas tablas. LEFT JOIN devuelve todos los registros de la tabla de la izquierda, así como aquellos registros que coinciden con la condición, pero están en la tabla de la derecha, mientras que RIGHT JOIN devuelve todos los registros de la tabla de la derecha, así como los registros correspondientes de la tabla de la izquierda. FULL JOIN devolverá todos los registros que coincidan con la tabla izquierda y derecha. Aunque la inyección SQL no suele requerir uniones (JOIN), pueden ser muy útiles para extraer datos de las tablas de la base de datos una vez que haya encontrado una forma de entrar.

UNION se utiliza para combinar datos individuales de dos o más declaraciones SELECT. Todas las instrucciones SELECT deben recuperar el mismo tipo de datos, deben tener el mismo número de columnas y se deben llamar en el mismo orden. UNION ALL hace lo mismo, pero no elimina las filas duplicadas en los casos en que existen los mismos datos en ambas tablas unidas. Veamos un ejemplo usando la tabla de usuarios y administradores:

La siguiente declaración SQL proporcionará contraseñas para los usuarios y administradores:

SELECCIONE la contraseña de los usuarios
 UNION
 SELECCIONE la contraseña de los administradores;

Obviamente, esta no es una solicitud normal que se ejecuta en la base de datos, pero si tuviéramos la oportunidad de ejecutarla, podríamos obtener contraseñas de administrador o cualquier otra información que generalmente no esté disponible.

¿Quieres aprender más sobre los conceptos básicos de inyección SQL?

Ahora que entendemos mejor los conceptos básicos de SQL, podemos usar este conocimiento para crear inyecciones de SQL más complejas. En la siguiente parte de esta serie, veremos formas en las que podemos recopilar más datos de la base de datos.

 

Descargo de responsabilidad : este artículo está escrito sólo para fines educativos. El autor o editor no publicó este artículo con fines maliciosos. Si los lectores desean usar la información para beneficio personal, el autor y el editor no son responsables de ningún daño o daño causado.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: