28 de abril de 2010

SQL Injection: El enemigo más peligroso.

Una de las técnicas de hacking más temidas por los administradores de bases de datos y los desarrolladores web es el “SQL injection”, la cual consiste en insertar o “inyectar” código malicioso en las sentencias SQL comúnmente utilizadas en gran cantidad de procesos en las aplicaciones actuales.


Hoy en día una aplicación web que no tenga acceso a una base de datos tiene muy poco que ofrecer competitivamente hablando, y quizás es por esta razón primordialmente que esta práctica es tan temida.

¿Cómo funciona? muy simple. Fijémonos en una sentencia SQL muy simple que toma un dato obtenido desde un formulario de búsqueda para obtener los datos coincidentes con dicha información creada en ASP y con una variable (userinput) que será cambiada en tiempo de ejecución por el contenido que inserte el usuario en dicho formulario:


"SELECT * FROM usuarios WHERE login = ' " & userinput & "'"


Al recibir el contenido que el usuario inserta en el campo del formulario como por ejemplo su login la sentencia queda como:

"SELECT * FROM usuarios WHERE login = 'admin'"


Pero que sucedería si el hacker en lugar de “admin” inserta un trozo de sentencia SQL como el siguiente:

'; DROP TABLE usuarios --


La respuesta es simple: La sentencia definitiva quedaría de la siguiente manera:


'SELECT * FROM usuarios WHERE login = '';DROP TABLE usuarios --"


Para quienes no tienen conocimientos básicos de SQL también es fácil entender que a partir de dicho momento habríamos perdido completamente el contenido de la tabla “usuarios” en nuestro sistema.

Este ejemplo anterior es solo uno de los muchos tipos diferentes de SQL injection que existen, sin embargo es uno de los más siniestros. La pregunta más importante es la que surge inmediatamente después de este ejemplo: ¿Cómo puedo saber si mi sitio web es vulnerable al SQL injection? Y si es así, ¿cómo puedo prevenir esta técnica de intrusión tan peligrosa?

Ambas preguntas van de la mano, sin embargo y aunque no es la única medida a ser tomada para evitar este tipo de práctica y es solo un remedio temporal, les tengo un buen dato:

Simplemente verifiquen del lado del servidor (recuerden que del lado cliente el “javascript “se puede deshabilitar) que el contenido que inserta el usuario no contenga comillas simples (las que normalmente se encuentran bajo el símbolo de interrogación en los teclados en español), y reemplácenlas por la entidad HTML de escape correspondiente (')

Existen muchos otros métodos de SQL injection que me comprometo a tratar en otros artículos, e indudablemente la solución que acabo de dar es solo una simple aspirina, pero como la aspirina misma es útil en el 50% de los casos.

Hasta la próxima…

Entradas populares