Forums Últimos mensajes - Powered by IBM
 
Tags Palabras claves

pregunta

22/11/2005 - 22:44 por nelva | Informe spam
Como trabaja el SQL Injection?

Alma Alicia Gutierrez Garcia
Unidad de Sistemas, CDA.
 

Leer las respuestas

#1 Alejandro Mesa
22/11/2005 - 23:38 | Informe spam
Nelva,

Cuando creamos una sentencia dinamicamente, concatenando cadenas de
intrucciones con cadenas de valores o datos entrados por el usuario, entonces
el resultado final de la concatenacion puede incluir sentencias no deseadas o
dañinas, las cuales pueden ser ejecutadas debido entre otras cosas a que sql
server puede ejecutar un conjunto de sentencias o batch.

Ejemplo:

Supongamos que creas una forma para que el usuario ingrese el nombre de la
compania a buscar y este valor es pasado a un procedimiento almacenado en el
cual se arma dinamicamente la sentencia "select" que sera ejecutada por sql
server.

use northwind
go

create table t1 (
c1 nvarchar(40)
)
go

insert into t1
select companyname from customers
go

create procedure dbo.p1
@s nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'select * from dbo.t1 where c1 = ''' + @s + N''''

print @sql
exec sp_executesql @sql

return @@error
go

exec dbo.p1 N''';drop table dbo.t1;print '''
go

drop procedure dbo.p1
go

select * from t1
go

Si ejecutas el procedimineto anterior, veras cual es la sentencia que se
ejecuta dentro del sp (es impresa por print). Si la lees con lujo de detalle,
notaras que en vez de una, esta se convirtio en tres:

select * from dbo.t1 where c1 = '';
drop table dbo.t1;
print ''

y esto paso porque el valor del parametro de entrada fue:

'';drop table dbo.t1;print ''

valor que fue usado en la concatenacion:

set @sql = N'select * from dbo.t1 where c1 = ''' + @s + N''''

Si reemplazamos el parametro @s en la sentencia, por su valor, quedaria:

set @sql = N'select * from dbo.t1 where c1 = '' '';drop table dbo.t1;print
'' '''

y cada par de apostrofes dentro de la cadena, son interpretados como uno
solo por sql server, quedando:

select * from dbo.t1 where c1 = '';drop table dbo.t1;print ''

que son las tres sentencias resultado de la concatenacion y que seran
ejecutadas usando sp_executesql. Como vez, una de las sentencias es "delete
table dbo.t1", la cual fue ingresada por el usuario y asi poco a poco este
podria ir acabando con nuestra db.

La inyeccion de codigo sql esta fuertemente asociada con la construccion de
sentencias sql de forma dinamica, osea, que concatenamos cadenas fijas con
cadenas entradas por el usuario. Si evitamos hacer esto, estaremos evitando
la inyeccion de codigo sql.

Otras formas de evitarlo es usando correctamente el procedimineto
sp_executesql, el cual acepta parametros de entrada definidos en la cadena
que se ejecuta.

Ejemplo:

use northwind
go

create table t1 (
c1 nvarchar(40)
)
go

insert into t1
select companyname from customers
go

create procedure dbo.p1
@s nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'select * from dbo.t1 where c1 = @s'

print @sql
exec sp_executesql @sql, N'@s nvarchar(40)', @s

return @@error
go

exec dbo.p1 N''';drop table dbo.t1; print '''
go

drop procedure dbo.p1
go

select * from t1
go

drop table t1
go

Fijate que ahora la sentencia que se ejecuta es:

select * from dbo.t1 where c1 = @s

y sql server buscara en la tabla t1 por filas que cumplan que su valor sea
igual a:

'';drop table dbo.t1;print ''

y como ninguna fila cumple con este criterio, pues no problema.

Otra forma seria reemplazando cada apostrofe en la cadena entrante por un
par de ellos, quedando:

set @sql = N'select * from dbo.t1 where c1 = ''' + replace(@s, '''', '''''')

lo cual al concatenarse quedaria:

select * from dbo.t1 where c1 = ''';drop table dbo.t1;print ''

y si te fijas cuidadosamente, la sentencia tiene un apostrofe de mas. Este
batch dara error.

Un ultimo comentario, y es que la generacion dinamica de la sentencia puede
pasar lo mismo en la aplicacion cliente (por ejemplo concatenando en la
aplicacion visual basic y enviando la sentencia a sql server), como en la
base de datos al concatenar en el procedimineto almacenado.

Espero haberte ayudado. Aca te paso otros links que apuntan a articulos muy
interesantes sobre el tema.

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

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html

SQL injection
http://en.wikipedia.org/wiki/SQL_injection


AMB

"nelva" wrote:

Como trabaja el SQL Injection?

Alma Alicia Gutierrez Garcia
Unidad de Sistemas, CDA.



Preguntas similares