Maestros del Web


Estás en Inicio / Editorial / Bases de Datos

10.03.2004

Inyección de código SQL

La inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.

SQL
Este tipo de errores puede permitir a usuarios malintencionados acceder a datos
a los que de otro modo no tendrían acceso y, en el peor de los casos,
modificar el comportamiento de nuestras aplicaciones.

Vamos a ver con un ejemplo que significa eso
de “Inyección de código”:

Supongamos que tenemos una aplicación Web (realizada en ASP por sencillez)
en la que el acceso a ciertas secciones está restringido. Para restringir
ese acceso creamos una tabla de usuarios y contraseñas y sólo
los usuarios que se validen contra esa tabla podrán acceder a esos contenidos.
Una manera de que los usuarios se validen será colocar un par de cuadros
de texto en nuestra página Web (por ejemplo txtUsuario y txtPassword)
donde puedan introducir su nombre y su contraseña y enviar ese par usuario/contraseña
a la base de datos para comprobar si es válido.

Primero creamos la tabla que vamos a usar
y la rellenamos con datos:

use web– Nuestra base de datos se llama webgo– Creamos una tabla para almacenar los pares usuario/contraseñacreate table usuarios (Usuario varchar (50) not null primary key,
Password varchar (50))go– Introducimos un par de datos de pruebainsert into usuarios (Usuario, Password) values (’Admin’, ‘1234′)insert into usuarios (Usuario, Password) values (’Usuario’, ‘abcd’)

Ahora veamos el código de las páginas
que forman parte del proceso de login.

index.htm<form action="login.asp" method="post">Nombre: <input type="text" name="txtUsuario"><br>Password: <input type="password" name="txtPassword"><br><input type="submit"></form>

Esta primera página es sencilla. Simplemente
los dos cuadros de texto mencionados que enviarán los datos a la página de login.

Login.asp<%Dim Usuario, Password, RS, SSQLUsuario = Request.Form("txtUsuario")Password = Request.Form("txtPassword")SSQL = "SELECT count(*) FROM Usuarios WHERE Usuario = ‘" &
Usuario &"’ AND password=’" & Password & "’"Set RS = Server.CreateObject("ADODB.Recordset")RS.Open SSQL, "Cadena de conexion"If (RS.EOF) ThenResponse.Write "Acceso denegado."ElseResponse.Write "Te has identificado como " & RS("Usuario")End IfSet RS = Nothing%>

Y en esta segunda página creamos dinámicamente
una sentencia SQL que enviamos a la base de datos para la validación.

Si el usuario escribe Admin y 1234 la sentencia creada será:

“SELECT Count(*) FROM Usuarios WHERE Usuario=’Admin’ AND
Password=’1234’”

Y como esta sentencia nos devuelve un registro,
dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo
‘Admin’ y de contraseña cualquier otra cosa, la sentencia no nos devolverá registros
y no permitiremos entrar a esa persona.

Pero ¿qué ocurre si el usuario
escribe ‘ or ‘1′=’1 como usuario y lo mismo de contraseña?

En este caso la variable Consulta contendrá
la cadena:

"SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' AND
password = '' or '1'='1'"

Y obviamente esta sentencia nos devuelve registros
con lo que el usuario entrará en nuestra Web sin tener permiso.

Pero esto no es lo peor. Lo peor será
que el usuario utilice estos trucos de inyección de SQL para ejecutar
código arbitrario en nuestro servidor. Sentencias DDL, cambiar permisos,
utilizar procedimientos almacenados y un largo etcétera. Qué ocurriría
si alguien escribiese de contraseña cosas como:

' exec master..xp_cmdshell 'net user test /ADD' –

Como evitarlo:

Y ahora lo más importante, ¿qué
podemos hacer para evitar estos errores?
Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas
de los usuarios reemplazando la aparición de ‘ por ‘’
(dos comillas simples) e incluso evitando que los usuarios puedan pasar caracteres
como \ / “ ‘ o cualquier otro que se nos ocurra que puede causar
problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia
replace de Visual Basic:

SSQL= "SELECT count(*) FROM Usuarios WHERE Usuario = '" & ReplacetxtUsuario.Text, "’", "”") & "’ AND password=’" & Replace(txtPassword.Text, "’", "”") & "’"

Otro factor importante en cuanto a la seguridad
es limitar al máximo los permisos del usuario que ejecuta estas sentencias
para evitar posibles problemas. Por ejemplo utilizando un usuario distinto para
las sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecución
de una sentencia ejecute una sentencia del tipo permitido.

Por supuesto utilizar el usuario ‘sa’
o uno que pertenezca al rol ‘db_owner’ para ejecutar las sentencias
de uso habitual de la base de datos debería quedar descartado.

Una solución definitiva sería trabajar con procedimientos almacenados.
El modo en el que se pasan los parámetros a los procedimientos almacenados
evita que la inyección SQL pueda ser usada. Por ejemplo utilizando el
siguiente procedimiento almacenado:

CREATE Procedure Validar @usuario varchar(50), @password varchar(50)
ASIf (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario and Password=@password)>0Return 1Return 0

También deberíamos validar los
datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de
los campos y el tipo de datos aceptados. Esto lo podemos hacer en el cliente
con los RegularExpressionValidator o con los CustomValidators del VB.NET. De
todos modos si la seguridad es importante todas estas validaciones hay que repetirlas
en el servidor.

Por ultimo, y ya que estamos pensando en entornos
Web, podemos programar en ASP.NET y utilizar siempre que sea posible las clases
System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras
aplicaciones Web.

Califica esta nota:

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (8 votos, promedio: 3.88 de 5)
Loading ... Loading ...

Sobre el autor

Cesar Manivesa
Creador de http://sql.manivesa.com también ha trabajado desarrollando proyectos relacionados con Bases de Datos, creación de Intranets y desarrollo de Aplicaciones para Windows.

Si eres nuevo en Maestros del Web y te agradan nuestras publicaciones, te invitamos a suscribirte a nuestro Feed.

Sindícanos en: Google Reader, Bloglines, My Yahoo o My MSN | ¿Qué es el Feed?

Comentarios

41 comentarios en total.

  1. Ruchu 28.03.2004 - 16:29 - #

    Esto es bien cierto. De hecho yo mismo he podido acceder a algún sitio que otro de esta forma. Así que amigos, tomar buena nota de esto.

  2. Rann 30.03.2004 - 13:18 - #

    Muy bueno pero podrian, colocar en caso de utilizar php en vez de asp.
    gracias…

  3. Unregistered 22.04.2004 - 11:03 - #

    hola soy edwin necesiot saber como inexar tablas en phpmyadmin bueno si pudieras ayudarme … gracias mi e_mail rockkeros@yahoo.es

  4. basi 10.05.2004 - 09:32 - #

    muy bueno

  5. xcorpion 15.05.2004 - 22:58 - #

    lo mismo con PHP, tomen sus precauciones

  6. nahum 04.08.2004 - 06:30 - #

    disculpen pero que nada mas es eso saben hay demasiadas cosas que les hace falta mejor ponganse a estudiar si neta no nada mas escriban a lo pendejo si sale gracias

  7. mesiasdiabolico 17.08.2004 - 14:25 - #

    si, es muy interesante

  8. Mickel 15.03.2005 - 19:58 - #

    a señalar nada mas que alla en el 2002 Foros del Web sufrio un ataque por SQL Injection…

  9. Maggy 14.07.2005 - 17:43 - #

    Mickel, a señalar nada mas que alla en el 2002 Foros del Web sufrio un ataque por SQL Injection…

    eso de la OInyección SQL es muy riesgoso, ya que quien hace la aplicación hasta podría ir a la carcel si ha y errores de este tipo

  10. roodkit 19.08.2005 - 23:37 - #

    Jovenes es cierto que es muy peligroso armas como el SQL Injection, pero por otro lado sean consientes que los primeros en saber de este tipo de vulnerabilidades son los administradores de sistemas, hay herramientas como el DoS, SQL Injection, métodos de ICMP, TCP/IP, y no olvidar los CGI y demás que poco a poco quedan en el olvido, si bien hay muchos sistemas parchados, hay muchos que aun son vulnerables, a mi parecer es mejor tratar de utilizar como ultimo recurso las vulnerabilidades del software, quizá algunos no lo sepan pero esto puede desestabilizar incluso a la red o sitio atacado, (claro muchos disfrutan de esto) pero ellos son unos tontos que no saben realmente del arte del hack, los buenos hackers son los que nadie sabe de ellos, los que entran y salen de los sistemas sin ser descubiertos, no los que hacen maldades en la red, creen que lo saben todo por un simple SQL Injection, quizá cuando les preguntan que es Frame Relay ni siquiera saben lo que es, y obviamente ni siquiera saben como hackear esto. Aprendan a hacerlo pero sobre todo aprendar a analizar los métodos, eso los llevara por buen camino y no solo como Hackers sino como buenos Administradores de Seguridad (piensen como hackers, pero actuen como admin de seguridad), quiza algún dñia hasta algún premio les den (en lugar de estar en la carcel).

  11. No Registrado 01.09.2005 - 05:01 - #

    “quizá cuando les preguntan que es Frame Relay ni siquiera saben lo que es,”

    roodkit: creo que los buenos hackers son los que, además de conocer los sistemas, pero no usar sus conocimientos para dañar, comparten lo que saben con los demás (el codigo abierto es la mejor prueba).

    Se estaba respondiendo a un articulo de SQL injection. Pues bien, hay gente a la que le ha interesado, y asi lo mostraba. Esta gente es posible que se interese por otros tipos de vulnerabilidades, y asi aprendan poco a poco.

    No hay que criticar a otros por saber menos, mas aun cuando mostraban su interes por saber.

    solo es una reflexion,

    Saludos.

  12. diegors 26.12.2005 - 13:00 - #

    http://www.hernanracciatti.com.ar/papers_and_download.html “Técnicas de SQL Injection - Un repaso.pdf”

  13. cubana 01.07.2006 - 21:43 - #

    yo pienso que en vez de hablar tantas boberias deberian poner ahi ejemplos que resuelvan estos problemas porque ademas de ayudar asi a los demas, no tiene sentido criticar a los demas cuando tienes la paja en tu ojo, es solo un comentario.

  14. Pako Programs 14.07.2006 - 16:01 - #

    es una pendejada, nadie cae en esas estupideses, solo los novatos…

  15. "select * from sysdate" 03.08.2006 - 14:00 - #

    a

  16. XP 25.08.2006 - 18:16 - #

    Dejen de comentar y criticar y ayuden un poco en poner ejemplos

  17. Macros_bk hacker 07.09.2006 - 15:04 - #

    yo soy hacker desgraciadamente he hecho mucho daño y por eso no comparto mis conociminetos por que ya estoy cansado de hacer tanto mal por eso me retiro del negocio att: Macros_bk

  18. Macros_bk 07.09.2006 - 15:16 - #

    Macros_bk hacker;1690390, yo soy hacker desgraciadamente he hecho mucho daño y por eso no comparto mis conociminetos por que ya estoy cansado de hacer tanto mal por eso me retiro del negocio att: Macros_bk

    este es un consejo de un hacker para todos aqui en esta web solo hagan el bien no el mal esto de dañar sistemas de informacion o redes a las cuales bloqueaba o hacia travesuras con ellas o no se tantas cosas que fueron que ya no me acuerdo total traten de no hacer mas daño ayuden a los demas y apoyensen entre ustedes mismos para asi poder aprender algo bueno

  19. Mickel 08.09.2006 - 16:57 - #

    Mi pequeño aporte:
    http://www.mickel.biz/comments.php?id=73_0_1_0_C

  20. PEPE 29.10.2006 - 16:06 - #

    EN DONDE ES Q ESCRIBO LAS TABLAS SQL ? EN UN PROGRAMA , EN LA WEB DONDE?

  21. PEPE 29.10.2006 - 16:12 - #

    EN DONDE ES Q ESCRIBO LAS TABLAS SQL ? EN UN PROGRAMA , EN LA WEB DONDE?

  22. DarkDruiD 07.11.2006 - 13:20 - #

    para que besas que hay muchos novatos XD jajaja

  23. DarkDruiD 07.11.2006 - 13:26 - #

    un ejemplo de un code de ina inyeccion sql es por ejemplo este s%’) UNION SELECT 0,user_id,username,user_password,0,0,0,0,0,0 FROM nuke_users/*

  24. lola 09.11.2006 - 08:03 - #

    sean mas educados al publiar los comentarios

  25. LayCan 09.11.2006 - 08:53 - #

    wow…que mal la actitud de algunos, es verdad lo que dicen mucho, “La Informacion debe ser libre” y si algunos no respetan ese minimo Orden , que mal….todos alguna vez fuimos Newbies no? si nacieron Sabiendo Sql, Php, Java wow!! diganme para prenderles vela, hay que ayudar a entender al que no sabe… y bueno me gusto el comentario de “Roodkid” super acertivo…tb muy buena la iformacion sobre Inyeccion Sql (maldito Bug jaja)

  26. MaroC-Cola 21.11.2006 - 07:56 - #

    Bueno… nose si lo saben pero todas las web de inyeccion_sql ya esta hackeadas no hay muchas web de esa. lo que uno kiere hackear de verdad son las web comoo el terra , putalocura etc..

  27. Luis 04.01.2007 - 15:03 - #

    Muy bueno

  28. l1f7s0s9 19.01.2007 - 22:47 - #

    ia callense….xD

    un buen hacker….aprende cosas nuevas y enseña los demas las tecnicas aprendidas y no anda hackeando webs o defaceando..sino se contacta con el administrador y reporta el bug o fallo en la web…..;)

    salu2!!

  29. alto n00b 08.02.2007 - 06:29 - #

    alguien me cuenta alguna forma de hackear un foro :S…

  30. stevens 16.02.2007 - 20:27 - #

    esta super ; pero podrian poner mejores funciones mas complicadas …grasias

  31. osciel 19.02.2007 - 07:15 - #

    buenas:

    como puedo encontrar mas informacion con respecto al tema, ya que esta bastante interesante.

    Probe el ejemplo anterior en un sistema con asp y funciona, pero en php no ¿por que?.

    como se puede evitar?
    lo que hice en el sistema fue validar el text box con expresiones regulares en js. ese es un metodo?

    si pueden guiarme le agradeceria

  32. sindy 23.02.2007 - 11:15 - #

    como hago para hacer una pagina principal que tenga un usuario y una clave???

  33. HACKARG 08.03.2007 - 19:30 - #

    HABeses pienSO QUE SON PELOTUDOS.
    mANGA DE idiotas

  34. Javier 01.10.2007 - 20:40 - #

    HOLA

  35. Javier 01.10.2007 - 20:41 - #

  36. Javier 01.10.2007 - 20:44 - #

    var1 = 1;
    while( var1

  37. yimy 26.12.2007 - 09:41 - #

    Muy buena la explicación

  38. Dario 19.04.2008 - 11:39 - #

    Valen verga todos…. ser hacker es lo mejor…. yo gano dinero por eso…

  39. wilmer 15.05.2008 - 19:05 - #

    nos sirve mayormente para jalar contraseñas de los msn bueno en ese lo utilizo.. suerte intentento bagos d emierda!!!!!

  40. NAPSTER / KAOZ 19.05.2008 - 18:40 - #

    HEY WEYES NO ES Q SEA MAMON PERO PONGANCE AH ESTUDIAR ESTO OK? LAS PERSONAS QTIENEN ARES Y Q SON HACKERS PORFAVOR AGREGENME PARA Q SE UNAN A UN TEAM ;-) MI CORREO ES rockero_skater@hotmail.com SOLO HACKERS Y Q TIENEN ARES

  41. hector 18.06.2008 - 00:46 - #

    oigan porfavor ayudenme a hackear un foro. agregueneme mi msn es estoychisquiado@hotmail.com

Deja tu Comentario


Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.


Boletín

Agrega nuestro feed a  Netvibes
wikio Add to Technorati Favorites

-


Maestros del Web es el punto de encuentro para los entusiastas de la red.

Creative Commons by-nc-sa 3.0 | Política de Privacidad | CMS: Wordpress