Tecnicas de Blind-Mysql-Injection

14
ht http://underterminal.nixiweb.com irc.freenode.net #uterminal ht http://underterminal.nixiweb.com irc.freenode.net #uterminal Blind Mysql Injection Bit-Shifting && FIND_IN_SET Autor: [Q]3rV[0]

Transcript of Tecnicas de Blind-Mysql-Injection

Page 1: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Blind Mysql Injection

Bit-Shifting && FIND_IN_SET

Autor: [Q]3rV[0]

Page 2: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Hola como estan todos!? este es un nuevo pdf en el que pretendo desarrollar de manera sencilla y entendible dos tecnicas de inyeccion a ciegas en base de datos Mysql, por un lado me gustaria comenzar a hacer un corto repaso de la tecnica "binary search" que es comunmente las mas usada y conocida para realizar este tipo de ataques, despues pasar a lo que es el metodo "Bit Shifting" y por ultimo culminar con otro metodo que hace uso de la funcion FIND_IN_SET(). Para este laboratorio se usara un entorno virtual que corre con el S.O MandrakeLinux 10.1, un servidor apache 2.0.50 y un gestor mysql entre otros servicios.

Scanning de Puertos y Servicios con Nmap

Sistema Virtual para Pruebas (Mandrakelinux 10.1

Page 3: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Bien empecemos a repasar un poco sobre la tecnica "Binary Search", La aplicacion a la cual llamaremos "Roguer-Lab", posee un script vulnerable a inyeccion sql en unos de sus parametros.(/noticias.php?id=sqli). Asi que nos dedicamos a buscar las respuestas true && false para comenzar con la inyeccion de manera satisfactoria.

Como podemos deducir la aplicacion devuelve "/BARCAMP" cuando la sentencia es verdadera.

Nos arroja "/BLIND SQL-INJECTION" cuando es falsa.

Page 4: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Ya sabiendo la forma en la que la aplicacion interatuara con nosostros, podemos empezar a realizar querys, la inyeccion que se utilizara a cojntinuacion sera para obtener el nombre de la db usando la funcion database(), quedando de la siguiente manera.

/noticias.php?id=2 ||ascii(substring(database(),1,1))>50--

Basicamente la inyeccion trabaja de la siguiente manera. La funcion substring() toma el primer caracter de la salida que arroja database()en este caso el nombre de la base de datos es "talleres", luego ascii convierte ese caracter en su equivalente y luego se compara el resultado con su posible equivalente, pueden usarse los operadores > < para ir tratando de deducir el caracter oculto.

Luego de un par de consultas obtenemos un resultado true por parte de la base de datos, 116 equivale a la letra "t" en la tabla ascii. Sucesivamente asi hiremos descubriendo los demas caracteres variando la funcion substring (substring(database(),x,1). x corresponde a la posicion de los caracteres dentro de una cadena.

Page 5: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Una vez realizado un breve repaso, prosigamos con esta tecnica que en principio es bastante confusa, pero una vez que se lleva a la practica se ve de una manera no tan complicada como antes. El Bit Shifting o "corriendo bits" basicamente se basa en eso, correr los bits de un caracter para poder ir deduciendo cada uno y asi obtener la representacion completa del mismo en binario, no se entiende un carajo? no? pero mas adelante van a ver como se va a comprender todo esto.

Primero que nada, aclarar que los operadores usados en mysql para ir hacia la izq o derecha son (<< >>).

Los caracteres en la tabla ascii en realidad estan compuestos por 7 bits, el problemas es que algunas codificaciones que lo extienden le suman uno llevandolo a estar conformado por 8 bits. Ocea que para lograr obtener el resultado de un caracter serian necesarias 8 consultas no?.

Como es ese tema de correr bits?.En la inyeccion anterior deducimos que la primera letra que conforma el nombre de la db es la letra "t"Si la representamosen binario obtenemos t = 01110100

Bien hasta ahi vamos bien. ahora vamos a correr un bit hacia la derecha01110100 >> 00111010 Se dan cuenta que el ultimo bit de la derecha desaparecio y al principio de la izquierda aparecio magicamente un 0 :O.

Bit Shifting

Page 6: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Sigamos corriendo bits a ver que pasa?

01110100 >> 01110100 0 bits01110100 >> 00111010 1 bits01110100 >> 00011101 2 ""01110100 >> 00001110 3 ""01110100 >> 00000111 4 "" 01110100 >> 00000011 5 ""01110100 >> 00000001 6 ""01110100 >> 00000000 7 ""

Si nos ponemos a analizar, el primer bit quedo al principio del lado derecho, justamente ese va a ser el bit que vamos a usar de referencia para comenzar .

La inyeccion no varia mucho a la anterior.

noticias.php?id=2 || ascii(substring(database(),1,1))>>7=0

El resultado deberia darnos true ya que el primer bit equivale a 0.

Page 7: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Sigamos buscando bits!La tecnica se basa en deducir, tenemos dos opciones 1 y 0, ademas de dos posibles resultados, 00 o 01 entienden?

noticias.php?id=2 || ascii(substring(database(),1,1))>>6=0

Nos devuelve false, eso quiere decir que el siguiente bit corresponde a 1 ocea que hasta ahora hemos obtenido los siguientes bits 01.

Vamos a enganchar el tercero!

Para este las posibilidades son 011 o 010011=3 010=2

Tomamos su equivalencia en ascii y comparamos.

Page 8: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

noticias.php?id=2 || ascii(substring(database(),1,1))>>5=3

Nos tira true! por lo tanto el tercer bits corresponde a 1 obteniendo hasta ahora 011.

Vamos para arriba!, siguientes posibilidades0111=70110=6

Y el que se voltea a silvina luna es...?

noticias.php?id=2 || ascii(substring(database(),1,1))>>4=6

Page 9: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

False! asi que hasta ahora llevamos el resultado 0111.Bene, ahora que ya supongo que se entendio la estructura de la inyeccion, hay que proseguir hasta obtener los 8 bits que conforman el caracter en este caso son 01110100 equivalente a 116 que en la tabla ascii corresponde a la fucking letra "t" :O. Esta tecnica no acelera mucho el proceso que digamos, ya que tenemos que realizar 8 consultas clavadas, pero es una nueva forma de obtener resultados y tenia ganas de exponerla.

Page 10: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

La funcion FIN_IN_SET es utilizada por el motor mysql para indicar la posicion de un caracter dentro de un rango determinado de varios, para entenderlo mejor vamos a trabajar con mysql directamente.

Se le indica el caractera buscar 'q' y le pasa un rango entre los cuales esta a letra a buscar ('a,%,$,I,J,q,P,/,ñ') la funcion se encarga de revelar la poscicion de q =6.

Esta funcion junto con otras como BIN() y MID() van a ser utilizadas para realizar inyecciones a ciegas, pero como?, primero expliquemos que hacen ambas funciones,.

MID(): No es muy diferente de substring() o substr() usada para seleccionar un caracter dentro de un string.

FIND_IN_SET

Page 11: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

BIN(): convierte un valor a binario.

Entonces volvemos a la pregunta...

Como se pueden utilizar estas funciones en una inyeccion a ciegas?

asi...

noticias.php?id=2 || @a:=mid(bin(find_in_set(mid(database(),1,1),'a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z')),1,1)=@a and if (@a!='', @a, sleep(4))--

Tranquilos, ahora paso a explicar este chorizo...

Vamos por partes.

Las variables en mysql se simbolizan con @, y := es un operador de asignacion, por lo tanto a la variable @a se le va a ser asignado el resultado de la sentencia:

mid(bin(find_in_set(mid(database(),1,1),'a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z')),1,1)

Despacito y sin apuros vamos a ir desmembrando el code.

Nuevamente consultamos el nombre de la base de datos, la funcion mid() toma el primer caracter, luego find_in_set() busca la posicion del mismo en el rango asignado ('a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z').Hagamos un parate aca, yo use este rango por que se que el nombre de la db es una cadena simple, sin mayusculas ni caracteres especiales, ademas queria hacer la query mas corta.La salida de find_in_set que seria 20 es convertida a binario por la funcion BIN() obteniedose 10100, nuevamente MID() nos develara el primer bit.

Page 12: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Y para que esta if (@a!='', @a, sleep(4))-- ?

Como no sabemos la longitud total, tendremos que realizar una extructura condicional con if, cuando se obtenga un valor vacio, la pagina tardara 4 segundo en cargar.

Bueno, vamos a probar a ver que tal nos va! siempre comparando como true=1 y false=0

@a:=mid(bin(find_in_set(mid(database(),1,1),'a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z')),1,1)=@a and if (@a!='', @a, sleep(4))--

Obtenemos una respuesta true, el primer bit corresponde a 1

Solo basta seguir realizando el mismo proceso variando en el uso de la primer funcion mid(), para obtener los siguientes bits, hasta que la pagina caiga en delay de 4 segundos @a:=mid(bin(find_in_set(mid(database(),1,1),'a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z')),x,1)=@a and if (@a!='', @a, sleep(4))--

Page 13: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Para obtener los demas caracteres solo habra que modificar la segunda uncion mid().

@a:=mid(bin(find_in_set(mid(database(),x,1),'a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z')),1,1)=@a and if (@a!='', @a, sleep(4))--

La unica complicacion con esta tecnica es que FIND_IN_SET no puede dirferenciar entre mayusculas y minisculas, por ejemplo, tenemos el siguiente nombre de db "T_talleres", la funcion nos daria la misma pocicion ante ambos caracteres "T" y "t"

Esto se puede solucionar con INSTR()

INSTR(): Devuelve la posicion de la primera coincidencia de una cadena dentro de otra, la funcion es sensible a mayusculas cuando uno de los parametros es una cadena del tipo binary .

Por ende la sentencia quedaria de la siguiente manera.

a:=mid(bin(instr('abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQSTUVWXYZ', cast(mid(database(),1,1) as bynary))),1,1)=@a and if (@a!='', @a, sleep(4))--

Lo unico que cambia es el remplazo de FIND_IN_SET() por INSTR() en complemento con CAST().

Page 14: Tecnicas de Blind-Mysql-Injection

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

hthttp://underterminal.nixiweb.com irc.freenode.net #uterminal

Espero que hayan disfrutado de este pequeño pdf y comprendido como funcionan ambos metodos. Ponganse la venda y denle masa! XD! mis saludos a los lectores.

[Q]3rV[0]