Un espacio para los entusiastas del web

Inyección de código SQL

Publicado el 10 de Marzo, 2004

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.

Otros artículos relacionados

Califica esta nota:

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

Comentarios

  1. Ruchu

    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

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


  3. Unregistered

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



  4. xcorpion

    lo mismo con PHP, tomen sus precauciones


  5. nahum

    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


  6. mesiasdiabolico

    si, es muy interesante


  7. Mickel

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


  8. Maggy

    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


  9. roodkit

    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).


  10. No Registrado

    “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.


  11. diegors

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


  12. cubana

    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.


  13. Pako Programs

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


  14. "select * from sysdate"

    a


  15. XP

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


  16. Macros_bk hacker

    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


  17. Macros_bk

    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



  18. PEPE

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


  19. PEPE

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


  20. DarkDruiD

    para que besas que hay muchos novatos XD jajaja


  21. DarkDruiD

    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/*


  22. lola

    sean mas educados al publiar los comentarios


  23. LayCan

    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)


  24. MaroC-Cola

    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..



  25. l1f7s0s9

    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!!


  26. alto n00b

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


  27. stevens

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


  28. osciel

    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


  29. sindy

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


  30. HACKARG

    HABeses pienSO QUE SON PELOTUDOS.
    mANGA DE idiotas




  31. Javier

    var1 = 1;
    while( var1


  32. yimy

    Muy buena la explicación


  33. Dario

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


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


  35. NAPSTER / KAOZ

    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


  36. hector

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


  37. Muchas gracias esto tambien sirven en Mysql :D


  38. Dencell

    me parse muy interesante … kisiera prender mas sobre la materia dark_dream002@hotmail.com =)


  39. q te importa

    buuuuuuuuuuuu dejen de pelear
    son una amnga de inadaptados
    no bn que estan exponiendo un tema y lo unico que hacen es escibir lo mismo que se lee en todos lados m……..

    un hacker no se llama asi mismo hacker
    no sean tontos

    ademas esto se presta para gente que pide alluda para hackear.
    no me agan reir si quieren aprender aganlo ustedes mismos
    en bs de preguntar esa clac de cosas aporten con el tema


  40. rodrigo

    Todos son una mierda se creen hackers pues que putada son solo unos viles y bulgares lamers (en español perdedores engreidos) de hacking no saben nada y si alguien presume de ser hackers es todo menos eso, jajajajajaja


  41. RoyVM

    me parecio shebre a .. sabia que hera sql inyection y gracias a la manera de como evitarlo me facilito en muchas cosas… funciona en .net


  42. mile

    por favor necesito que me ayude pues tengo un problema al mandar un numero grande en la base de dato mysql y al cargarla en el combo de la pagina que estoy trabajando en php me devuelve el valor de tipo float asi:5e+007 y no lo necesito asi sino en numero reales decir que sea asi:50.000.000


  43. Creo que hay una gran confusión aqui. Los Hackers no somos necesariamente expertos en seguridad! A mi me gusta hacer hackes en C (Muy buen lenguaje para optimizar de fomra elegante), y no soy un experto en seguridad PORQUE HACKER ES UN PROGRAMADOR EXPERTO(jeje creo que no entro en ese último requisito :p) Les recomiendo que se informes un poco más al respecto, mínimo echenle un ojo a wikipedia.

    Saludos y feliz hacking!


  44. Ay ay y… dá lástima leer muchos comentarios de n00bs y lamers diciendo “soy hacker soy hacker”… lamentable…
    lo único que ahcen es llenar los post de basura y no dar paso a opiniones que puedan valer la pena…

    Por mi parte me inicie en programación hace un tiempo y por ahora me intereso en SQL y php, por lo que esta info me dice algunas cosas… (obviamente quiero saber más).

    Más nada que decir…
    salu2!


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.


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.

Más artículos de Cesar Manivesa

Las Notas en tu correo


Acerca de

Maestros del Web nace cuando intentamos traducir Webmaster al Español. Nacimos orientados al diseño y desarrollo web. Hoy somos un espacio de apoyo para los entusiastas que participan en proyectos en la red.
Leer más de Maestros del Web