2009-09-15 3 views
4

Я слышал, что SQL Injection все еще возможно при использовании ADO.NET SQLParameter (параметризованный запрос) для SQL Server.Примеры SQL-инъекций, даже при использовании SQLParameter в .NET?

Я ищу реальные примеры в коде C#/VB в качестве доказательства.

EDIT: Я ищу КОНКРЕТНЫЕ рабочие примеры. Не вводить инъекцию sql или как ее предотвратить.

ответ

3

Если вы создаете инструкцию в хранимой процедуре и используете sp_executesql, параметризованный запрос является ложной защитной сетью.

+0

Я искал * кратко * месяцев назад, и это единственная уязвимость, которую я мог найти. Если вам нужно использовать sp_executesql, вы все равно получите большие проблемы. – mxmissile

+0

Я думаю, что то же самое можно сказать и для выполнения динамических запросов «exec» select * from tab, где f1 = '+ @ param1 " – pauloya

+1

Я не использую sp_executesql. –

3

Существует еще один вопрос здесь, на SO с некоторыми большими ответами на SQL Injection ...

Are Parameters really enough to prevent Sql injections?

Этот пример взят непосредственно из приведенной выше ссылке от Стивена А. Лоу.

Пример, где параметр @ p1 предназначен для имени таблицы

create procedure dbo.uspBeAfraidBeVeryAfraid (@p1 varchar(64)) 
AS 
    SET NOCOUNT ON 
    declare @sql varchar(512) 
    set @sql = 'select * from ' + @p1 
    exec(@sql) 
GO 

Вот некоторые дальнейшее чтение ...

+0

Спасибо, но ни одна из этих ссылок не имеет рабочих примеров. Я уже знаком с тем, как использовать термизированные запросы. Отсюда мой вопрос о том, как обойти его. –

+0

@Tony: Вы посмотрели ссылку на другой ответ здесь, на SO? Там есть отличный пример в первом номере от мистера Лоу. – RSolberg

0

Попробуйте найти уязвимости в ADO.net, это может быть недостаток безопасности.

+0

Я ищу конкретные примеры. –

2

Конкретный пример ...

create procedure dbo.spVulnerable 
@firstname varchar(200) 
as 
exec ('select id from tblPerson where firstname = ''' + @firstname + '''') 
go 

я, возможно, получили синтаксис неправильно, но независимо от того, как вы параметризировать @firstname он по-прежнему уязвимы к чему-то вроде следующего:

"Joe' or 1=1" 

As если вы используете динамический SQL, вы потенциально уязвимы для SQL-инъекции. Помимо использования параметризованного SQL, единственным решением является белый список ваших данных (или, если вы чувствуете себя храбрыми, попробуйте лишить ввод опасных символов).

0

Скажем у вас есть каталог на продукты для вашего веб-размера и ваша страница поиска позволяет осуществлять поиск по названию продукта, описание, цвет и размер (скажем, вы продаете бюстгальтеры):

create table [products] (
    product_id int identity(1,1) not null primary key 
    , name varchar(256) 
    , description varchar(max) 
    , color varchar(256) 
    , size varchar(256)); 
GO 

create procedure usp_dynamicSearch 
    @product varchar(256) = NULL 
    , @description varchar(256) = NULL 
    , @color varchar(256) = NULL 
    , @size varchar(256) = NULL 
as 
begin 
    set nocount on; 
    declare @sql nvarchar(max) 
     , @and nvarchar(5); 
    set @sql = N'SELECT 
     product_id, name, description, color, size 
     FROM products 
     WHERE '; 
    set @and = N''; 
    if (@product is not null) 
    begin 
     set @sql = @sql + N'name LIKE ''' + @product + N''''; 
     set @and = N' AND '; 
    end 
    if (@description is not null) 
    begin 
     set @sql = @sql + @and + N'description LIKE ''' + @description + N''''; 
     set @and = N' AND '; 
    end 
    if (@color is not null) 
    begin 
     set @sql = @sql + @and + N'color = ''' + @color + N''''; 
     set @and = N' AND '; 
    end 
    if (@size is not null) 
    begin 
     set @sql = @sql + @and + N'size = ''' + @size + N''''; 
    end 
    exec sp_executesql @sql; 
end 
GO 

Вы можете использовать хранимую процедуру, динамически создает SQL-запрос для поиска. Вы вызываете его передачи параметров:

exec usp_dynamicSearch @color = N'Red', @size = N'58-DD'; 

Поскольку процедура создает динамический SQL в небрежным образом, по-прежнему открыт для SQL инъекций:

exec usp_dynamicSearch @color = N'Red', @size = N'''; 
INSERT INTO products (name, description) 
values (''31337'', ''haxorz!''); 
--'; 

Нежелательный продукт sinserted в каталоге (сделать это нападение bening ...).В этом случае подход щее исправление использовать параметры в динамическом SQL, а также и в дальнейшем передать параметры в sp_executesql вызова:

alter procedure usp_dynamicSearch 
    @product varchar(256) = NULL 
    , @description varchar(256) = NULL 
    , @color varchar(256) = NULL 
    , @size varchar(256) = NULL 
as 
begin 
    set nocount on; 
    declare @sql nvarchar(max) 
     , @and nvarchar(5); 
    set @sql = N'SELECT 
     product_id, name, description, color, size 
     FROM products 
     WHERE '; 
    set @and = N''; 
    if (@product is not null) 
    begin 
     set @sql = @sql + N'name LIKE @product'; 
     set @and = N' AND '; 
    end 
    if (@description is not null) 
    begin 
     set @sql = @sql + @and + N'description LIKE @description'; 
     set @and = N' AND '; 
    end 
    if (@color is not null) 
    begin 
     set @sql = @sql + @and + N'color = @color'; 
     set @and = N' AND '; 
    end 
    if (@size is not null) 
    begin 
     set @sql = @sql + @and + N'size = @size'; 
    end 
    exec sp_executesql @sql , N'@product varchar(256) 
     , @description varchar(256) 
     , @color varchar(256) 
     , @size varchar(256)' 
     , @product, @description, @color, @size; 
end 
GO 

Так sp_executesql и динамический SQL является основной проблемой. Кроме этого, существуют также различные системные процедуры, которые создают динамический SQL под обложками, и исторически некоторые из них оказались уязвимыми, особенно на SQL 2000.

Смежные вопросы