Inyección SQL en aplicaciones Web (I)
Escrito por J.F. el Wednesday, 5 de September del 2007 a las 10:03
Podemos definir inyección SQL como la vulnerabilidad en la validación de entradas a la base de datos en una aplicación. La aplicación puede ser cualquier tipo de software que precise del uso de base de datos, o una aplicación web que interactúa con base de datos para funcionar, ya bien sea en un sistema de búsqueda, extracción, inserción de información o creación de lugares restringidos mediante la creación de usuarios con contraseñas estableciendo diferentes niveles de permisos. La inyección SQL es un fallo que puede resultar terrible, ya que permite la ejecución de sentencias SQL no deseadas, desde borrado de tablas hasta cambio de permisos pasando por obtención de passwords y otros datos de tablas. Es uno de los errores que sucede tanto a programadores inexpertos como a otro más avanzados, por lo que debe ser algo que siempre tengamos en mente y pongamos todas las medidas posibles para curarnos en salud. Vamos a explicar con algún ejemplo la inyección SQL. El caso más tÃpico es el de una tabla que almacena el nombre de un usuario y su contraseña correspondiente. Imaginemos una tabla creada de la siguiente forma:
-
CREATE TABLE identificacion
-
(usuario varchar (50) PRIMARY KEY,
-
password varchar (50));
Ahora pongamos el ejemplo simple de un formulario HTML que va a procesar la información que le mandamos en una consulta contra la base de datos:
Recibiremos esos 2 parámetros por el método POST, y los utilizaremos para consultar en la base de datos. Nuestra pretensión es que si existen usuario y contraseña y coinciden, se acceda a un nuevo área privada de nuestro sitio web, en caso contrario se denegará el acceso a dicho área. Veamos pues con 2 ejemplos de consultas contra la base de datos para validar la existencia del usuario y su correspondiente password, que pueden parecernos muy naturales, pero pueden depararnos sorpresas muy desagradables si no tomamos las precauciones necesarias.
Primer caso:
-
SELECT * FROM identificacion WHERE usuario = '$usuario' AND password = '$password';
En éste caso, si el nombre de usuario es correcto, y la contraseña es la asignada, permitirÃamos el acceso a nuestra sección privada de la web. Si en el campo usuario escribieran "Pepe" (sin comillas), y en el campo contraseña introdujeran la contraseña,por ejemplo "1234", no ocurrirÃa nada. Se verificarÃa si es correcto, dando acceso en caso de serlo y denegándolo en caso contrario. Pero, ¿Qué ocurrirÃa si algún usuario malintencionado introdujera como nombre de usuario "Pepe" y como contraseña "1234'; DROP TABLE identificacion" ? Pues estarÃamos ejecutando las siguientes querys contra nuestra base de datos:
-
SELECT * FROM identificacion WHERE usuario = 'Pepe' AND password = '1234';
-
DROP TABLE identificacion;
Aquà podemos ver claramente por qué se llama Inyección SQL, al no estar controlado el tema de las comillas, el usuario nos ha colado otra orden SQL en el campo de texto password, y podrÃa realizar cualquier operación que deseara, en éste caso el borrado de una tabla. Quizás a alguno se os venga una pregunta a la cabeza, ¿Como sabÃa el usuario que tengo una tabla en la base de datos llamada identificacion? Varios pueden ser los motivos. Por ejemplo, podrÃan haber visto algún error en nuestra página web, de los que nos arroja el servidor por defecto, en los que puede aparecer el nombre de la base de datos o el nombre de alguna tabla. Por ello resulta muy importante controlar los errores que se muestran(evitando los errores que se muestran por defecto, que puedan facilitar información acerca de nuestra base de datos), cambiándolos por alguna pantalla estándar tipo "Error en la base de datos", dejando los otros errores para depurar.Para evitar mostrar ningún tipo de error podemos usar la función error_reporting de PHP, de la que ya hemos hablado. Otro factor a la hora de "adivinar" información acerca de nuestra base de datos puede ser recurrir a nombres comunes que se le pueden dar a tablas, como "user", "password", "comments", etc. También puede suceder que la Inyección SQL se dé en un CMS tipo WordPress, PHP-Nuke, PHPBB, etc. Ahà el trabajo se ha facilitado, ya que cualquier puede instalar una de éstas aplicaciones y comprobar la estructura de la base de datos con pelos y señales. Por ello es necesario estar al tanto de nuevos parches y actualizaciones que surjan, ya que aunque el nivel de seguridad de éstas aplicaciones es alto, los desarrolladores de los mismos no están exentos de cometer errores, y son miles de personas las que se dedican a buscar agujeros de seguridad. Veamos otro segundo ejemplo de consulta, con la cual podemos llevarnos también una sorpresa:
-
SELECT Count(*) FROM Usuarios WHERE Usuario = '$usuario' AND Password = '$password';
En éste caso verificaremos que la consulta nos devuelva un registro para permitir o no el acceso, por tanto en teorÃa tan sólo escribiendo el nombre de usuario y contraseña correctos deberÃamos poder acceder al área privada de nuestro sitio web. Pero nuevamente aparece un usuario malintencionado, el cual escribe lo siguiente en el formulario de logueo:
Usuario: ' or '1'='1
Contraseña: ' or '1'='1
En éste caso la consulta que se ejecutará es la siguiente:
-
SELECT COUNT(*) FROM identificacion WHERE usuario = '' OR '1'='1' AND password = '' OR '1'='1'
Obviamente, todos sabemos que uno es igual que uno, por lo tanto ésta consulta devolverÃa true y por tanto un acceso no deseado a la sección privada de neustra página web. Y éstos son sólo 2 métodos de tratar inyectar código SQL, pero hay otro tipo de formas mucho más complejas y profundas, que puedes encontrar facilmente navegando por Internet, puesto que los 2 ejemplos expuestos son facilmente controlables. ¿Cuales son las diferentes formas y métodos de evitar la inyección SQL? ¿Alguna herramienta para poder buscar vulnerabilidad de inyección SQL en nuestra páginas, de modo que podamos cubrirlas? Pues sÃ, todo ello lo detallaré en otros artÃculos, pero hasta el momento espero que hayan podido ver en qué consiste la inyección SQL y cuales son sus graves consecuencias.
Comentarios (12)
Categoria: General
- Añadir este post a
- Del.icio.us -
- Meneame -
- Digg -
- Webeame
Entradas relacionadas
Pingback de » Herramienta para detectar Inyección SQL y vulnerabilidades XSS | Informática Práctica |
Realizado el Wednesday, 19 de September del 2007 a las 14:06
[...] en lo que respecta a seguridad en aplicaciones web. La inyección SQL la tratamos en 3 partes(I,II,III) y las vulnerabilidades XSS en una. Si no las conoces te recomiendo su lectura para que te [...]
Comentario de Pedro
Realizado el Friday, 23 de November del 2007 a las 18:03
Gracias, con esto me aclaro muy bien
Comentario de JAIME LANDAZURY
Realizado el Friday, 15 de February del 2008 a las 23:00
QUIERO SABER DE TODOS LOS METODO DE APLICACION DE INYESION
Comentario de J.F.
Realizado el Monday, 18 de February del 2008 a las 17:19
Pues métodos hay montones, a cada cual más complicado, algunos de ellos lso encontrarás en enlaces de la tercera parte del artÃculo.
Comentario de Albertcito
Realizado el Tuesday, 22 de April del 2008 a las 7:08
Creo que podrÃa ser igualmente de eficiente colocar un if con expresiones regulares, por ejemplo que las entradas solos sean de letras y numero y no pueden llevar espacios!!!
if(ereg( "[0-9a-z]", $usuario) && ereg ("[0-9a-z]", $password))
Bueno grax por los datos en todo caso estan super buenos .. Aioz
Comentario de J.F.
Realizado el Wednesday, 23 de April del 2008 a las 23:05
Gracias por tu opinión Albertcito, logicamente hay muchas formas y respuestas a los problemas ![]()
Un saludo.
Comentario de guerra
Realizado el Thursday, 17 de July del 2008 a las 8:12
si alguien me pudede ayuda este esmi msn
porfavor!!!!!
quiero yudaaa!!!yaa!!!!!
Comentario de guerra
Realizado el Thursday, 17 de July del 2008 a las 8:12
enserio gente se los pido porfavor!!!!!!!
Comentario de busypetskitc
Realizado el Tuesday, 19 de August del 2008 a las 18:27
juicy yes all watch stay you all clean wood busy sun microsoft water
Comentario de s
Realizado el Thursday, 4 de September del 2008 a las 22:34
Comentario de zinjcv mghvs
Realizado el Sunday, 9 de November del 2008 a las 10:29
qakzyhp ckqnizx kemipy gpta xzyeki fmvkuwc tzpvq
Comentario de arkadis
Realizado el Thursday, 30 de April del 2009 a las 0:41
muy bueno, me ayudaste mucho a entender lo del inyeccion sql!
