jueves, junio 14, 2007

Blind SQL Injection (I de ….) en MySQL

Ya mucho sabéis que estoy trabajando desde hace tiempo con los ataques a ciegas, que les tengo especial cariño, por todas las repercusiones que tienen. En este año y pico llevo dándole las vueltas a esta idea tan sencilla de sacar información de una base datos utilizando la lógica de verdadero y falso con las inyecciones SQL, XPath, etc…

Todo lo que he ido aprendiendo sobre las técnicas de Blind lo he ido usando en mi trabajo, en las auditorías de seguridad, lo he contado en múltiples charlas (el día 24 de Julio lo contaré en Málaga y el 26 de Julio lo contaré en Madrid – Getafe), también lo usé para plantearos el Primer Reto Hacking [solucionario], pero además lo he usado para el Proyecto de Fin de Carrera que entrego esta semana. Un resumen del Proyecto, someramente, lo he escrito en dos artículos para PCWorld, uno en este mes y otro para el mes que viene que ya iré posteando más adelante por aquí.

Pero entre que leo el proyecto y os pongo los artículos hay muchas cosas chulas que quiero ir poniendo por aquí. Algunas ya las conoceréis, otras quizás os sean nuevas, pero para que nadie se pierda vamos a ir despacito, a ver si en 15 o 20 posts puedo ir poniendo todo lo que me parece interesante sobre estas técnicas.

Hoy os quiero poner una herramienta, que tiene ya un par de años, y es para realizar Blind SQL Injection en base a palabras clave y para MySQL. ¿Y esto que significa?

La idea básica de las técnicas de Blind SQL Injectión es explotar una vulnerabilidad SQL Injection en base a respuestas de verdadero o falso ante preguntas lógicas.

Ejemplo número 1: Basado en palabras claves.

Imaginad una aplicación típica LAMP en la que tenemos una URL del tipo:

- http://www.miwebserverchulo.com/miprograma.php?mi_id=1

que nos devuelve una bonita página HTML con sus letas y sus fotos y todas sus cosas interesantes. Bien, ahora ponemos un poco de lógica en la inyección utilizando un carácter muy malo: el espacio.

- http://www.miwebserverchulo.com/miprograma.php?mi_id=1 and 1=1
- http://www.miwebserverchulo.com/miprograma.php?mi_id=1 and 1=0


Si tras realizar la llamada con la inyección "and 1=1" no pasa nada, es decir, obtenemos la misma página, quiere decir que ha ejecutado la inyección. Si al ejecutar la inyección con "and 1=0" devulve otra página cambiada, entonces el sitio está muerto.

¿Como explotarlo? Pues utilizando las técnicas de Blind SQL Injection. Hoy no quiero centrarme demasiado en ellas, y prefiero que veáis un video que referencio en el artículo de Julio de PCWorld. El video es de las herramientas SQLBftools.

Utilizan como forma de automatización cadenas clave. Esto quiere decir que en la página de verdad (la de respuesta ante la inyección and 1=1) deberemos buscar una palabra que no aparezca en la página de mentira (la que nos da con la inyección and 1=2). Esto tiene mil matices y connotaciones, pero valga el post de hoy para que los que empiezan con esto puedan ir aprendiendo. Lo bueno de esta sencilla aproximación es que a partir de verdad y mentira puedes descubrir los objetos de la base de datos, las columnas, los datos y hasta los ficheros del servidor. Yo he probado este juguetito y han bajado bastantes /etc/passwd.

El vídeo lo podéis descargar de esta URL junto con una explicación más detallada por parte del autor, pero como no estaba en Youtube y me parecía más cómodo lo he subido.



SQLBFTools video

Divertido, ¿no? Con verdadero y falso se creo el algebra de bool, ¿no?

No seais malos....

31 comentarios:

Pedro Laguna dijo...

Con verdadero y falso se creo el algebra de bool y con no y otra respuesta el algebra de las mujeres :P

Ya sabes, las hay que no escapan comillas!

P.D. Mis disculpas si alguna de las señoritas que lee este blog (penyaskito) se ha podido sentir ofendida.

Okercho dijo...

Donde vas a dar la charla en Málaga?

Pedro Laguna dijo...

Ahora ya en serio, que anoche se me fue... Me han dicho que los politicos que salen en la nueva web del congreso esta un poco ciegos y no ven lo que piensa el pueblo.

Maligno dijo...

Hola okercho,

me tienen que dar la dirección exacta, en cuanto lo tenga publico el registro por aquí.

Pedro, no toques nada, ayer ya eché un ojo y la cosa está muy mal, he pasado un aviso interno ayer noche de urgencia porque es que no hay quien se crea esto. ¡Qué chapuzas!

Y encima con nuestros amigos del yate chulo. Amos que...

Saludos

Macmarc dijo...

Muy buen articulo, como siempre maligno...

alex dijo...

Maligno pues si que está la cosa muy mal, jejeje. Espero con ansiedad todos los post sobre esta técnica. Un saludo!

penyaskito dijo...

@pedrolaguna:
Yo escapo comilla. No soy la tabla del 0, chavalote.

Eso sí, no me ofendes ;)

penyaskito dijo...

@pedrolaguna:
En anieto2k también hablan del tema de los diputados...

Maligno dijo...

La dichosa página tiene más fallos que su puñetero padre y se pueden sacar todos los datos de la base de datos simplemente jugando con cierta herramienta parecida a esta que publiqué en el boletín de noticias hace 15 días. De verguenza!

Sirw2p dijo...

HOYGAN ke yo soy el ke programo la web del congreso, ¿alguien save como vorro una tabla con PHPMyadmin?

alex dijo...

Y yo pensaba que sabía algo de HTML!!!!No tengo ni idea; Que código tan claro...

penyaskito dijo...

@maligno:
Lo encontré manualmente ya.
Si ves el enlace que puse, verás lo que nos ha costado a los contribuyentes la gracieta.
Algunos encima se quejan de que el dinero vaya a licencias de productos Microsoft... Aunque sea de código cerrado, al menos esos sí saben lo que hacen...

Maligno dijo...

Bien, bien penyaskito.

Hay que encontrarlo manualmente, pero luego se puede explotar muy graciosamente con la bebida rara esa que es tan fuerte. Strooh?? o era otra cosa?

Ramón Sola dijo...

Ya se puede consultar la información del evento del 24 de julio en Málaga. Después de observar la agenda, un servidor opina que estaría allí más perdido que un pulpo en un garaje. :D

Por cierto, nunca había pensado en el potencial de la Blind SQL Injection con respecto a la inyección normal. Por supuesto, la solución es validar ABSOLUTAMENTE TODO en las páginas del servidor web y conectarse a la base de datos con una cuenta que posea el menor conjunto de privilegios que sea suficiente para realizar la tarea: si necesita consultar la tabla X, sólo se le permite consultar la tabla X y punto.

Maligno dijo...

Sí, Ramón, así de sencillo. Hacer las cosas bien no tiene porque ser complejo.

El blind es muy potente, en el vídeo se ve con Mysql, pero ya pondré algunas cositas con Oracle y SQL Server, muy divertidas.

Vente a Málaga y las ves funcionando, no es tan complicado!

Saludos!

Javier dijo...

Pues yo creo que mas bien el ciego debo ser yo, porque no encuentro dentro de la web del Congreso cual es la pagina vulnerable. La única que a mi parecer es vulnerable es esta:
http://www.congreso.es/portal/page/portal/Congreso/Congreso/Iniciativas/LeyesAprob?codTipoLey=-1

pero da igual si le añado " and 1=1" o " and 1=2", porque en los dos casos me devuelve la misma pagina.

Por cierto Chema, la presentacion del Security Day de Madrid muy buena. Creo que lo mejor del Security Day fue por la mañana. Porque por la tarde cuando se metieron con el System Center Essentials la verdad fue un poco rollo...

Javier dijo...

Perdona, la pagina que creo que es vulnerable es esta:

http://www.congreso.es/portal/page/portal/Congreso/Congreso/Iniciativas/LeyesAprob?codTipoLey=-1

Pero, ya digo, añadiendo " and 1=1" o " and 1=2" devuelve lo mismo.

Javier dijo...

http://www.congreso.es/portal/page/portal/
Congreso/Congreso/Iniciativas/LeyesAprob?codTipoLey=-1

Maligno dijo...

Hola Javier!!

bueno, ya has encontrado una pista, te garantizo que no es dificil encontrarlo, pero no quiero publicarlo en el blog no vaya a ser que alguien se meta en lios...

Javier dijo...

Hola Maligno, al ver tu comentario me animé y seguí navegando por la web hasta que al final encontré la página vulnerable.
Solo quiero aprender y ver la vulnerabilidad por mis propios ojos. Porque la verdad atacarle a la web del Congreso es bastante arriesgadillo, (a menos que estes detrás de varios proxys anónimos, pero aún asi tengo mis dudas).

Un saludo!

Anónimo dijo...

Disculpa man queria probar esta herramienta y mi pregunta es que debe ir al final donde esta la xxxx mysqlbf.exe http://web.com/n.php?id=3" "version()" "xxxxx"

no tengo ni idea aver si me oprientas con eso.

Maligno dijo...

Hola anónimo, el tercer parámetro es una cadena de texto que aparezca en la página de respuesta positiva y no en la página de respuesta negativa, si te ves el vídeo lo entenderás bien.

un saludo.

Anónimo dijo...

mysqlbf.exe http://web.com/n.php?id=3" "objeto()" "xxxxx"

man y disculpa aparte de los objetos:
- version(), database()
- user(), system_user(),
- session_user(), current_user()
- last_insert_id(), connection_id()

Que otras cosas puedo probar por ejemplo si quiero hacer un "show tables" es posible.o que mas cosas puedo hacer

Maligno dijo...

Hola anónimo,

te puedes traer ficheros del servidor, si el usuario tiene acceso y datos de tablas, pero sólo si sabes la tabla o es una versión 5 dónde puedes acceder a information.schema.

Saludos!

Anónimo dijo...

disculpa mi ignorancia pero como puedo saber que accesos tengo y podrias ponerme un ejemplo plis.

Maligno dijo...

Hola anónimo,

debes probar nombres de rutas de ficheros "que conozcas en el servidor" y nombres de tablas y columnas "que conozcas". En el video hace un ejemplo con mysqlget y mysqlst dónde lo explica. Échale un ojo.

Saludos!

JF dijo...

Muy interesante post,

en los últimos meses he recibido dos ataques en una de las webs que he hecho.

¿Mediante un tipo de ataque como este se pueden subir ficheros al server y/o añadir codigo a ficheros existentes? ¿o tan solo se "ataca" la bbdd?

La verdad es que el hacker no ha "roto" nada, lo que si ha dejado al sitio fuera de google debido a que ha añadido un montón de links y documentos html y eso ha sido capado por el famoso algoritmo.

El asunto empieza a ser preocupante ya que entre el responsable del hosting y yo hemos intentado buscar cualquier posible debilidad y no hemos conseguido gran cosa.

Si tienes/teneis cualquier sugerencia.

Muchas gracias y felicidades por el blog,

JF

Maligno dijo...

@JF, no, mediante esta técnica puede sacar passwords para luego subir ficheros mediante la aplicación, pero no creo que pueda subir nada.

;)

Anónimo dijo...

Hola!

Me gustaría que me explicaras que significa para ti: "Si tras realizar la llamada con la inyección "and 1=1" no pasa nada, es decir, obtenemos la misma página, quiere decir que ha ejecutado la inyección. Si al ejecutar la inyección con "and 1=0" devulve otra página cambiada, entonces el sitio está muerto."

Sobre todo en la parte de: entonces el sitio está muerto.

Resulta que encontré un sitio que cumple con este párrafo y ahora qué sigue?

saludos.

correodejoseperez dijo...

El sitio está muerto supongo que significa que se pueden hacer injecciones porque se cumple la sentencia que hace el query false y entonces es vulnerable a los atakes.

imix illimani dijo...

Genial, muchas gracias

Entradas populares