Estás en Inicio / Editorial / Bases de Datos
10.03.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.

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' –
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:
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?
41 comentarios en total.
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.
Muy bueno pero podrian, colocar en caso de utilizar php en vez de asp.
gracias…
hola soy edwin necesiot saber como inexar tablas en phpmyadmin bueno si pudieras ayudarme … gracias mi e_mail rockkeros@yahoo.es
muy bueno
lo mismo con PHP, tomen sus precauciones
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
si, es muy interesante
a señalar nada mas que alla en el 2002 Foros del Web sufrio un ataque por SQL Injection…
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
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).
“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.
http://www.hernanracciatti.com.ar/papers_and_download.html “Técnicas de SQL Injection - Un repaso.pdf”
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.
es una pendejada, nadie cae en esas estupideses, solo los novatos…
a
Dejen de comentar y criticar y ayuden un poco en poner ejemplos
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
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
Mi pequeño aporte:
http://www.mickel.biz/comments.php?id=73_0_1_0_C
EN DONDE ES Q ESCRIBO LAS TABLAS SQL ? EN UN PROGRAMA , EN LA WEB DONDE?
EN DONDE ES Q ESCRIBO LAS TABLAS SQL ? EN UN PROGRAMA , EN LA WEB DONDE?
para que besas que hay muchos novatos XD jajaja
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/*
sean mas educados al publiar los comentarios
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)
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..
Muy bueno
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!!
alguien me cuenta alguna forma de hackear un foro :S…
esta super ; pero podrian poner mejores funciones mas complicadas …grasias
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
como hago para hacer una pagina principal que tenga un usuario y una clave???
HABeses pienSO QUE SON PELOTUDOS.
mANGA DE idiotas
HOLA
var1 = 1;
while( var1
Muy buena la explicación
Valen verga todos…. ser hacker es lo mejor…. yo gano dinero por eso…
nos sirve mayormente para jalar contraseñas de los msn bueno en ese lo utilizo.. suerte intentento bagos d emierda!!!!!
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
oigan porfavor ayudenme a hackear un foro. agregueneme mi msn es estoychisquiado@hotmail.com
4 trackbacks en total.
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