miércoles, 12 de diciembre de 2012

ATAQUES DE INYECCIÓN (Parte 1)

SQL inyección

1  ¿Qué es?

Es un método de ataque que suele utlizarse en sitios web y otras aplicaciones que se conectan con bases de datos. Se aprovecha de un fallo en la mala depuración de los datos pasados desde el usuario a la consulta SQL(Structured Query Language).

2  ¿Cómo funciona?

Cuando un usuario dispone de un campo donde poder insertar cadenas de texto y hacer búsqueda en una base de datos suele enviar “palabras” o datos relacionados, por ejemplo en el  formulario de la Figura 16:


La consulta de dicho formulario sería la siguiente:
SELECT * FROM tabla_usuarios WHERE usuario=’$nombre’ AND password=’$password’;

Un usuario legítimo introduciría su nombre y contraseña, por ejemplo las cadenas Pepe y  12345. Al introducir esos datos la consulta que se pasaría a la base de datos sería:
SELECT * FROM tabla_usuarios WHERE usuario=’Pepe’ AND password=’12345’;


Siguiendo con el ejemplo la base de datos buscaría al usuario con la contraseña 12345  y si la información es correcta realizaría una operación como puede ser entrar en la web personal del usuario.
En cambio si un usuario malintencionado introdujera otro tipo de datos en los cuadros de texto el resultado no sería el mismo. Por ejemplo, los datos:

Usuario: ' OR 1=1 --'
Clave: dsadsadsa

produciría la siguiente consulta:
SELECT * FROM tabla_usuarios WHERE usuario=' ' OR 1=1 --''AND password=' dsadsadsa';

A continuación se ofrece un análisis de esta consulta:

1)       El  usuario es un espacio vacío, y puesto que normalmente no existe ningún usuario en las bases de datos con ese usuario, en condiciones normales se produciría un error.
           
2)       A continuación la consulta incluye un comando  OR 1=1. Aunque lo más seguro es que la base de datos no contenga ningún usuario con el nombre vacío, la condición 1=1 siempre se cumple, con lo que desde un punto de vista global la consulta ya no va a devolver un error

3)      Después del término 1=1 después se ha introducido un --, es decir, se ha comentado lo que resta de consulta anulando la comparación de la contraseña, con lo que el intruso ya tiene acceso a generar errores en el  sistema y puede  probar con otras consultas hasta que nuestra base de datos empiece a devolverle datos de interés para él, como pueden ser los nombres de usuario, contraseñas, etc.
3  ¿Cómo se puede evitar?

Si no se genera  una correcta depuración de los datos que los usuario pueden introducir en todos los formularios de la web tarde o temprano con los programas que existen hoy en día de forma automática o manualmente mediante el método de  ensayo y error algún atacante podrá  acceder a los datos de una base de datos, aunque la solución es sencilla.

En PHP basta con incluir en las consultas peligrosas la siguiente función:
mysql_real_escape_string();

Esta función provoca que los caracteres peligrosos sean previamente comentados insertando de forma automática una \ delante de los símbolos como son ¡, \, “.

En Java existe un método llamado escapeSQL procedente de la librería Apache Common Language que sirve para obtener el mismo resultado que PHP, reemplazando los caracteres especiales para que toda la cadena sea interceptada como texto. A continuación se muestra un ejemplo de uso:

Antes:
ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre =
 '" + nombreUsuario + "';");

Después:
ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre =
 '" + StringEscapeUtils.escapeSQL(nombreUsuario) + "';");


Como se puede apreciar es muy sencillo evitar este ataque, lo cual es muy importante ya que se trata de uno de los ataques más utilizados actualmente en la red donde  cada día aparecen más sitios web, por ejemplo, recientemente la web de Sony a manos del grupo de hackers Anonimous, los mismos causantes del robo de cuentas de PlayStation, Bibliografía[31].
En resumen, para evitar este tipo de ataques es necesario formatear todos los textos que procedan de los usuarios, incluso los términos de búsqueda, ya que normalmente son los más olvidados pero pueden ser utilizados para inyacter código.

No hay comentarios:

Publicar un comentario

Esperando tu comentario...