martes, 8 de marzo de 2011

No solo nosotros... [Parte II]

Continuando con los bugs en otras universidades... Ahora veremos un par de errores en la página web de... bueno, no voy a decir de que universidad xD

El primer error se trata de un típico SQL Injection. La URL vulnerable es:

http://palestra.??????.edu.pe/index.php?id=

Donde la variable vulnerable es "id". Primero probé poniendo una comilla simple para ver si producía error. El resultado fue este:

Fig. 1 - La web filtra las comillas.

Como se observa, la aplicación se ha encargado de escapar la comilla anteponiéndole un "\" por lo tanto no se altera la orden SQL y no se produce el error. Sin embargo no siempre es necesaria una comilla para alterar la sintaxis. Los valores numéricos no necesitan estar entre comillas en una sentencia SQL y estamos frente a ese caso ;)

Haciendo un test por contradicción podemos observar que sí logramos interferir en la consulta.

Fig. 2 - Cuando es falso muestra un error.

Fig. 3 - Cuando es verdadero muestra el artículo.

Cuando inyectamos "and 1=0" la condición siempre será falsa y no se seleccionará ningún artículo por tanto la aplicación muestra un mensaje de error. Pero cuando inyectamos "and 1=1" la condición no se altera y nos muestra el artículo con id 423.

Bien, ya descubrimos la vulnerabilidad... Ahora juguemos un poco.

Luego de tontear un rato con ORDER BY podemos concluir que se seleccionan 17 columnas. La verdad fue algo confuso porque la variable id se usa en 2 consultas con diferente número de columnas. Así, mientras que en una no da error en la otra sí. Felizmente el error de la segunda consulta no impide que la primera muestre su resultado ;)

Ya sabiendo el número de columnas el siguiente paso es observar qué campos se muestran en la página web. Lo haremos con un UNION SELECT así:

/index.php?id=null+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17%23

Fig. 4 - Distribución de los campos mostrados.

En la imagen vemos que los campos que se muestran son el 2, el 3 y el 5. Podemos usar cualquiera de esos para extraer información de la base de datos ;)

A modo de prueba vamos a obtener el nombre de las bases de datos que hay en el servidor. Para ello haremos una consulta a la tabla "schemata" de "information_schema" así:

/index.php?id=null+union+select+1,2,3,4,schema_name,6,7,8,9,10,11,12,13,14,15,16,17+from+information_schema.schemata%23

Fig. 5 - Solo muestra el primer resultado.

Pero observamos que solo muestra el primer resultado. Para ver los demás resultados tenemos las siguientes alternativas:

  • Pedir uno a uno todos los nombres usando la clausula LIMIT.
  • Hacer un "Serialized SQL Injection" y mostrar muchos de los nombres en una sola consulta ;)

Lo del LIMIT ya lo hemos explicado antes así que será pretexto para aprender algo nuevo.

Serialized SQL Injection es una técnica que nos permite mostrar muchos resultados de una consulta en un solo campo visible. Para ello se emplean diferentes métodos de acuerdo con el gestor de base de datos (Oracle, SQL Server, MySQL, etc) En el caso de MySQL se usa la función "group_concat" que concatena los resultados que pertenecen un mismo grupo en una sola cadena.

La consulta serializada quedaría así:

/index.php?id=null+union+select+1,2,3,4,group_concat(schema_name+separator+0x20),6,7,8,9,10,11,12,13,14,15,16,17+from+information_schema.schemata%23

Fig. 6 - Consulta serializada.

La función group_concat permite especificar un separador. En este caso use como separador "0x20" que no es más que un espacio en blanco codificado en hexadecimal para no hacer uso de las comillas ;)

La segunda vulnerabilidad que encontré en este sitio es un LFI. Sí, la misma vuln que explicamos en la primera parte. Y ya sabes que SQLi + LFI es una combinación muy peligrosa. Felizmente, para el admin del site, el usuario de la base de datos no tiene el permiso "FILE" que es el que permite usar "INTO OUTFILE" para inyectar el código.

Les dejo una imagen donde se muestra el fichero "/etc/passwd" como prueba de concepto:

Fig. 7 - PoC del LFI.

Es todo... por hoy.

Un saludo.

4 comentarios:

  1. No entiendo para que tapas el nombre de la web, si en la url se puede ver hahahahaah

    ResponderEliminar
  2. Jajaja... no tapaba el nombre de la web... tapaba el logo que tenía de fondo ;)

    Igual, supongo que buscando un poco se puede dar con la web...

    Un saludo.

    ResponderEliminar
  3. xD jajaja quien sera el q no encuentre la web hahaha

    ResponderEliminar
  4. =P jaja vasta con poner poner la palabre en google jaja muy buen articulo aunque hay mucho mas por hacer jaja

    ResponderEliminar