Notas de Luis

Hay dos formas de hacer este ataque, de forma manual o de forma automática, por tanto lo haremos de ambar maneras.

SQL Injection Manual

CONOCER LA BASE DE DATOS ACTUAL:

Y ya lo tenemos:

BUSCAR OTRAS BASES DE DATOS ADEMÁS DE LA ACTUAL

Y se nos muestran otras bases de datos:

CONOCER TABLAS DE UNA BASE DE DATOS

Y una vez hecho esto podemos ver como la tabla se llama registration:

CONOCER LAS COLUMNAS DE UNA BASE DE DATOS

Y este es el resultado:

CONOCER LOS REGISTROS DE UNA BASE DE DATOS

Y nos sale esta información, la cual vamos a guardar por si acaso:

SQL Injection Automática con SQLmap

Ahora en este punto vamos a utilizar sqlmap para obtener las credenciales para acceder, pero debemos hacerlo en el login del principio:

Para ello interceptamos la petición con burpsuite y guardamos el contenido de la petición en un documento .txt:

Lo pasamos a un bloc de notas:

Y ahora ejecutamos este primer comando con sqlmap para conocer las bases de datos:

Y ya tenemos las dos bases de datos:

Ahora vamos a conocer las tablas de la base de datos main:

Y nos encontró estas 3 tablas, que la interesante es la de user:

Ahora vamos a acceder a las columnas de la tabla users:

Y ya tenemos el resultado:

Y ahora vamos a acceder a los registros de cada una de estas columnas:

Y nos encontró esta credencial, aunque viene hasheada:

OPCIÓN 2 CON SQLMAP

Por ejemplo tenemos este panel de login de la máquina MAQUINA SHOP (Fuzzing, SQLi con sqlmap, escalada de privilegios en Linux con linpeas, perl y gtfobins)

En este punto, podemos probar si esto es vulnerable a una sql injection con sqlmap con este parámetro:

sqlmap -u http://192.168.0.38/administrator/ --forms --dbs --batch

Y tenemos estas bases de datos:

Ahora vamos a atacar a la base de datos webapp, donde si queremos ver las tablas con sqlmap, debemos usar el siguiente parámetro:

sqlmap -u http://192.168.0.38/administrator/ --forms -D Webapp --tables --batch

Y vemos la tabla users:

Ahora para ver las columnas de la tabla Users, lo haríamos de la siguiente forma:

sqlmap -u http://192.168.0.38/administrator/ --forms -D Webapp -T Users --columns --batch

Y ahora para ver todos estos registros con los usuarios y contraseñas, lo haríamos con el siguiente parámetro:

sqlmap -u http://192.168.0.38/administrator/ --forms -D Webapp -T Users -C password,id,username --dump --batch

Por tanto ahora vamos a probar en acceder por ssh con el usuario bart y contraseña b4rtp0w4:

bart:b4rtp0w4
### Funcionamiento de SQL Injection Explicada desde MySQL
Vamos a mostrar el funcionamiento de una SQL injection desde MySQL para entenderlo mejor, por tanto creamos una base de datos llamada users:

CREATE DATABASE users;

Y ahora creamos una tabla llamada acceso:

CREATE TABLE acceso (

id_usuario INT NOT NULL AUTO_INCREMENT,
usuario VARCHAR(50) NOT NULL,
contraseña VARCHAR(50) NOT NULL,
PRIMARY KEY (id_usuario)

);

Ahora creamos 2 usuarios, uno penguin y otro mario, donde en ambos se va a guardar las credenciales de acceso:

INSERT INTO acceso (id_usuario, usuario, contraseña) VALUES (1, 'mario', 'megastrongpassword'), (2, 'penguin', 'megapenguinhack123');

Y ahora si hacemos un select * from acceso, veremos que ya tenemos estos dos usuarios insertados:

![](pasted_image_20230314124843.png)

Vamos ahora a hacer una consulta de tal forma que vamos a simular cómo funcionaría dentro de un panel de login de una web, de tal forma que veremos el funcionamiento de una SQL injection. Por tanto así sería como se efectúa una consulta de forma normal dentro de un panel de login de una página web:

select * from acceso WHERE usuario='mario' AND contraseña='megastrongpassword';

![](pasted_image_20230314125456.png)

Y así es lo que ocurriría si a través de una SQL injection queremos ver toda la información:

select * from acceso WHERE usuario='mario' or 1=1– - AND contraseña='no lo se';

Y lo que va a ocurrir es que poniendo este ' or 1=1-- - se va a corromper la consulta y nos va a mostrar todo el contenido de la base de datos:

![](pasted_image_20230314125528.png)

### CÓMO EVITAR SQL INJECTION
En primer lugar, tenemos este código donde conectamos la base de datos con Python:

import mysql.connector

conexion = mysql.connector.connect(user=“root”, password=“124816mario”,

                                  host="localhost",
                                  database="users",
                                  port="3306",)

miCursor = conexion.cursor()

sql = “SELECT * FROM acceso”

miCursor.execute(sql)

myresult = miCursor.fetchall()

for x in myresult:

print(x)
![](pasted_image_20230315110409.png)

Y como vemos este código es vulnerable a una SQL injection:

![](pasted_image_20230315110739.png)

Si queremos evitar la inyección SQL debemos utilizar un %s para establecer la posición de la variable que recibe el campo de username; y de esta forma no va a interpretar el ' or 1=1-- -':

import mysql.connector

conexion = mysql.connector.connect(user=“root”, password=“124816mario”,

                                  host="localhost",
                                  database="users",
                                  port="3306")

usuario = input(“Inserta usuario: ”) password = input(“Inserta contraseña: ”)

miCursor = conexion.cursor()

Debes colocar una coma después de la variable "mario" para convertirla en una tupla

sql = “SELECT * FROM acceso WHERE usuario = %s AND contraseña = '{}'”.format(password) username = (usuario,)

miCursor.execute(sql, username)

myresult = miCursor.fetchall()

for x in myresult:

  print(x)
Por tanto ahora si ejecutamos esto, al poner el intento de inyección SQL en el input, veremos que no va a funcionar y no nos va a sacar nada:

![](pasted_image_20230315112513.png)

Y no nos devuelve nada:

![](pasted_image_20230315112539.png)

Y también podemos limpiar las inyecciones SQL utilizando expresiones regulares, por ejemplo de esta forma:

import mysql.connector import re

conexion = mysql.connector.connect(user=“root”, password=“124816mario”,

                                  host="localhost",
                                  database="users",
                                  port="3306")

usuario = input(“Inserta usuario: ”) password = input(“Inserta contraseña: ”)

sql_injection_regex = re.compile(r“['\”;:\-\(\)\{\}\[\]\<\>\*\=\+`%]“) usuario_limpio = sql_injection_regex.sub(”“, usuario) # En la variable usuario_limpio se guarda el usuario guardado pero quitando los símbolos de sql injection que pueda haber.

miCursor = conexion.cursor()

sql = “SELECT * FROM acceso WHERE usuario = %s AND contraseña = %s”

Los parámetros se pasan como una tupla

params = (usuario_limpio, password)

miCursor.execute(sql, params)

myresult = miCursor.fetchall()

for x in myresult:

  print(x)

Se cierra la conexión a la base de datos

conexion.close()

<code>

### SQL INJECTION EN BARRA DE BÚSQUEDA DE UNA WEB También podemos efectuar ataques SQL injection dentro de la barra de búsqueda de una página web. Por ejemplo supongamos que tenemos esta página web que se trata de un laboratorio de portswigger:

![](pasted_image_20230317184118.png)

Aquí nos encontramos con esta url:

![](pasted_image_20230317184138.png)

Podemos ver que el FOOD & DRINK se encuentra url encodeado, por lo que podemos probar en insertar una SQL injection ' or 1=1– -, pero hay que hacerlo url encodeado, por lo que abrimos burp suite y lo convertimos:

![](pasted_image_20230317184301.png)

Y ahora pegamos esto en la URL y habremos explotado una SQL injection, donde estamos mostrando toda la información de la base de datos de la página web:

![](pasted_image_20230317184345.png)

![](pasted_image_20230317184400.png)

computing/hacking/hacking_web/sql_injection.txt · Última modificación: por 127.0.0.1