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.

¿Te gustó?

¡Sí, me gusta! Le ha gustado a 25 personas
Loading ... Loading ...

Cesar ManivesaCesar Manivesa para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo

Síguenos en: @maestros | Fan page

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.

    Responder
  2. Rann

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

    Responder
  3. Unregistered

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

    Responder
  4. basi

    muy bueno

    Responder
  5. xcorpion

    lo mismo con PHP, tomen sus precauciones

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

    Responder
  7. mesiasdiabolico

    si, es muy interesante

    Responder
  8. Mickel

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

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

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

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

    Responder
  12. diegors

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

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

    Responder
  14. Pako Programs

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

    Responder
  15. "select * from sysdate"

    a

    Responder
  16. XP

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

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

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

    Responder
  19. PEPE

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

    Responder
  20. PEPE

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

    Responder
  21. DarkDruiD

    para que besas que hay muchos novatos XD jajaja

    Responder
  22. 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/*

    Responder
  23. lola

    sean mas educados al publiar los comentarios

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

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

    Responder
  26. 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!!

    Responder
  27. alto n00b

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

    Responder
  28. stevens

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

    Responder
    1. cuando aprendas a escribir gracias.. te explico.

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

    Responder
  30. sindy

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

    Responder
  31. HACKARG

    HABeses pienSO QUE SON PELOTUDOS.
    mANGA DE idiotas

    Responder
  32. Javier

    var1 = 1;
    while( var1

    Responder
  33. yimy

    Muy buena la explicación

    Responder
  34. Dario

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

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

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

    Responder
  37. hector

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

    Responder
  38. Muchas gracias esto tambien sirven en Mysql :D

    Responder
  39. Dencell

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

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

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

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

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

    Responder
  44. 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!

    Responder
  45. 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!

    Responder
  46. FOSI

    PUS!! la verdad siento verguenza agena, lastima que la red tenga tantos lamers, por mi parte creo que son los mas peligrosos, por que se leen algun manualsillo pedorro y comienzan a seguirlo paso a paso (sin tener la menor idea de lo que estan haciendo) luego salen a decir que son HACKER!! guauuuuuuuuuu y siento verguenza agena, yo que me he graduado en ingeniero en sitemas, no me atrevo a decir que soy hacker y eso que tambien tengo tres titulos tercerarios, relacionados con el computo…

    / / | /
    ___ ___ ( ___ (___ ___| ___ ___ (
    | )|___)| | )| | )| )| )|___ |
    |__/ |__ | |__/ |__ |__/ |__/ |__/ __/ _
    |

    Responder
  47. ke pedo kn uds
    pnganse a trabajar

    Responder
  48. gaston

    hola a todos :
    espero mucho de ustedes
    asiqeu propongo que a los hacker por fabor publiquen algo que sea para aprender sobre esta inyerccion SQL.
    noce … que publiquen algun trabajo y /o articulo en algun foro o en algun servidos web como taringa , etc . para la personas que esten completamente interesadas en este tipo de cosas
    gracias

    Responder
  49. Mariana

    Hola!! Necesito que alguien me ayude en inyeccion de datos SQL… lo que sucede es que necesito modificar unos datos (numeros) en un sistema, pero no se como hacerlo bien, y no quiero meter la pata o cometer errores… si hay alguien que pueda ayudarme o prestarme sus servicios (pagaos) se los agradeceria muchisimo!!
    escribeme a

    cochinita89@hotmail.com

    Responder

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

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.

Últimos artículos:

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