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 web
go
-- Creamos una tabla para almacenar los pares usuario/contraseña
create table usuarios (Usuario varchar (50) not null primary key, Password varchar (50))
go
-- Introducimos un par de datos de prueba
insert 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, SSQL
Usuario = 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) Then
Response.Write "Acceso denegado."
Else
Response.Write "Te has identificado como " & RS("Usuario")
End If
Set 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 = '" & Replace
txtUsuario.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)
AS
If (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario and Password=@password)>0
Return 1
Return 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.

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.
Ruchu
28/03/2004

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.

Rann
30/03/2004

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

basi
10/05/2004

muy bueno

xcorpion
15/05/2004

lo mismo con PHP, tomen sus precauciones

nahum
4/08/2004

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

    Eric
    4/11/2010

    nahum : Por que no posteas tu cabron, ya que estas presumiendo pinche vato.

mesiasdiabolico
17/08/2004

si, es muy interesante

Mickel
15/03/2005

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

Maggy
14/07/2005

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

roodkit
19/08/2005

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

No Registrado
1/09/2005

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

diegors
26/12/2005

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

cubana
1/07/2006

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.

Pako Programs
14/07/2006

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

“select * from sysdate”
3/08/2006

a

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

Macros_bk hacker
7/09/2006

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
7/09/2006

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

PEPE
29/10/2006

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

PEPE
29/10/2006

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

DarkDruiD
7/11/2006

para que besas que hay muchos novatos XD jajaja

DarkDruiD
7/11/2006

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

lola
9/11/2006

sean mas educados al publiar los comentarios

LayCan
9/11/2006

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)

MaroC-Cola
21/11/2006

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

Luis
4/01/2007

Muy bueno

l1f7s0s9
19/01/2007

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

alto n00b
8/02/2007

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

stevens
16/02/2007

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

osciel
19/02/2007

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

sindy
23/02/2007

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

HACKARG
8/03/2007

HABeses pienSO QUE SON PELOTUDOS.
mANGA DE idiotas

[...] Más información acerca de magic quotes (comillas mágicas). Más información acerca de inyección SQL (en inglés) (español). [...]

[...] utilizar la función replace de Visual Basic para eliminar caracteres no deseados. Un ejemplo de Maestros del Web. TEXTO PLANO Visual [...]

Javier
1/10/2007

HOLA

Javier
1/10/2007

Javier
1/10/2007

var1 = 1;
while( var1

yimy
26/12/2007

Muy buena la explicación

[...] Destacando inyección SQL. [...]

Dario
19/04/2008

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

[...] La gran mayoría de páginas tiene un usuario que es admin, y si la página es sensible a las inyecciones SQL, sólo debe ingresar = `or´`=´ (o un similar), y el cracker logra obtener ingreso a la página [...]

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

Muchas gracias esto tambien sirven en Mysql :D

q te importa
30/09/2008

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

rodrigo
16/10/2008

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

    Eric
    4/11/2010

    y vos que serías ? por que en vez de escribir estupideces no creas un post, o compartir tus ” conocimientos ” si es que tenes algun conocimiento en informatica… mexicano tenías que ser..

RoyVM
25/10/2008

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

mile
21/04/2009

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

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!

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!

FOSI
17/10/2009

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…

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

    Eric
    4/11/2010

    Vos no sos ingeniero en nada, por empezar un ingeniero en sistema etc, no estaría respondiendo semejante estupidez, y ademas si fueses ing en sistemas, serias solo eso, nunca un hacker ;> ahora si deberias replantearte todo lo que escribiste, y darte verguenza de lo que escribiste.

    atte

    Leroy.

ke pedo kn uds
pnganse a trabajar

gaston
31/10/2009

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

Mariana
1/01/2010

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

[email protected]

muy buen articulo…. Mariana estudia Mysql

dimcraft
12/04/2010

mejor estudien.. programacion web y de escritorio, redes, puertos.. protocolos de trasferencia, asm, arquitectura de procesador… etc.. jeje, todo en conjunto te vuelve un hacker, x lo que nos falta mucho… pero suerte con inyeccion x sql… que creo q es una de las cosas mas faciles que hay..

Esta es la triste vida de Hackers y Lammers.

la verdad es lo mejor para entrar en algun sitio,para lo que rezien enpiesan les recomiendo que se aprendan si o si esto que es lo mejor para meterse en las web mas les dijo hasta la mismisima moncloa tienen estos errores a esta altura asi que ganas ganas pasiensia tranquilidad y aprendanlon de todos lados mien tuotriales de todo este caso videos de todooooooooo libros no sean bajos jej bueno un placer comentar eso si quieren agregenmen al msn gracias para que los allude con cualquier duda.

228