Hola hacketones! Bienvenidos a un nuevo CTF para la Certificación SEC1 de TryHackMe – SQL Fundamentals
Fundamentos de SQL
La ciberseguridad es un tema amplio que abarca una amplia gama de temas, pero pocos de ellos son tan omnipresentes como las bases de datos. Ya sea que esté trabajando en la seguridad de una aplicación web, trabajando en un entorno de seguridad, SOC y utilizando un SIEM Al configurar la autenticación de usuarios/control de acceso o utilizar herramientas de análisis de malware/detección de amenazas (la lista continúa), de alguna manera dependerá de bases de datos. Por ejemplo, en el lado ofensivo de la seguridad, puede ayudarnos a comprender mejor SQL vulnerabilidades, como SQL Permite realizar inyecciones y crear consultas que nos ayudan a manipular o recuperar datos dentro de un servicio comprometido. Por otro lado, en el aspecto defensivo, nos ayuda a navegar por las bases de datos y detectar actividades sospechosas o información relevante; también nos permite proteger mejor un servicio implementando restricciones cuando sea necesario.
Dado que las bases de datos son omnipresentes, es importante comprenderlas, y esta sala será su primer paso en esa dirección. Repasaremos los conceptos básicos de las bases de datos, cubriendo términos clave, conceptos y diferentes tipos antes de familiarizarnos con ellas.SQL.
Tarea 2 Introducción a las bases de datos
Introducción a las bases de datos
Bien, ya te hemos explicado lo importantes que son. Ahora, es momento de entender qué son exactamente. Como se mencionó en la introducción, las bases de datos son tan comunes que es muy probable que interactúes con sistemas que las utilizan. Las bases de datos son una colección organizada de información o datos estructurados que son fácilmente accesibles y pueden ser manipulados o analizados. Estos datos pueden adoptar muchas formas, como datos de autenticación de usuarios (como nombres de usuario y contraseñas), que se almacenan y se verifican al autenticarse en una aplicación o sitio (como TryHackMe, por ejemplo), datos generados por usuarios en redes sociales (como Instagram y Facebook), donde se recopilan y almacenan datos como publicaciones, comentarios, «me gusta», etc., así como información como el historial de visualización, que almacenan los servicios de streaming como Netflix y se utiliza para generar recomendaciones.
Seguro que ya lo entiendes: las bases de datos se utilizan ampliamente y pueden contener muchísima información. No solo las grandes empresas las usan. Las empresas más pequeñas, al empezar, casi con toda seguridad tendrán que configurar una base de datos para almacenar sus datos. Hablando de tipos de bases de datos, veamos ahora cuáles son.
Diferentes tipos de bases de datos
Ahora tiene sentido que algo sea utilizado por tantas personas y durante (relativamente) tanto tiempo que existan múltiples tipos de implementaciones. Hay bastantes tipos diferentes de bases de datos que se pueden construir, pero para esta sala introductoria, nos centraremos en los dos tipos principales: bases de datos relacionales (también conocidas comoSQL) frente a bases de datos no relacionales (también conocidas como NoSQL).

Bases de datos relacionales: Almacenan datos estructurados, lo que significa que los datos insertados en ellas siguen una estructura. Por ejemplo, los datos recopilados de un usuario consisten en nombre, apellido, dirección de correo electrónico, nombre de usuario y contraseña. Cuando un nuevo usuario se registra, se crea una entrada en la base de datos siguiendo esta estructura. Estos datos estructurados se almacenan en filas y columnas en una tabla (que se explicará más adelante); posteriormente, se pueden establecer relaciones entre dos o más tablas (por ejemplo, usuario e historial de pedidos), de ahí el término bases de datos relacionales.
Bases de datos no relacionales: En lugar de almacenar los datos de la forma descrita anteriormente, almacénelos en un formato no tabular. Por ejemplo, si se escanean documentos, que pueden contener diversos tipos y cantidades de datos, y se almacenan en una base de datos que requiere un formato no tabular. A continuación, se muestra un ejemplo de cómo podría ser:
{_id: ObjectId(«4556712cd2b2397ce1b47661»),
name: {first: «Thomas», last: «Anderson»},
date_of_birth: new Date(‘Sep 2, 1964’),
occupation: [«The One»],
steps_taken :NumberLong(4738947387743977493)}
En cuanto a la base de datos a elegir, todo depende del contexto en el que se vaya a utilizar. Las bases de datos relacionales se suelen usar cuando se espera que los datos almacenados se reciban de forma fiable y en un formato consistente, donde la precisión es fundamental, como en el procesamiento de transacciones de comercio electrónico. Por otro lado, las bases de datos no relacionales son más adecuadas cuando los datos recibidos pueden variar mucho en su formato, pero necesitan recopilarse y organizarse en un mismo lugar, como en las plataformas de redes sociales que recopilan contenido generado por los usuarios.
Tablas, filas y columnas
Ahora que hemos definido los dos tipos principales de bases de datos, nos centraremos en las bases de datos relacionales. Comenzaremos explicando las tablas , las filas y las columnas . Todos los datos almacenados en una base de datos relacional se guardan en una tabla ; por ejemplo, el inventario de libros de una librería podría almacenarse en una tabla llamada «Libros».

Al crear esta tabla, deberá definir qué información se necesita para definir un registro de libro, por ejemplo, «id», «Nombre» y «Fecha_de_publicación». Estas serían sus columnas ; al definir estas columnas, también deberá definir qué tipo de datos deben contener. Si se intenta insertar un registro en una base de datos cuyo tipo de datos no coincide, se rechazará. Los tipos de datos que se pueden definir pueden variar según la base de datos que utilice, pero los tipos de datos básicos que usan todas incluyen cadenas (una colección de palabras y caracteres), enteros (números), decimales (números con punto decimal) y fechas/horas.
Una vez creada una tabla con las columnas definidas, se insertaría el primer registro en la base de datos; por ejemplo, un libro llamado “Android Security Internals” con un ID de “1” y una fecha de publicación de “2014-10-14”. Una vez insertado, este registro se representaría como una fila .
Claves primarias y foráneas
Una vez que se ha definido y rellenado una tabla, puede que sea necesario almacenar más datos. Por ejemplo, queremos crear una tabla llamada «Autores» que almacene los autores de los libros vendidos en la tienda. He aquí un ejemplo muy claro de una relación. Un libro (almacenado en la tabla Libros) es escrito por un autor (almacenado en la tabla Autores). Si quisiéramos consultar un libro en nuestra historia y también obtener el autor de ese libro, nuestros datos tendrían que estar relacionados de alguna manera; esto lo hacemos con claves. Hay dos tipos de claves :

Claves primarias : Una clave primaria se utiliza para garantizar que los datos recopilados en una columna determinada sean únicos. Es decir, debe existir una forma de identificar cada registro almacenado en una tabla, un valor único para ese registro que no se repita en ningún otro registro de la tabla. Piense en los números de matrícula en una universidad; estos son números asignados a un estudiante para que pueda ser identificado de forma única en los registros (ya que a veces los estudiantes pueden tener el mismo nombre). Se debe elegir una columna en cada tabla como clave primaria; en nuestro ejemplo, «id» sería la más adecuada, ya que se ha creado un id único para cada libro, dado que los libros pueden tener la misma fecha de publicación o (en casos más raros) el mismo título. Tenga en cuenta que solo puede haber una columna de clave primaria en una tabla.
Claves foráneas : Una clave foránea es una columna (o varias) de una tabla que también existe en otra tabla de la base de datos, estableciendo así un vínculo entre ambas. En nuestro ejemplo, imaginemos que añadimos un campo «author_id» a nuestra tabla «Libros»; este campo actuaría como clave foránea, ya que el campo «author_id» de la tabla «Libros» se corresponde con la columna «id» de la tabla «Autor». Las claves foráneas son las que permiten establecer relaciones entre diferentes tablas en las bases de datos relacionales. Cabe destacar que una tabla puede tener más de una columna de clave foránea.
Responda las siguientes preguntas
¿Qué tipo de base de datos debería considerar si los datos que va a almacenar varían mucho en su formato?
Non-relational database
¿Qué tipo de base de datos debería considerar si los datos que va a almacenar estarán siempre en el mismo formato estructurado?
relational database
En nuestro ejemplo, una vez que se inserta un registro de un libro en nuestra tabla «Libros», ¿cómo se representaría en esa tabla?
row
¿Qué tipo de clave proporciona un vínculo entre una tabla y otra?
foreign key
¿Qué tipo de clave garantiza que un registro sea único dentro de una tabla?
primary key
Tarea 3 SQL
Configura tu entorno virtual
Para completar con éxito esta sala, deberá configurar su entorno virtual. Esto implica iniciar tanto su AttackBox (si no está utilizando su VPN) como las máquinas objetivo, asegurándose de contar con las herramientas y el acceso necesarios para afrontar los desafíos que se avecinan.
Máquina atacante
Estado:Apagado
Iniciar AttackBox
Máquina de laboratorio
Estado:Apagado
Iniciar máquina de laboratorio
Qué es SQL
En teoría, todo esto suena genial, pero en la práctica, ¿cómo funcionan las bases de datos? ¿Cómo crearías tu primera tabla y la llenarías de datos? ¿Qué herramientas usarías? Las bases de datos suelen controlarse mediante un Sistema de Gestión de Bases de Datos (SGBD). Un SGBD, que actúa como interfaz entre el usuario final y la base de datos, es un programa informático que permite a los usuarios recuperar, actualizar y gestionar los datos almacenados. Algunos ejemplos de SGBD son MySQL, MongoDB, Oracle y MariaDB.

La interacción entre el usuario final y la base de datos se puede realizar utilizandoSQL(Lenguaje de consulta estructurado).SQLes un lenguaje de programación que se puede utilizar para consultar, definir y manipular los datos almacenados en una base de datos relacional.
Los beneficios de SQL y bases de datos relacionales
SQLes casi tan omnipresente como las bases de datos mismas, y con razón. Estos son algunos de los beneficios que conlleva aprender y usarSQL:
- Es rápido : Bases de datos relacionales (también conocidas como aquellas queSQL(se utiliza para) puede devolver lotes masivos de datos casi instantáneamente debido a la poca cantidad de espacio de almacenamiento que utiliza y a las altas velocidades de procesamiento.
- Fácil de aprender: a diferencia de muchos lenguajes de programación,SQLEstá escrito en un lenguaje sencillo, lo que facilita enormemente su aprendizaje. Su gran legibilidad permite a los usuarios concentrarse en aprender las funciones y la sintaxis.
- Fiabilidad: Como se mencionó anteriormente, las bases de datos relacionales pueden garantizar un nivel de precisión en los datos al definir una estructura estricta en la que deben ajustarse los conjuntos de datos para poder ser insertados.
- Flexible: SQLOfrece todo tipo de funcionalidades para consultar una base de datos, lo que permite a los usuarios realizar tareas de análisis de datos muy complejas de forma muy eficiente.
Poniéndose manos a la obra
Ahora que hemos cubierto lo queSQLEs hora de ponerse manos a la obra y empezar a usarlo usted mismo. Haga clic en el botón verde «Iniciar máquina de laboratorio». La máquina se iniciará en vista de pantalla dividida. En caso de queVMSi no es visible, utilice el botón azul «Mostrar vista dividida» en la parte superior de la página. Una vez que la máquina haya terminado de arrancar, abra la terminal y ejecute el siguiente comando:
Configurando MySQL
user@tryhackme$mysql -uroot -p
Cuando se le solicite la contraseña, ingrese:
Configurando MySQL
user@tryhackme$tryhackme
El resultado debería ser el siguiente:
Configurando MySQL
user@tryhackme$mysql -uroot -pEnter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.39-0ubuntu0.20.04.1 (Ubuntu)
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
Una vez aclarado esto, ya está listo para empezar a usar (y aprender).SQL¡
Responda las siguientes preguntas
¿Qué sirve de interfaz entre una base de datos y un usuario final?
DBMS
¿Qué lenguaje de consulta se puede utilizar para interactuar con una base de datos relacional?
SQL
Tarea 4 Instrucciones para bases de datos y tablas
Es hora de aprender
¡Ahora viene la parte divertida! Es hora de empezar a aprender.SQLy cómo usarlo para interactuar con bases de datos. En esta tarea, comenzaremos aprendiendo a usar sentencias de base de datos y tablas. Después de todo, son estas sentencias las que necesitamos para crear nuestras bases de datos/tablas y empezar a trabajar.
Sentencias de base de datos
CREAR BASE DE DATOS
Si se necesita una nueva base de datos, el primer paso que se debe dar es crearla. Esto se puede hacer enSQLutilizando la CREATE DATABASEinstrucción. Esto se haría utilizando la siguiente sintaxis:
Terminal
mysql> CREATE DATABASE database_name;
Ejecute el siguiente comando para crear una base de datos llamada thm_bookmarket_db:
Terminal
mysql> CREATE DATABASE thm_bookmarket_db;
MOSTRAR BASES DE DATOS
Ahora que hemos creado una base de datos, podemos visualizarla mediante la SHOW DATABASESsiguiente instrucción. Esta SHOW DATABASESinstrucción devolverá una lista de las bases de datos existentes. Ejecute la instrucción de la siguiente manera:
Terminal
mysql> SHOW DATABASES;
En la lista devuelta, verá la base de datos que acaba de crear y algunas bases de datos incluidas por defecto (mysql, information_scheme, performance_scheme y sys), que se utilizan para diversos fines que permiten el funcionamiento de MySQL. También se incluyen varias tablas necesarias para esta lección.
UTILIZAR LA BASE DE DATOS
Una vez creada la base de datos, es posible que desee interactuar con ella. Antes de poder hacerlo, debemos indicarle a MySQL con qué base de datos queremos interactuar (para que sepa en qué base de datos ejecutar las consultas posteriores). Para establecer la base de datos que acabamos de crear como la base de datos activa, ejecutaríamos la USEsiguiente instrucción (asegúrese de ejecutarla en su máquina):
Terminal
mysql> USE thm_bookmarket_db;
ELIMINAR BASE DE DATOS
Una vez que una base de datos ya no es necesaria (quizás se creó para pruebas o ya no se requiere), se puede eliminar mediante la DROPinstrucción. Para eliminar una base de datos, usaríamos la siguiente sintaxis de instrucción (aunque, en nuestro caso, queremos conservar nuestra base de datos, ¡así que no es necesario ejecutar esto usted mismo!):
Terminal
mysql> DROP database database_name;
Sentencias de tabla
Ahora que ya sabes crear, listar, usar y eliminar bases de datos, es hora de examinar cómo podríamos llenar esas bases de datos con tablas e interactuar con esas tablas.
CREAR TABLA
Siguiendo la lógica de las sentencias de la base de datos, la creación de tablas también utiliza una CREATEsentencia. Una vez que la base de datos está activa (se ha ejecutado la USEsentencia en ella), se puede crear una tabla dentro de ella utilizando la siguiente sintaxis de sentencia:
Terminal
mysql> CREATE TABLE example_table_name (
example_column1 data_type,
example_column2 data_type,
example_column3 data_type
);
Como puede ver, aquí hay algo más de complejidad. En la tarea de Introducción a las Bases de Datos, vimos cómo y cuándo se crea una tabla; es necesario decidir qué columnas conformarán un registro en esa tabla, así como el tipo de datos que se espera que contenga cada columna. Esto es lo que representa la sintaxis que se muestra aquí. En el ejemplo, hay 3 columnas de ejemplo, pero SQL admite muchas más (más de 1000). Intentemos llenar nuestra thm_bookmarket_dbtabla con la siguiente instrucción:
Terminal
mysql> CREATE TABLE book_inventory (
book_id INT AUTO_INCREMENT PRIMARY KEY,
book_name VARCHAR(255) NOT NULL,
publication_date DATE
);
Esta instrucción creará una tabla book_inventorycon tres columnas: book_id, book_namey publication_date. book_ides un INT(Integer) ya que siempre debe ser un número, AUTO_INCREMENTestá presente, lo que significa que al primer libro insertado se le asignará book_id 1, al segundo libro insertado se le asignará book_id 2, y así sucesivamente. Finalmente, book_idse establece como el PRIMARY KEYya que será la forma en que identificaremos de forma única un registro de libro en nuestra tabla (y debe haber un registro primario en una tabla).
Book_name tiene el tipo de datos VARCHAR(255), lo que significa que puede usar caracteres variables (texto/números/puntuación) y se establece un límite de 255 caracteres y NOT NULL, lo que significa que no puede estar vacío (por lo que si alguien intentara insertar un registro en esta tabla pero book_name estuviera vacío, sería rechazado). Publication_date está establecido como el tipo de datos DATE.
MOSTRAR TABLAS
Así como podemos listar bases de datos usando la instrucción SHOW, también podemos listar las tablas en nuestra base de datos activa (la base de datos en la que usamos la instrucción USE por última vez). Ejecute el siguiente comando y debería ver la tabla que acaba de crear:
Terminal
mysql> SHOW TABLES;
DESCRIBIR
Si queremos saber qué columnas contiene una tabla (y su tipo de datos), podemos describirlas usando el DESCRIBEcomando (que también se puede abreviar como DESC). Describe la tabla que acabas de crear usando el siguiente comando:
Terminal
mysql> DESCRIBE book_inventory;
Esto te dará una vista detallada de la tabla como esta:
Sintaxis DROP
mysql> DESCRIBE book_inventory;
+——————+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——————+————–+——+—–+———+—————-+
| book_id | int | NO | PRI | NULL | auto_increment |
| book_name | varchar(255) | NO | | NULL | |
| publication_date | date | YES | | NULL | |
+——————+————–+——+—–+———+—————-+
3 rows in set (0.02 sec)
ALTERAR
Una vez creada una tabla, puede que llegue un momento en que cambien sus necesidades de datos y necesite modificarla. Esto se puede hacer mediante la siguiente ALTERinstrucción. Imaginemos ahora que hemos decidido añadir una columna a nuestro inventario de libros con el número de páginas de cada libro. Añada esta columna a nuestra tabla mediante la siguiente instrucción:
Terminal
mysql> ALTER TABLE book_inventory
ADD page_count INT;
Esta ALTERinstrucción se puede utilizar para realizar cambios en una tabla, como renombrar columnas, cambiar el tipo de datos de una columna o eliminar una columna.
DROP
De forma similar a como se elimina una base de datos, también se pueden eliminar tablas mediante esta DROP instrucción. No es necesario hacerlo, pero la sintaxis que se usaría es la siguiente:
Terminal
mysql> DROP TABLE table_name;
Responda las siguientes preguntas
Utilizando la instrucción que aprendió para listar todas las bases de datos, debería aparecer una base de datos con un indicador como nombre; ¿cuál es?
THM{575a947132312f97b30ee5aeebba629b723d30f9}
En la lista de bases de datos disponibles, también debería aparecer la base de datos. Establézcala como su base de datos activa y liste todas las tablas que contiene; ¿qué indicador aparece aquí? task_4_db
THM{692aa7eaec2a2a827f4d1a8bed1f90e5e49d2410}
Tarea 5 Operaciones CRUD
CRUDO
CRUD son las siglas de Crear , Leer , Actualizar y Eliminar , que se consideran las operaciones básicas en cualquier sistema que gestione datos.
Exploremos todas estas diferentes operaciones al trabajar con MySQL . En las próximas dos tareas, utilizaremos la tabla books que forma parte de la base de datos thm_books . Podemos acceder a ella con la instrucción use thm_books;.
Crear operación (INSERTAR)
La operación CREATE creará nuevos registros en una tabla. En MySQL, esto se puede lograr utilizando la instrucción INSERT INTO, como se muestra a continuación.
Terminal
mysql> INSERT INTO books (id, name, published_date, description)
VALUES (1, «Android Security Internals», «2014-10-14», «An In-Depth Guide to Android’s Security Architecture»);
Query OK, 1 row affected (0.01 sec)
Como podemos observar, la INSERT INTOinstrucción especifica una tabla, en este caso, books , donde se puede agregar un nuevo registro; las columnas id , name , published_date y description son los registros de la tabla. En este ejemplo, se agregó un nuevo registro con un id de 1 , un nombre de «Android Security Internals «, una fecha de publicación de » 2014-10-14 » y una descripción que dice » Android Security Internals proporciona una comprensión completa de los aspectos internos de seguridad de los dispositivos Android «.
Nota: Esta operación ya existe en la base de datos, por lo que no es necesario ejecutar la consulta.
Operación de lectura (SELECT)
La operación Read , como su nombre indica, se utiliza para leer o recuperar información de una tabla. Podemos obtener una columna o todas las columnas de una tabla con la SELECTinstrucción, como se muestra en el siguiente ejemplo.
Terminal
mysql> SELECT * FROM books;
+—-+—————————-+—————-+——————————————————+
| id | name | published_date | description |
+—-+—————————-+—————-+——————————————————+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture |
+—-+—————————-+—————-+——————————————————+
1 row in set (0.00 sec)
La instrucción de salida anterior SELECTva seguida de un *símbolo que indica que se deben recuperar todas las columnas, seguido de la FROMcláusula y el nombre de la tabla, en este caso, books .
Si queremos seleccionar una columna específica, como el nombre y la descripción , debemos especificarlas en lugar del *símbolo, como se muestra a continuación.
Terminal
mysql> SELECT name, description FROM books;
+—————————-+——————————————————+
| name | description |
+—————————-+——————————————————+
| Android Security Internals | An In-Depth Guide to Android’s Security Architecture |
+—————————-+——————————————————+
1 row in set (0.00 sec)
Operación de actualización (ACTUALIZACIÓN)
La operación UpdateUPDATE modifica un registro existente dentro de una tabla, y se puede utilizar la misma instrucción para ello.
Terminal
mysql> UPDATE books
SET description = «An In-Depth Guide to Android’s Security Architecture.»
WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
La UPDATE instrucción especifica la tabla, en este caso, books , y luego podemos usar SETseguido del nombre de la columna que actualizaremos. La WHEREcláusula especifica qué fila actualizar cuando se cumple la cláusula, en este caso, la que tiene id 1 .
Operación de eliminación (ELIMINAR)
La operación DELETE elimina registros de una tabla. Podemos lograr esto con la DELETEinstrucción.
Nota: No es necesario ejecutar la consulta. Eliminar esta entrada afectará al resto de los ejemplos en las próximas tareas.
Terminal
mysql> DELETE FROM books WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Arriba podemos observar la DELETEinstrucción seguida de la FROMcláusula, que nos permite especificar la tabla donde se eliminará el registro, en este caso, books , seguida de la WHEREcláusula que indica que debe ser aquella donde el id es 1 .
Resumen
En resumen, los resultados de las operaciones CRUD son fundamentales para las operaciones de datos y la interacción con bases de datos. Las sentencias asociadas a ellas se enumeran a continuación.
- Crear (inserción INSERT) : agrega un nuevo registro a la tabla.
- Lectura (sentencia SELECT) : recupera un registro de la tabla.
- Actualizar (instrucción UPDATE) : modifica los datos existentes en la tabla.
- Eliminar (sentencia DELETE) : elimina el registro de la tabla.
Estas operaciones nos permiten gestionar y manipular eficazmente los datos dentro de una base de datos.
Responda las siguientes preguntas
Utilizando la tools_dbbase de datos, ¿cuál es el nombre de la herramienta en la hacking_toolstabla que se puede usar para realizar ataques de intermediario en redes inalámbricas?
Wi-Fi Pineapple
Utilizando la base de datos, ¿cuál es la categoría compartida para USB Rubber Ducky y Bash Bunny ? tools_db
USB attacks
Tarea 6 Cláusulas
Una cláusula es una parte de una instrucción que especifica los criterios de los datos que se manipulan, generalmente mediante una instrucción inicial. Las cláusulas nos ayudan a definir el tipo de datos y cómo deben recuperarse u ordenarse.
En tareas anteriores, ya utilizamos algunas cláusulas, como FROM la que se utiliza para especificar la tabla a la que accedemos con nuestra instrucción y WHEREla que especifica qué registros deben utilizarse.
Esta tarea se centrará en otras cláusulas: DISTINCT, GROUP BY, ORDER BY, y HAVING.
En esta tarea, continuaremos utilizando la tabla books que forma parte de la base de datos thm_books . Podemos acceder a ella con la instrucción use thm_books;.
Cláusula DISTINTA
Esta DISTINCTcláusula se utiliza para evitar registros duplicados al realizar una consulta, devolviendo únicamente valores únicos.
Vamos a usar una consulta SELECT * FROM booksy observar los resultados a continuación.
Terminal
mysql> SELECT * FROM books;
+—-+—————————-+—————-+——————————————————–+
| id | name | published_date | description |
+—-+—————————-+—————-+——————————————————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture |
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In |
| 6 | Ethical Hacking | 2021-11-02 | |
+—-+—————————-+—————-+——————————————————–+
6 rows in set (0.00 sec)
El resultado de la consulta muestra todo el contenido de la tabla books , y el registro Ethical Hacking se muestra dos veces. Ejecutemos la consulta de nuevo, pero esta vez, usando la DISTINCTcláusula.
Terminal
mysql> SELECT DISTINCT name FROM books;
+—————————-+
| name |
+—————————-+
| Android Security Internals |
| Bug Bounty Bootcamp |
| Car Hacker’s Handbook |
| Designing Secure Software |
| Ethical Hacking |
+—————————-+
5 rows in set (0.00 sec)
El resultado muestra que solo se devuelven cinco filas y que solo se muestra una instancia del registro de Hacking Ético .
Cláusula GROUP BY
Esta GROUP BYcláusula agrega datos de varios registros y agrupa los resultados de la consulta en columnas. Esto puede ser útil para funciones de agregación.
Terminal
mysql> SELECT name, COUNT(*)
FROM books
GROUP BY name;
+—————————-+———-+
| name | COUNT(*) |
+—————————-+———-+
| Android Security Internals | 1 |
| Bug Bounty Bootcamp | 1 |
| Car Hacker’s Handbook | 1 |
| Designing Secure Software | 1 |
| Ethical Hacking | 2 |
+—————————-+———-+
5 rows in set (0.00 sec)
En el ejemplo anterior, los registros de la tabla de libros se reagrupan según el resultado de la COUNTfunción. Ya sabemos que «Hacking ético» aparece dos veces, por lo que el recuento total es 2, ubicado al final ya que se agrupa por recuento.
Cláusula ORDER BY
La ORDER BYcláusula se puede usar para ordenar los registros devueltos por una consulta en orden ascendente o descendente. El uso de funciones como ASCy DESC nos puede ayudar a lograrlo, como se muestra a continuación en los dos ejemplos siguientes.
ORDEN ASCENDENTE
Terminal
mysql> SELECT *
FROM books
ORDER BY published_date ASC;
+—-+—————————-+—————-+——————————————————–+
| id | name | published_date | description |
+—-+—————————-+—————-+——————————————————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In |
| 6 | Ethical Hacking | 2021-11-02 | |
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers |
+—-+—————————-+—————-+——————————————————–+
6 rows in set (0.00 sec)
ORDEN DESCENDENTE
Terminal
mysql> SELECT *
FROM books
ORDER BY published_date DESC;
+—-+—————————-+—————-+——————————————————–+
| id | name | published_date | description |
+—-+—————————-+—————-+——————————————————–+
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers |
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In |
| 6 | Ethical Hacking | 2021-11-02 | |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester |
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture |
+—-+—————————-+—————-+——————————————————–+
6 rows in set (0.00 sec)
Podemos observar la diferencia al ordenar en orden ascendente usando ASCy en orden descendente usando DESC, ambos usando la fecha de publicación como referencia.
Cláusula de tener
La HAVINGcláusula se utiliza con otras cláusulas para filtrar grupos o resultados de registros según una condición. En el caso de GROUP BY, evalúa la condición a TRUEo FALSE, a diferencia de la WHEREcláusula HAVINGfiltra los resultados después de que se realiza la agregación.
Terminal
mysql> SELECT name, COUNT(*)
FROM books
GROUP BY name
HAVING name LIKE ‘%Hack%’;
+———————–+———-+
| name | COUNT(*) |
+———————–+———-+
| Car Hacker’s Handbook | 1 |
| Ethical Hacking | 2 |
+———————–+———-+
2 rows in set (0.00 sec)
En el ejemplo anterior, podemos observar que la consulta devuelve los libros con los nombres que contienen la palabra hack y la cantidad adecuada, como aprendimos anteriormente.
Responda las siguientes preguntas
Utilizando la tools_db base de datos, ¿cuál es el número total de categorías distintas en la hacking_toolstabla?
6
Utilizando la tools_db base de datos, ¿cuál es la primera herramienta (por nombre) en orden ascendente de la tabla? hacking_tools
Bash Bunny
Utilizando la tools_db base de datos, ¿cuál es la primera herramienta (por nombre) en orden descendente de la tabla? hacking_tools
Wi-Fi Pineapple
Tarea 7 Operadores
Cuando trabaja conSQLAl trabajar con lógica y comparaciones, los operadores son nuestra forma de filtrar y manipular datos de manera efectiva. Comprender estos operadores nos ayudará a crear consultas más precisas y potentes. En las próximas dos tareas, utilizaremos la tabla books que forma parte de la base de datos thm_books2 . Podemos acceder a ella con la instrucción . use thm_books2;
Operadores lógicos
Estos operadores comprueban la veracidad de una condición y devuelven un valor booleano verdadero TRUEo falso FALSE. A continuación, exploraremos algunos de estos operadores.
LIKE
Este LIKE operador se usa comúnmente junto con cláusulas como WHEREpara filtrar patrones específicos dentro de una columna. Sigamos usando nuestra base de datos para consultar un ejemplo de su uso.
Terminal
mysql> SELECT *
FROM books
WHERE description LIKE «%guide%»;
+—-+—————————-+—————-+——————————————————–+——————–+
| id | name | published_date | description | category |
+—-+—————————-+—————-+——————————————————–+——————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture | Defensive Security |
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester | Offensive Security |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
+—-+—————————-+—————-+——————————————————–+——————–+
4 rows in set (0.00 sec)
La consulta anterior devuelve una lista de registros de los libros filtrados, pero aquellos que utilizan la WHEREcláusula que contiene la palabra guía mediante el uso del LIKEoperador.
AND
El AND operador utiliza múltiples condiciones dentro de una consulta y devuelve un resultado TRUEsi todas son verdaderas.
Terminal
mysql> SELECT *
FROM books
WHERE category = «Offensive Security» AND name = «Bug Bounty Bootcamp»;
+—-+———————+—————-+——————————————————–+——————–+
| id | name | published_date | description | category |
+—-+———————+—————-+——————————————————–+——————–+
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
+—-+———————+—————-+——————————————————–+——————–+
1 row in set (0.00 sec)
La consulta anterior devuelve el libro con el nombre Bug Bounty Bootcamp , que pertenece a la categoría de Seguridad Ofensiva .
OR
El OR operador combina varias condiciones dentro de las consultas y devuelve un resultado TRUEsi al menos una de estas condiciones es verdadera.
Terminal
mysql> SELECT *
FROM books
WHERE name LIKE «%Android%» OR name LIKE «%iOS%»;
+—-+—————————-+—————-+——————————————————+——————–+
| id | name | published_date | description | category |
+—-+—————————-+—————-+——————————————————+——————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture | Defensive Security |
+—-+—————————-+—————-+——————————————————+——————–+
1 row in set (0.00 sec)
La consulta anterior devuelve libros cuyos nombres incluyen Android o IOS .
NOT
Este NOT operador invierte el valor de un operador booleano, lo que nos permite excluir una condición específica.
Terminal
mysql> SELECT *
FROM books
WHERE NOT description LIKE «%guide%»;
+—-+—————–+—————-+—————————————-+——————–+
| id | name | published_date | description | category |
+—-+—————–+—————-+—————————————-+——————–+
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In | Offensive Security |
+—-+—————–+—————-+—————————————-+——————–+
1 row in set (0.00 sec)
La consulta anterior devuelve resultados donde la descripción no contiene la palabra guía .
ENTRE Operador
El BETWEENoperador nos permite comprobar si un valor existe dentro de un rango definido .
Terminal
mysql> SELECT *
FROM books
WHERE id BETWEEN 2 AND 4;
+—-+—————————+—————-+——————————————————–+——————–+
| id | name | published_date | description | category |
+—-+—————————+—————-+——————————————————–+——————–+
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester | Offensive Security |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
+—-+—————————+—————-+——————————————————–+——————–+
3 rows in set (0.00 sec)
La consulta anterior devuelve libros cuyo ID está entre 2 y 4 .
Operadores de comparación
Los operadores de comparación se utilizan para comparar valores y comprobar si cumplen los criterios especificados.
=
El = operador (Igual) compara dos expresiones y determina si son iguales, o puede comprobar si un valor coincide con otro en una columna específica.
Terminal
mysql> SELECT *
FROM books
WHERE name = «Designing Secure Software»;
+—-+—————————+—————-+————————+——————–+
| id | name | published_date | description | category |
+—-+—————————+—————-+————————+——————–+
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
+—-+—————————+—————-+————————+——————–+
1 row in set (0.10 sec)
La consulta anterior devuelve el libro con el nombre exacto Designing Secure Software .
!=
El != operador (distinto de) compara expresiones y comprueba si no son iguales; también verifica si un valor difiere del que se encuentra dentro de una columna.
Terminal
mysql> SELECT *
FROM books
WHERE category != «Offensive Security»;
+—-+—————————-+—————-+——————————————————+——————–+
| id | name | published_date | description | category |
+—-+—————————-+—————-+——————————————————+——————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture | Defensive Security |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
+—-+—————————-+—————-+——————————————————+——————–+
2 rows in set (0.00 sec)
La consulta anterior devuelve libros excepto aquellos cuya categoría es Seguridad Ofensiva .
<
Menos que el operador
El < operador (menor que) compara si la expresión con un valor dado es menor que la proporcionada.
Terminal
mysql> SELECT *
FROM books
WHERE published_date < «2020-01-01»;
+—-+—————————-+—————-+——————————————————+——————–+
| id | name | published_date | description | category |
+—-+—————————-+—————-+——————————————————+——————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture | Defensive Security |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester | Offensive Security |
+—-+—————————-+—————-+——————————————————+——————–+
2 rows in set (0.00 sec)
La consulta anterior devuelve libros que se publicaron antes del 1 de enero de 2020 .
>
El >operador (mayor que) compara si la expresión con un valor dado es mayor que la proporcionada.
Terminal
mysql> SELECT *
FROM books
WHERE published_date > «2020-01-01»;
+—-+—————————+—————-+——————————————————–+——————–+
| id | name | published_date | description | category |
+—-+—————————+—————-+——————————————————–+——————–+
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In | Offensive Security |
+—-+—————————+—————-+——————————————————–+——————–+
3 rows in set (0.00 sec)
La consulta anterior devuelve libros publicados después del 1 de enero de 2020 .
Operadores de menor o igual que y mayor o igual que
El <= operador (menor o igual que) compara si una expresión con un valor dado es menor o igual que la expresión proporcionada. Por otro lado, el >= operador (mayor o igual que) compara si una expresión con un valor dado es mayor o igual que la expresión proporcionada. Veamos algunos ejemplos de ambos a continuación.
Terminal
mysql> SELECT *
FROM books
WHERE published_date <= «2021-11-15»;
+—-+—————————-+—————-+——————————————————+——————–+
| id | name | published_date | description | category |
+—-+—————————-+—————-+——————————————————+——————–+
| 1 | Android Security Internals | 2014-10-14 | An In-Depth Guide to Android’s Security Architecture | Defensive Security |
| 3 | Car Hacker’s Handbook | 2016-02-25 | A Guide for the Penetration Tester | Offensive Security |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In | Offensive Security |
+—-+—————————-+—————-+——————————————————+——————–+
3 rows in set (0.00 sec)
La consulta anterior devuelve libros publicados el 15 de noviembre de 2021 o antes .
Terminal
mysql> SELECT *
FROM books
WHERE published_date >= «2021-11-02»;
+—-+—————————+—————-+——————————————————–+——————–+
| id | name | published_date | description | category |
+—-+—————————+—————-+——————————————————–+——————–+
| 2 | Bug Bounty Bootcamp | 2021-11-16 | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
| 4 | Designing Secure Software | 2021-12-21 | A Guide for Developers | Defensive Security |
| 5 | Ethical Hacking | 2021-11-02 | A Hands-on Introduction to Breaking In | Offensive Security |
+—-+—————————+—————-+——————————————————–+——————–+
3 rows in set (0.00 sec)
La consulta anterior devuelve libros que se publicaron a partir del 2 de noviembre de 2021 .
Responda las siguientes preguntas
Utilizando la tools_dbbase de datos, ¿qué herramienta pertenece a la categoría de multiherramientas y resulta útil para pentesters y geeks ?
Flipper Zero
Utilizando la tools_db base de datos, ¿cuál es la categoría de herramientas con una cantidad mayor o igual a 300 ?
RFID cloning
Utilizando la tools_db base de datos, ¿qué herramienta pertenece a la categoría de inteligencia de red con una cantidad inferior a 100 ?
Lan Turtle
Tarea 8 Funciones
Al trabajar con datos, las funciones pueden ayudarnos a optimizar las consultas y operaciones, así como a manipular los datos. A continuación, exploraremos algunas de estas funciones.
Funciones de cadena
Las funciones de cadena realizan operaciones sobre una cadena y devuelven un valor asociado a ella.
Función CONCAT()
Esta función se utiliza para sumar dos o más cadenas de texto. Es útil para combinar texto de diferentes columnas.
Terminal
mysql> SELECT CONCAT(name, » is a type of «, category, » book.») AS book_info FROM books;
+——————————————————————+
| book_info |
+——————————————————————+
| Android Security Internals is a type of Defensive Security book. |
| Bug Bounty Bootcamp is a type of Offensive Security book. |
| Car Hacker’s Handbook is a type of Offensive Security book. |
| Designing Secure Software is a type of Defensive Security book. |
| Ethical Hacking is a type of Offensive Security book. |
+——————————————————————+
5 rows in set (0.00 sec)
Esta consulta concatena las columnas de nombre y categoría de la tabla de libros en una sola llamada book_info .
Función GROUP_CONCAT()
Esta función nos permite concatenar datos de varias filas en un solo campo. Veamos un ejemplo de su uso.
Terminal
mysql> SELECT category, GROUP_CONCAT(name SEPARATOR «, «) AS books
FROM books
GROUP BY category;
+——————–+————————————————————-+
| category | books |
+——————–+————————————————————-+
| Defensive Security | Android Security Internals, Designing Secure Software |
| Offensive Security | Bug Bounty Bootcamp, Car Hacker’s Handbook, Ethical Hacking |
+——————–+————————————————————-+
2 rows in set (0.01 sec)
La consulta anterior agrupa los libros por categoría y concatena los títulos de los libros dentro de cada categoría en una sola cadena .
Función SUBSTRING()
Esta función recuperará una subcadena de una cadena dentro de una consulta, comenzando en una posición determinada. También se puede especificar la longitud de esta subcadena.
Terminal
mysql> SELECT SUBSTRING(published_date, 1, 4) AS published_year FROM books;
+—————-+
| published_year |
+—————-+
| 2014 |
| 2021 |
| 2016 |
| 2021 |
| 2021 |
+—————-+
5 rows in set (0.00 sec)
En la consulta anterior, podemos observar cómo extrae los primeros cuatro caracteres de la columna published_date y los almacena en la columna published_year .
Función LENGTH()
Esta función devuelve el número de caracteres de una cadena, incluyendo espacios y signos de puntuación. A continuación, se muestra un ejemplo.
Terminal
mysql> SELECT LENGTH(name) AS name_length FROM books;
+————-+
| name_length |
+————-+
| 26 |
| 19 |
| 21 |
| 25 |
| 15 |
+————-+
5 rows in set (0.00 sec)
Como podemos observar arriba, la consulta calcula la longitud de la cadena dentro de la columna de nombre y la almacena en una columna llamada name_length .
Funciones agregadas
Estas funciones agregan el valor de varias filas que cumplen con un criterio específico en la consulta; pueden combinar varios valores en un solo resultado.
Función CONTAR()
Esta función devuelve el número de registros dentro de una expresión, como muestra el ejemplo a continuación.
Terminal
mysql> SELECT COUNT(*) AS total_books FROM books;
+————-+
| total_books |
+————-+
| 5 |
+————-+
1 row in set (0.01 sec)
La consulta anterior cuenta el número total de filas en la tabla books . El resultado es 5 , ya que hay cinco libros en la tabla books, y se almacena en la columna total_books .
Función SUMA()
Esta función suma todos los valores (excepto los nulos) de una columna determinada.
Nota: No es necesario ejecutar esta consulta. Esto es solo a modo de ejemplo.
Terminal
mysql> SELECT SUM(price) AS total_price FROM books;
+————-+
| total_price |
+————-+
| 249.95 |
+————-+
1 row in set (0.00 sec)
La consulta anterior calcula la suma total de la columna de precios . El resultado proporciona el precio agregado de todos los libros en la columna total_price .
Función MAX()
Esta función calcula el valor máximo dentro de una columna proporcionada en una expresión.
Terminal
mysql> SELECT MAX(published_date) AS latest_book FROM books;
+————-+
| latest_book |
+————-+
| 2021-12-21 |
+————-+
1 row in set (0.00 sec)
La consulta anterior recupera la fecha de publicación más reciente (valor máximo) de la tabla books . El resultado 2021-12-21 se almacena en la columna latest_book .
Función MIN()
Esta función calcula el valor mínimo dentro de una columna proporcionada en una expresión.
Terminal
mysql> SELECT MIN(published_date) AS earliest_book FROM books;
+—————+
| earliest_book |
+—————+
| 2014-10-14 |
+—————+
1 row in set (0.00 sec)
La consulta anterior recupera la fecha de publicación más antigua (valor mínimo) de la tabla books . El resultado, 2014-10-14 , se almacena en la columna earliest_book .
Responda las siguientes preguntas
Utilizando la tools_db base de datos, ¿cuál es la herramienta con el nombre más largo en función de la longitud de los caracteres?
USB Rubber Ducky
Utilizando la tools_db base de datos, ¿cuál es la suma total de todas las herramientas?
1444
Utilizando la tools_dbbase de datos, ¿cuáles son los nombres de las herramientas donde la cantidad no termina en 0 y agrupa los nombres de las herramientas concatenados por » & «?
Flipper Zero & iCopy-XS
Tarea 9 Conclusión
Felicitaciones por completarSQL¡Fundamentos! Esperamos que esta clase les haya enseñado la importancia de las bases de datos en la informática; con tantos casos de uso (con los que interactuamos frecuentemente en nuestro día a día), aprender los fundamentos es imprescindible si desean dedicarse a la ciberseguridad. Para finalizar, resumamos todo lo que se ha tratado en esta clase:
- Las bases de datos son colecciones de datos o información organizadas, de fácil acceso y que pueden ser manipuladas o analizadas.
- Los dos tipos principales de bases de datos son las bases de datos relacionales (utilizadas para almacenar datos estructurados) y las bases de datos no relacionales (utilizadas para almacenar datos en un formato no tabular).
- Las bases de datos relacionales se componen de tablas, columnas y filas . Las claves primarias garantizan la unicidad de un registro dentro de una tabla, y las claves foráneas permiten establecer una relación o conexión entre dos (o más) tablas.
- SQLEs un lenguaje de programación fácil de aprender que se puede utilizar para interactuar con bases de datos relacionales.
- Las sentencias de base de datos y tabla se pueden utilizar para crear/manipular bases de datos y tablas.
- Las operaciones CRUD ( INSERTAR, SELECCIONAR, ACTUALIZAR y ELIMINAR ) se pueden utilizar para gestionar datos en una base de datos.
- EnSQLPodemos utilizar cláusulas para definir cómo se deben recuperar, filtrar, ordenar o agrupar los datos.
- El uso eficiente de operadores y funciones puede ayudarnos a filtrar y manipular datos enSQL.
Con esto finaliza esta habitación. ¡Haz clic en el botón de abajo para completarla!
Sigan entrenando, Hacketones, Nos vemos en el próximo laboratorio!!!