22 julio, 2011
Introducción
“SQL Injection” es un tipo de ataque que se ha vuelto muy popular en los últimos años por la utilización cada vez más habitual de sitios web que interactúan con bases de datos SQL. Si a esto le sumamos que la mayoría de los programadores no se capacitan en técnicas y metodologías de seguridad, terminamos con aplicaciones web mal diseñadas o con faltas de controles en la validación de datos, por lo que se vuelven aplicaciones vulnerables.
Al final del artículo veremos algunas contramedidas útiles para evitar este tipo de ataques.
El objetivo de este ataque es insertar o modificar consultas a una base de datos SQL (como MS SQL Server, MySQL, PostgreSQL, Oracle, etc) a través de una consulta al sitio web vulnerable para obtener resultados diferentes a los deseados por el desarrollador de la aplicación. Con esto, por ejemplo, podríamos lograr evitar una validación de usuario y contraseña, u obtener datos confidenciales que se alojan en la base.
Abajo podemos ver un ejemplo de código en PHP, que concatena las variables $login y $pass directamente dentro de la consulta SQL, sin realizar ninguna validación del contenido de las variables.
$entrada = mysql_query(“SELECT usuario FROM usuarios WHERE usuario=’$login’ and clave=’$pass'”)
if(mysql_num_rows($entrada)==’0′)
{ echo ‘Acceso Denegado’; }
else
{ echo ‘Acceso Permitido’; }
El objetivo del código es buscar en la base de datos de usuarios si exista alguna coincidencia para un nombre de usuario y claves iguales a los que se están introduciendo en el formulario web.
Si nosotros logramos que el contenido de la variable $login sea “fabian” y el contenido de la variable $pass sea igual a:
hack’ or ‘1’=1′
Esto simplemente podríamos lograrlo rellenando el formulario con los datos: “fabian” y “hack’ or ‘1’=1′” (sin las comillas dobles) en los campos usuario y contraseña.
La consulta que se realizaría a la base de datos sería la siguiente:
SELECT usuario FROM usuarios WHERE usuario=’fabian’ and clave=’hack’ or ‘1’=’1′;
El resultado de esta consulta va a devolver los registros de todos los usuarios, porque en la segunda parte de la consulta (que va después del ‘or’) estamos pasando una sentencia que siempre va a ser verdadera (‘1’=’1’). Gracias a esto, se van a devolver registros y el programa va a permitir el acceso.
Evidentemente, la posibilidad de los ataques depende tanto del lenguaje en el que está programado el sitio web (generalmente PHP y ASP) y de la base de datos que se está utilizando.
Además, existen muchas otras técnicas para realizar SQL Injection, pero requieren una excelente comprensión, tanto de las bases de datos, como de los lenguajes de programación. Siempre con la ayuda de un poco de suerte, porque debemos adivinar varios comportamientos de la aplicación, para determinar cómo atacarla.
Herramientas de ataque
Existen varias herramientas que podemos utilizar para facilitarnos las tareas de encontrar vulnerabilidades en los sitios web. Como siempre, es mejor que, por lo menos, tengamos buenos conocimientos acerca de los conceptos, antes de utilizar estas herramientas.
Algunas de las más destacadas son:
sqlmap http://sqlmap.sourceforge.net
sqlninja http://sqlninja.sourceforge.net
Contramedidas
Escapar las consultas
Una de las funciones de las que disponemos en PHP para luchar contra este tipo de ataques es “mysql_real_scape_string()”, que toma como parámetro una cadena, y la modifica evitando todos los caracteres especiales, por lo que la vuelve segura para introducirla a la función “mysql_query()”.
Verificar los tipos y longitud de datos
Si esperamos recibir un cierto tipo de datos, no podemos simplemente confiar que lo sea. Existen funciones para verificar tipos de valor, como “is_int()”, “is_long()”, “is_char()”, y otras. También podemos convertir entre tipo, con “settype()”.
También debemos comprobar la longitud de los datos, por ejemplo con “strlen()”
Programar bien!
Si, si, la mejor contramedida para evitar este tipo de ataques es programar bien y con un buen entendimiento de la seguridad informática. Aunque sea, debemos estar al tanto de los conceptos relacionados con la seguridad en aplicaciones web. No es necesario que seamos ‘hackers’ o expertos en seguridad para realizar esto, simplemente es necesario contar con las bases y el interés de desarrollar de forma segura.
Más información:
http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
En algunos de los siguientes artículos volveremos a tratar los temas de SQL Injection y analizaremos otras herramientas.
Aprovecho estas líneas para invitarlos a mi newsletter mensual, en el cual podrán encontrar más información acerca de noticias, herramientas y novedades acerca de la seguridad informática: www.portantier.com/educacion/newsletter
¡Hasta la próxima!
Fabian Portantier
www.portantier.com
twitter.com/#!/portantier