Explotación de vulnerabilidades de inyección SQL con Nmap

Beginner

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

¡Bienvenido a este laboratorio interactivo! Nuestro enfoque se centra en las vulnerabilidades de inyección SQL, un riesgo grave y prevalente para las aplicaciones web. En términos simples, los ataques de inyección SQL ocurren cuando una aplicación recibe datos que no han sido debidamente verificados o codificados, y estos datos se incluyen en una consulta SQL. Esta brecha puede permitir a los ciberataques ejecutar comandos SQL dañinos, lo que podría conducir a un acceso no autorizado a datos confidenciales o permitirles realizar otras acciones dañinas.

El objetivo de este laboratorio es doble. En primer lugar, pretendemos desmitificar los conceptos fundamentales de las vulnerabilidades de inyección SQL, desglosándolos en partes comprensibles. En segundo lugar, proporcionamos práctica práctica para ayudarte a aprender cómo explotar estas vulnerabilidades, no con intención maliciosa, sino para comprenderlas mejor y prevenirlas. Este enfoque práctico te dotará de los conocimientos y habilidades necesarios para proteger tus aplicaciones de tales amenazas.


Skills Graph

Configuración del entorno de laboratorio

En esta sección, lo guiaremos a través del proceso de configuración de un entorno de laboratorio donde puede practicar ataques de inyección SQL.

  1. Descargar la imagen Docker de DVWA:
    La imagen Docker de DVWA está disponible en Docker Hub. Puede descargarla utilizando el siguiente comando:

    docker pull vulnerables/web-dvwa
  2. Ejecutar el contenedor Docker de DVWA:
    Después de descargar la imagen, puede ejecutarla con el siguiente comando:

    docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

    Este comando iniciará un nuevo contenedor y mapeará el puerto 80 del contenedor al puerto 80 de su máquina host.

El paso anterior prepara el entorno necesario para el laboratorio. Después de completar la configuración, inicie el navegador Firefox en su escritorio y escriba la siguiente URL: http://localhost.

Después de un breve momento, se encontrará en la página de inicio de sesión. Las credenciales predeterminadas son las siguientes: nombre de usuario - "admin" y contraseña - "password".

Le dará la bienvenida la página web de DVWA (Damn Vulnerable Web Application). Haga clic en el botón "Create/Reset Database" para generar una nueva base de datos para la aplicación.

Nota importante: Con el propósito de este laboratorio, configuraremos el nivel de seguridad en "bajo". Este ajuste hace que las vulnerabilidades de inyección SQL sean más evidentes. Para hacer esto, seleccione "bajo" del menú desplegable "Security Level" y luego haga clic en el botón "Submit".

Identificar el punto de inyección SQL

En este módulo, vamos a descubrir la presencia de una vulnerabilidad de inyección SQL en una aplicación.

En el menú de la izquierda de la aplicación, encontrará un enlace etiquetado como "SQL Injection" (Inyección SQL). Haga clic en este enlace para navegar a la página de Inyección SQL. Aquí, se encontrará con un formulario que solicita un ID de usuario.

Paso 2: Ingresar un ID de usuario de ejemplo

Intentemos ingresar un ID de usuario para ver qué sucede.

Entrada de ejemplo:

1

Escriba "1" en el formulario y haga clic en el botón "Submit" (Enviar). La salida debería mostrar detalles sobre un usuario con el ID 1.

Paso 3: Inspeccionar el código fuente

Al hacer clic en el botón "View Source" (Ver código fuente), puede inspeccionar el código fuente de la página. Debería ver algo similar al siguiente código PHP:

$id = $_GET['id'];
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($conn, $sql);

Este código revela que la aplicación construye una consulta SQL concatenando directamente la entrada del usuario con la declaración SQL. Este es un error común que puede crear potencialmente vulnerabilidades de inyección SQL.

Paso 4: Confirmar la vulnerabilidad de inyección SQL

Para verificar la existencia de una vulnerabilidad de inyección SQL, intentemos inyectar una comilla simple (') después del valor "1". Ingrese lo siguiente en el formulario:

1'

Si ve un mensaje de error de base de datos, significa que la aplicación es vulnerable a ataques de inyección SQL. Este es un paso clave para identificar y luego abordar tales vulnerabilidades.

Determinar el tipo de inyección SQL y el tipo de base de datos

En esta sección, lo guiaremos a través del proceso de identificación del tipo de vulnerabilidad de inyección SQL y del tipo de base de datos que utiliza una aplicación determinada.

Nuestro primer objetivo es determinar el número de columnas que devuelve la consulta SQL original. Para lograr esto, emplearemos la cláusula ORDER BY.

Código de ejemplo:

1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#

Por favor, ingrese las declaraciones SQL anteriores una por una en el formulario. Si la aplicación se comporta como se espera, las dos primeras consultas se ejecutarán sin errores, mientras que la tercera resultará en un fallo. Este fallo indica que la consulta SQL original está devolviendo dos columnas.

Luego, podemos utilizar el operador UNION para extraer datos adicionales de la base de datos.

Código de ejemplo:

1' UNION SELECT version(), @@version_compile_os#

Esta declaración SQL recuperará la versión de la base de datos y la versión del sistema operativo en el que se está ejecutando.

Después de ejecutar esta consulta, la salida debería mostrar la información sobre la versión de la base de datos y el sistema operativo.

Recuperar el nombre de la base de datos

En esta lección, lo guiaremos a través del proceso de recuperación del nombre de la base de datos que una aplicación está utilizando. Esta es una habilidad esencial, especialmente cuando se intenta entender la estructura y organización de una base de datos.

Código de ejemplo:

1' UNION SELECT database(), user()#

La consulta SQL anterior es un ejemplo de una técnica llamada "Inyección SQL". Es una técnica de inyección de código que los atacantes utilizan para explotar una vulnerabilidad de seguridad que se produce en la capa de base de datos de una aplicación. Esta consulta específica recupera el nombre de la base de datos actual y el usuario que ejecuta la consulta.

Esto es lo que está sucediendo:

  • 1' UNION: Esta es la primera parte de la inyección SQL. La parte 1' es para completar la consulta que probablemente esté ejecutando la aplicación. La palabra clave UNION se utiliza para combinar los resultados de dos o más declaraciones SELECT sin devolver filas duplicadas.
  • SELECT database(), user()#: Esta parte de la consulta es la carga útil que está inyectando. La función database() recupera el nombre de la base de datos actual, y la función user() recupera el nombre del usuario que ejecuta la consulta.

Después de enviar la consulta, debe esperar ver el nombre de la base de datos y la información del usuario en la salida. Esta información puede ser esencial para comprender mejor la estructura de la base de datos y los privilegios del usuario en el contexto de la aplicación.

Recuerde, comprender estas técnicas no solo ayuda a explotar vulnerabilidades, sino también a crear aplicaciones seguras al saber contra qué defenderse.

Recuperar nombres de tablas

En esta lección, daremos un paso más y exploraremos más sobre la estructura de la base de datos recuperando los nombres de las tablas que contiene. Comprender la estructura de las tablas es crucial cuando se intenta extraer o manipular datos en una base de datos.

Código de ejemplo:

1' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa'#

La consulta SQL anterior sigue utilizando la técnica de Inyección SQL. Esta vez, se utiliza para recuperar los nombres de las tablas en la base de datos y su respectivo esquema de base de datos.

A continuación, la desglose:

  • 1' UNION: Como se explicó anteriormente, esta parte tiene como objetivo completar la probable consulta de la aplicación y combinarla con nuestra carga útil inyectada.
  • SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa': Esta parte de la consulta es nuestra carga útil inyectada. Recupera los nombres de las tablas y su respectivo esquema de base de datos de la tabla del sistema information_schema.tables, específicamente para el esquema 'dvwa'.

La tabla information_schema.tables es una tabla del sistema que contiene información sobre todas las tablas en la base de datos. El table_schema se refiere al nombre de la base de datos de la que forma parte la tabla, y table_name es el nombre de la tabla.

Después de enviar la consulta, debe esperar ver los nombres de las tablas y su respectivo esquema de base de datos en la salida. Esta información puede proporcionar una guía para una mayor exploración o explotación de la base de datos.

Como siempre, recuerde que comprender estas técnicas es esencial no solo para explotar vulnerabilidades, sino también para crear aplicaciones seguras al entender contra qué defenderse.

Recuperar nombres de columnas y datos

En esta lección, profundizaremos en la estructura de la base de datos recuperando los nombres de las columnas de una tabla específica. Con este conocimiento, luego podemos extraer datos potencialmente sensibles de la tabla.

Código de ejemplo:

1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users'#

La consulta SQL anterior utiliza la inyección SQL para recuperar los nombres de las columnas de la tabla 'users'. Concatena estos nombres de columnas en una sola cadena para facilitar la visualización.

A continuación, la desglose:

  • 1' UNION: Como se explicó anteriormente, esta parte tiene como objetivo completar la probable consulta de la aplicación y combinarla con nuestra carga útil inyectada.
  • SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users': Esta parte de la consulta es nuestra carga útil inyectada. Recupera los nombres de las columnas de la tabla 'users' y los concatena en una sola cadena utilizando la función group_concat.

Después de enviar la consulta, debe esperar ver los nombres de las columnas en la salida.

Ahora que tenemos los nombres de las columnas, podemos recuperar datos sensibles de la tabla 'users'.

Código de ejemplo:

1' UNION SELECT user, password FROM users#

Esta consulta SQL utiliza la inyección SQL para recuperar las columnas 'user' y 'password' de la tabla 'users'.

Después de enviar la consulta, debe esperar ver los nombres de usuario y las contraseñas cifradas en la salida. Esta información puede ser extremadamente sensible, y entender cómo se puede extraer es esencial tanto para explotar vulnerabilidades como para defenderse contra tales ataques.

Recuerde, el objetivo de comprender estas técnicas tiene dos aspectos: identificar posibles vulnerabilidades y construir aplicaciones más seguras.

Resumen

En este laboratorio, aprendiste sobre las vulnerabilidades de inyección SQL y cómo explotarlas a través de la práctica. Configuraste una aplicación web vulnerable, identificaste el punto de inyección SQL, determinaste el tipo de inyección SQL y el tipo de base de datos, y recuperaste información sensible de la base de datos explotando la vulnerabilidad de inyección SQL.

Al completar este laboratorio, adquiriste experiencia práctica en la comprensión y explotación de las vulnerabilidades de inyección SQL, que se encuentran entre las vulnerabilidades de aplicaciones web más comunes y peligrosas. Este conocimiento te ayudará a identificar y mitigar tales vulnerabilidades en escenarios del mundo real, mejorando tus habilidades en seguridad de aplicaciones web.