Injeccion SQL?

23/08/2007 - 18:38 por Antonio Ortiz | Informe spam
Que me han hackeado un sitio, y no se exactamente como, les cuento un poco

Tengo un portal para empresas, donde se registran y colocan sus datos que se
muestran en un directorio, el unico lugar donde meten datos es al iniciar
sesion con su nombre de usuario y contraseña y donde capturan sus datos.

Un dia cualquiera los datos de una empresa estan cambiados con un mensaje de
un sitio hacker, los datos de esa empresa son precisamente los mios,
capturados como ejemplo.

Me podrian decir como evitar esto?, que medidas puedo tomar?,

pueden injectar codigo sql por el nombre del usuario (o password) para ? ,
el codigo que valida esto es un simple 'select usuario, pass from usuarios
where nombre=varnombre and pass=varpass' (similar)


gracias


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com

Preguntas similare

Leer las respuestas

#11 Alejandro Mesa
23/08/2007 - 20:14 | Informe spam
Antonio Ortiz,

Como comentaron Isaias y Salvador, puedes evitar esto si usas procedimientos
almacenados que hagan uso de parametros. Si usas sps pero vuelves a hacer la
concatenacion, entonces te expones al mismo problema, lo que esta vez en la
parte del servidor.

1 - Usar procedimientos almacenados con parametros que se usen directamente
en la sentencia.

create procedure dbo.chequear_usuario (
@nombre varchar(25),
@pass varchar(25),
@validado int output
)
as
set nocount on

if exists (select * from dbo.usuarios where nombre = @nombre and pass = @pass)
set @validado = 1
else
set validado = 0
go

2 - Si insistes en armar la sentencia en el lado de la aplicacion cliente,
debes parametrizarla y usar el objeto SQLCommand y llenar la coleccion de
parametros. Puedes parametrizar la sentencia o usar sp_executesql
directamente en tu codigo.

Te paso un link donde se toca todo este tema al detalle.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html

SqlCommand.Parameters Propert
http://msdn2.microsoft.com/en-us/li...parameters(VS.71).aspx

Using Stored Procedures with a Command
http://msdn2.microsoft.com/en-us/library/yy6y35y8(VS.71).aspx

Tomen esto como algo serio y que le puede pasar a cualquiera. Hace uno o dos
meses, la sucursal de Microsoft en UK fue atacada usando este metodo. Aqui
les paso la noticia.

http://www.pcworld.com/article/id,1...ticle.html


AMB

"Antonio Ortiz" wrote:


ya veo porque mi colaborador, inmediatamente sugirio validar:

Rs.Open "select usuario, pass from usuarios where (nombre = ' " & varnombre
& " ') And (pass = ' " & varpass " ') ", Conexion
'La separacion de los apostrofes y las comillas es por legibilidad
If ( Not Recorset.EOF ) Then
If( (Recordset!CampoNombre=VarNombre) and
(Recordset!CampoNombre=VarPass) ) Then '*** nueva validacion***
'Usuario valido
Else
'Usuario invalido
End If
End If

que opinas?

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com




"Victor Koch" <v i c t o r (arroba)correo(punto)waldbott(punto)com(punto)ar>
escribió en el mensaje news:%
> Suponete que el operador te ingresa en la password esto
>
> 1 OR 1=1
>
> ¿ Como quedaria armada tu SQL ?
>
> 'select usuario, pass from usuarios where nombre=varnombre and pass=1 OR
> 1=1'
>
>
> Un saludo, Víctor Koch.
>
>
> "Antonio Ortiz" escribió en el mensaje
> news:
>>
>> Que me han hackeado un sitio, y no se exactamente como, les cuento un
>> poco
>>
>> Tengo un portal para empresas, donde se registran y colocan sus datos que
> se
>> muestran en un directorio, el unico lugar donde meten datos es al iniciar
>> sesion con su nombre de usuario y contraseña y donde capturan sus datos.
>>
>> Un dia cualquiera los datos de una empresa estan cambiados con un mensaje
> de
>> un sitio hacker, los datos de esa empresa son precisamente los mios,
>> capturados como ejemplo.
>>
>> Me podrian decir como evitar esto?, que medidas puedo tomar?,
>>
>> pueden injectar codigo sql por el nombre del usuario (o password) para ?
>> ,
>> el codigo que valida esto es un simple 'select usuario, pass from
>> usuarios
>> where nombre=varnombre and pass=varpass' (similar)
>>
>>
>> gracias
>>
>>
>> Antonio Ortiz
>> asesor en sistemas
>> ant(a)aortiz.net
>> www.aortiz.net
>> www.progvisual.com
>>
>>
>
>



Respuesta Responder a este mensaje
#12 Antonio Ortiz
23/08/2007 - 20:34 | Informe spam
Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion del
tipo And '1 and 1' no funciona igual a concatenar?

saludos,


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Alejandro Mesa" escribió en el
mensaje news:
Antonio Ortiz,

Como comentaron Isaias y Salvador, puedes evitar esto si usas
procedimientos
almacenados que hagan uso de parametros. Si usas sps pero vuelves a hacer
la
concatenacion, entonces te expones al mismo problema, lo que esta vez en
la
parte del servidor.

1 - Usar procedimientos almacenados con parametros que se usen
directamente
en la sentencia.

create procedure dbo.chequear_usuario (
@nombre varchar(25),
@pass varchar(25),
@validado int output
)
as
set nocount on

if exists (select * from dbo.usuarios where nombre = @nombre and pass =
@pass)
set @validado = 1
else
set validado = 0
go

2 - Si insistes en armar la sentencia en el lado de la aplicacion cliente,
debes parametrizarla y usar el objeto SQLCommand y llenar la coleccion de
parametros. Puedes parametrizar la sentencia o usar sp_executesql
directamente en tu codigo.

Te paso un link donde se toca todo este tema al detalle.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html

SqlCommand.Parameters Property
http://msdn2.microsoft.com/en-us/li...parameters(VS.71).aspx

Using Stored Procedures with a Command
http://msdn2.microsoft.com/en-us/library/yy6y35y8(VS.71).aspx

Tomen esto como algo serio y que le puede pasar a cualquiera. Hace uno o
dos
meses, la sucursal de Microsoft en UK fue atacada usando este metodo. Aqui
les paso la noticia.

http://www.pcworld.com/article/id,1...ticle.html


AMB

"Antonio Ortiz" wrote:


ya veo porque mi colaborador, inmediatamente sugirio validar:

Rs.Open "select usuario, pass from usuarios where (nombre = ' " &
varnombre
& " ') And (pass = ' " & varpass " ') ", Conexion
'La separacion de los apostrofes y las comillas es por legibilidad
If ( Not Recorset.EOF ) Then
If( (Recordset!CampoNombre=VarNombre) and
(Recordset!CampoNombre=VarPass) ) Then '*** nueva validacion***
'Usuario valido
Else
'Usuario invalido
End If
End If

que opinas?

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com




"Victor Koch" <v i c t o r
(arroba)correo(punto)waldbott(punto)com(punto)ar>
escribió en el mensaje news:%
> Suponete que el operador te ingresa en la password esto
>
> 1 OR 1=1
>
> ¿ Como quedaria armada tu SQL ?
>
> 'select usuario, pass from usuarios where nombre=varnombre and pass=1
> OR
> 1=1'
>
>
> Un saludo, Víctor Koch.
>
>
> "Antonio Ortiz" escribió en el mensaje
> news:
>>
>> Que me han hackeado un sitio, y no se exactamente como, les cuento un
>> poco
>>
>> Tengo un portal para empresas, donde se registran y colocan sus datos
>> que
> se
>> muestran en un directorio, el unico lugar donde meten datos es al
>> iniciar
>> sesion con su nombre de usuario y contraseña y donde capturan sus
>> datos.
>>
>> Un dia cualquiera los datos de una empresa estan cambiados con un
>> mensaje
> de
>> un sitio hacker, los datos de esa empresa son precisamente los mios,
>> capturados como ejemplo.
>>
>> Me podrian decir como evitar esto?, que medidas puedo tomar?,
>>
>> pueden injectar codigo sql por el nombre del usuario (o password) para
>> ?
>> ,
>> el codigo que valida esto es un simple 'select usuario, pass from
>> usuarios
>> where nombre=varnombre and pass=varpass' (similar)
>>
>>
>> gracias
>>
>>
>> Antonio Ortiz
>> asesor en sistemas
>> ant(a)aortiz.net
>> www.aortiz.net
>> www.progvisual.com
>>
>>
>
>



Respuesta Responder a este mensaje
#13 Antonio Ortiz
23/08/2007 - 20:38 | Informe spam
quise poner ' And 1=1


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Antonio Ortiz" escribió en el mensaje
news:

Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion
del tipo And '1 and 1' no funciona igual a concatenar?

saludos,


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Alejandro Mesa" escribió en el
mensaje news:
Antonio Ortiz,

Como comentaron Isaias y Salvador, puedes evitar esto si usas
procedimientos
almacenados que hagan uso de parametros. Si usas sps pero vuelves a hacer
la
concatenacion, entonces te expones al mismo problema, lo que esta vez en
la
parte del servidor.

1 - Usar procedimientos almacenados con parametros que se usen
directamente
en la sentencia.

create procedure dbo.chequear_usuario (
@nombre varchar(25),
@pass varchar(25),
@validado int output
)
as
set nocount on

if exists (select * from dbo.usuarios where nombre = @nombre and pass =
@pass)
set @validado = 1
else
set validado = 0
go

2 - Si insistes en armar la sentencia en el lado de la aplicacion
cliente,
debes parametrizarla y usar el objeto SQLCommand y llenar la coleccion de
parametros. Puedes parametrizar la sentencia o usar sp_executesql
directamente en tu codigo.

Te paso un link donde se toca todo este tema al detalle.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html

SqlCommand.Parameters Property
http://msdn2.microsoft.com/en-us/li...parameters(VS.71).aspx

Using Stored Procedures with a Command
http://msdn2.microsoft.com/en-us/library/yy6y35y8(VS.71).aspx

Tomen esto como algo serio y que le puede pasar a cualquiera. Hace uno o
dos
meses, la sucursal de Microsoft en UK fue atacada usando este metodo.
Aqui
les paso la noticia.

http://www.pcworld.com/article/id,1...ticle.html


AMB

"Antonio Ortiz" wrote:


ya veo porque mi colaborador, inmediatamente sugirio validar:

Rs.Open "select usuario, pass from usuarios where (nombre = ' " &
varnombre
& " ') And (pass = ' " & varpass " ') ", Conexion
'La separacion de los apostrofes y las comillas es por legibilidad
If ( Not Recorset.EOF ) Then
If( (Recordset!CampoNombre=VarNombre) and
(Recordset!CampoNombre=VarPass) ) Then '*** nueva validacion***
'Usuario valido
Else
'Usuario invalido
End If
End If

que opinas?

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com




"Victor Koch" <v i c t o r
(arroba)correo(punto)waldbott(punto)com(punto)ar>
escribió en el mensaje news:%
> Suponete que el operador te ingresa en la password esto
>
> 1 OR 1=1
>
> ¿ Como quedaria armada tu SQL ?
>
> 'select usuario, pass from usuarios where nombre=varnombre and pass=1
> OR
> 1=1'
>
>
> Un saludo, Víctor Koch.
>
>
> "Antonio Ortiz" escribió en el mensaje
> news:
>>
>> Que me han hackeado un sitio, y no se exactamente como, les cuento un
>> poco
>>
>> Tengo un portal para empresas, donde se registran y colocan sus datos
>> que
> se
>> muestran en un directorio, el unico lugar donde meten datos es al
>> iniciar
>> sesion con su nombre de usuario y contraseña y donde capturan sus
>> datos.
>>
>> Un dia cualquiera los datos de una empresa estan cambiados con un
>> mensaje
> de
>> un sitio hacker, los datos de esa empresa son precisamente los mios,
>> capturados como ejemplo.
>>
>> Me podrian decir como evitar esto?, que medidas puedo tomar?,
>>
>> pueden injectar codigo sql por el nombre del usuario (o password)
>> para ?
>> ,
>> el codigo que valida esto es un simple 'select usuario, pass from
>> usuarios
>> where nombre=varnombre and pass=varpass' (similar)
>>
>>
>> gracias
>>
>>
>> Antonio Ortiz
>> asesor en sistemas
>> ant(a)aortiz.net
>> www.aortiz.net
>> www.progvisual.com
>>
>>
>
>









Respuesta Responder a este mensaje
#14 Alejandro Mesa
23/08/2007 - 20:44 | Informe spam
Hola Antonio,

Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion del
tipo And '1 and 1' no funciona igual a concatenar?



Claro que no. SS buscara en la columna [pass] una fila que cumpla que el
valor de esta columna sea igual a '1 or 1=1' y que ademas el valor de nombre
sea el que se paso como parametro. SS no hace macrosustitucion.


AMB


"Antonio Ortiz" wrote:


Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion del
tipo And '1 and 1' no funciona igual a concatenar?

saludos,


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Alejandro Mesa" escribió en el
mensaje news:
> Antonio Ortiz,
>
> Como comentaron Isaias y Salvador, puedes evitar esto si usas
> procedimientos
> almacenados que hagan uso de parametros. Si usas sps pero vuelves a hacer
> la
> concatenacion, entonces te expones al mismo problema, lo que esta vez en
> la
> parte del servidor.
>
> 1 - Usar procedimientos almacenados con parametros que se usen
> directamente
> en la sentencia.
>
> create procedure dbo.chequear_usuario (
> @nombre varchar(25),
> @pass varchar(25),
> @validado int output
> )
> as
> set nocount on
>
> if exists (select * from dbo.usuarios where nombre = @nombre and pass =
> @pass)
> set @validado = 1
> else
> set validado = 0
> go
>
> 2 - Si insistes en armar la sentencia en el lado de la aplicacion cliente,
> debes parametrizarla y usar el objeto SQLCommand y llenar la coleccion de
> parametros. Puedes parametrizar la sentencia o usar sp_executesql
> directamente en tu codigo.
>
> Te paso un link donde se toca todo este tema al detalle.
>
> Las virtudes y maldades del SQL dinámico
> http://www.hayes.ch/sql/sql_dinamico.html
>
> SqlCommand.Parameters Property
> http://msdn2.microsoft.com/en-us/li...parameters(VS.71).aspx
>
> Using Stored Procedures with a Command
> http://msdn2.microsoft.com/en-us/library/yy6y35y8(VS.71).aspx
>
> Tomen esto como algo serio y que le puede pasar a cualquiera. Hace uno o
> dos
> meses, la sucursal de Microsoft en UK fue atacada usando este metodo. Aqui
> les paso la noticia.
>
> http://www.pcworld.com/article/id,1...ticle.html
>
>
> AMB
>
> "Antonio Ortiz" wrote:
>
>>
>> ya veo porque mi colaborador, inmediatamente sugirio validar:
>>
>> Rs.Open "select usuario, pass from usuarios where (nombre = ' " &
>> varnombre
>> & " ') And (pass = ' " & varpass " ') ", Conexion
>> 'La separacion de los apostrofes y las comillas es por legibilidad
>> If ( Not Recorset.EOF ) Then
>> If( (Recordset!CampoNombre=VarNombre) and
>> (Recordset!CampoNombre=VarPass) ) Then '*** nueva validacion***
>> 'Usuario valido
>> Else
>> 'Usuario invalido
>> End If
>> End If
>>
>> que opinas?
>>
>> Antonio Ortiz
>> asesor en sistemas
>> ant(a)aortiz.net
>> www.aortiz.net
>> www.progvisual.com
>>
>>
>>
>>
>> "Victor Koch" <v i c t o r
>> (arroba)correo(punto)waldbott(punto)com(punto)ar>
>> escribió en el mensaje news:%
>> > Suponete que el operador te ingresa en la password esto
>> >
>> > 1 OR 1=1
>> >
>> > ¿ Como quedaria armada tu SQL ?
>> >
>> > 'select usuario, pass from usuarios where nombre=varnombre and pass=1
>> > OR
>> > 1=1'
>> >
>> >
>> > Un saludo, Víctor Koch.
>> >
>> >
>> > "Antonio Ortiz" escribió en el mensaje
>> > news:
>> >>
>> >> Que me han hackeado un sitio, y no se exactamente como, les cuento un
>> >> poco
>> >>
>> >> Tengo un portal para empresas, donde se registran y colocan sus datos
>> >> que
>> > se
>> >> muestran en un directorio, el unico lugar donde meten datos es al
>> >> iniciar
>> >> sesion con su nombre de usuario y contraseña y donde capturan sus
>> >> datos.
>> >>
>> >> Un dia cualquiera los datos de una empresa estan cambiados con un
>> >> mensaje
>> > de
>> >> un sitio hacker, los datos de esa empresa son precisamente los mios,
>> >> capturados como ejemplo.
>> >>
>> >> Me podrian decir como evitar esto?, que medidas puedo tomar?,
>> >>
>> >> pueden injectar codigo sql por el nombre del usuario (o password) para
>> >> ?
>> >> ,
>> >> el codigo que valida esto es un simple 'select usuario, pass from
>> >> usuarios
>> >> where nombre=varnombre and pass=varpass' (similar)
>> >>
>> >>
>> >> gracias
>> >>
>> >>
>> >> Antonio Ortiz
>> >> asesor en sistemas
>> >> ant(a)aortiz.net
>> >> www.aortiz.net
>> >> www.progvisual.com
>> >>
>> >>
>> >
>> >
>>
>>
>>



Respuesta Responder a este mensaje
#15 Antonio Ortiz
24/08/2007 - 06:57 | Informe spam
Aaah gracias, esa es la palabra que buscaba, la guardare entre las cosas
importantes
No 'macrosustitucion'

Gracias nuevamente,

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com


"Alejandro Mesa" escribió en el
mensaje news:
Hola Antonio,

Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion
del
tipo And '1 and 1' no funciona igual a concatenar?



Claro que no. SS buscara en la columna [pass] una fila que cumpla que el
valor de esta columna sea igual a '1 or 1=1' y que ademas el valor de
nombre
sea el que se paso como parametro. SS no hace macrosustitucion.


AMB


"Antonio Ortiz" wrote:


Gracias por el ejemplo tan claro, pero si en @pass incluyo una condicion
del
tipo And '1 and 1' no funciona igual a concatenar?

saludos,


Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Alejandro Mesa" escribió en el
mensaje news:
> Antonio Ortiz,
>
> Como comentaron Isaias y Salvador, puedes evitar esto si usas
> procedimientos
> almacenados que hagan uso de parametros. Si usas sps pero vuelves a
> hacer
> la
> concatenacion, entonces te expones al mismo problema, lo que esta vez
> en
> la
> parte del servidor.
>
> 1 - Usar procedimientos almacenados con parametros que se usen
> directamente
> en la sentencia.
>
> create procedure dbo.chequear_usuario (
> @nombre varchar(25),
> @pass varchar(25),
> @validado int output
> )
> as
> set nocount on
>
> if exists (select * from dbo.usuarios where nombre = @nombre and pass >> > @pass)
> set @validado = 1
> else
> set validado = 0
> go
>
> 2 - Si insistes en armar la sentencia en el lado de la aplicacion
> cliente,
> debes parametrizarla y usar el objeto SQLCommand y llenar la coleccion
> de
> parametros. Puedes parametrizar la sentencia o usar sp_executesql
> directamente en tu codigo.
>
> Te paso un link donde se toca todo este tema al detalle.
>
> Las virtudes y maldades del SQL dinámico
> http://www.hayes.ch/sql/sql_dinamico.html
>
> SqlCommand.Parameters Property
> http://msdn2.microsoft.com/en-us/li...parameters(VS.71).aspx
>
> Using Stored Procedures with a Command
> http://msdn2.microsoft.com/en-us/library/yy6y35y8(VS.71).aspx
>
> Tomen esto como algo serio y que le puede pasar a cualquiera. Hace uno
> o
> dos
> meses, la sucursal de Microsoft en UK fue atacada usando este metodo.
> Aqui
> les paso la noticia.
>
> http://www.pcworld.com/article/id,1...ticle.html
>
>
> AMB
>
> "Antonio Ortiz" wrote:
>
>>
>> ya veo porque mi colaborador, inmediatamente sugirio validar:
>>
>> Rs.Open "select usuario, pass from usuarios where (nombre = ' " &
>> varnombre
>> & " ') And (pass = ' " & varpass " ') ", Conexion
>> 'La separacion de los apostrofes y las comillas es por legibilidad
>> If ( Not Recorset.EOF ) Then
>> If( (Recordset!CampoNombre=VarNombre) and
>> (Recordset!CampoNombre=VarPass) ) Then '*** nueva validacion***
>> 'Usuario valido
>> Else
>> 'Usuario invalido
>> End If
>> End If
>>
>> que opinas?
>>
>> Antonio Ortiz
>> asesor en sistemas
>> ant(a)aortiz.net
>> www.aortiz.net
>> www.progvisual.com
>>
>>
>>
>>
>> "Victor Koch" <v i c t o r
>> (arroba)correo(punto)waldbott(punto)com(punto)ar>
>> escribió en el mensaje news:%
>> > Suponete que el operador te ingresa en la password esto
>> >
>> > 1 OR 1=1
>> >
>> > ¿ Como quedaria armada tu SQL ?
>> >
>> > 'select usuario, pass from usuarios where nombre=varnombre and
>> > pass=1
>> > OR
>> > 1=1'
>> >
>> >
>> > Un saludo, Víctor Koch.
>> >
>> >
>> > "Antonio Ortiz" escribió en el mensaje
>> > news:
>> >>
>> >> Que me han hackeado un sitio, y no se exactamente como, les cuento
>> >> un
>> >> poco
>> >>
>> >> Tengo un portal para empresas, donde se registran y colocan sus
>> >> datos
>> >> que
>> > se
>> >> muestran en un directorio, el unico lugar donde meten datos es al
>> >> iniciar
>> >> sesion con su nombre de usuario y contraseña y donde capturan sus
>> >> datos.
>> >>
>> >> Un dia cualquiera los datos de una empresa estan cambiados con un
>> >> mensaje
>> > de
>> >> un sitio hacker, los datos de esa empresa son precisamente los
>> >> mios,
>> >> capturados como ejemplo.
>> >>
>> >> Me podrian decir como evitar esto?, que medidas puedo tomar?,
>> >>
>> >> pueden injectar codigo sql por el nombre del usuario (o password)
>> >> para
>> >> ?
>> >> ,
>> >> el codigo que valida esto es un simple 'select usuario, pass from
>> >> usuarios
>> >> where nombre=varnombre and pass=varpass' (similar)
>> >>
>> >>
>> >> gracias
>> >>
>> >>
>> >> Antonio Ortiz
>> >> asesor en sistemas
>> >> ant(a)aortiz.net
>> >> www.aortiz.net
>> >> www.progvisual.com
>> >>
>> >>
>> >
>> >
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida