Apuntes de SQL Injection (SQLi)

Resumen

El propósito de este laboratorio es enseñar cómo funciona la vulnerabilidad SQL Injection (SQLi) a través de un ejemplo práctico en un entorno local utilizando MariaDB, Apache y PHP. A través de varios métodos, como el Error Based SQLi, Union Based SQLi y Time-Based SQLi, aprenderemos a identificar y explotar esta vulnerabilidad para obtener información confidencial de una base de datos.


Instalación de Entorno

Para comenzar con este laboratorio, debemos instalar los siguientes paquetes en una máquina con Ubuntu/Debian.

Pasos de Instalación:

sudo apt install mariadb-server apache2 php-mysql

Una vez instalados los paquetes, procedemos a iniciar los servicios de Apache y MySQL:

sudo service apache2 start
sudo service mysql start

Verificamos que el servidor de Apache esté escuchando en el puerto 80 con el siguiente comando:

lsof -i:80


Código PHP Vulnerable

El siguiente código PHP simula una consulta a una base de datos usando el parámetro id pasado por GET. Este es un ejemplo clásico de SQL Injection debido a que la entrada no está saneada, permitiendo que un atacante ejecute código SQL malicioso.

<?php

  $server = "localhost";
  $username = "moltengama";
  $password = "louise";
  $database = "hack4u";

 // Conexión a la base de datos
  $conn = new mysqli($server, $username, $password, $database);

  $id = mysqli_real_escape_string($conn, $_GET['id']);
 # echo  "El comando esjecutado es '$id'";
  #echo "______________________________________";
  $data = mysqli_query($conn, "select nombre from users where id = $id");

  $response = mysqli_fetch_array($data);
 
  if (!isset($response['nombre'])){
    http_response_code(404);
  }
?>

Explicación del código:

  1. El código establece una conexión a la base de datos MySQL utilizando credenciales específicas.
  2. Realiza una consulta SQL para obtener el nombre de usuario de la tabla users basándose en el parámetro id que se pasa a través de la URL.