Sql слепой инъекции
У меня есть веб-приложение на основе формы C#. Когда я сканирую приложение через веб-сканер Acunetix, это дает мне слепую инъекцию sql в раздел добавления модуля. Отчет, сгенерированный Acunteix,
POST (multipart) input ctl00$ContentPlaceHolder1$ddlRecommendoffer was set to -87
POST /
Этот ddlRecommendoffer является раскрывающимся списком и получает значения из базы данных, и когда я сохраняю форму в базе данных, я получаю значение этого раскрывающегося списка как
ddlRecommendoffer.SelectedValue.ToString()
В идеале значение DDL должно быть целым (идентификатор строки из базы данных)
Я использую процедуру хранения с параметрами, чтобы вставить ее в базу данных, которая должна остановить инъекцию Sql, но тогда почему она показывает мне BLIND SQL INJECTION в этом поле..
1 ответ
Внедрение SQL называется слепым, когда нет прямой обратной связи от попытки внедрения, например, когда результат оператора SQL не возвращается обратно пользователю.
Ваше приложение может оставаться уязвимым, хотя вы используете хранимую процедуру, если оно динамически создает запрос с параметрами:
Create Procedure sp_EmployeeSelect
@EmployeeName NVarchar(100)
AS
Declare @SQLQuery AS NVarchar(4000)
SET @SQLQuery = 'SELECT * FROM tblEmployees
WHERE EmployeeName LIKE ''%' + @EmployeeName + '%'''
EXECUTE sp_executesql @SQLQuery
GO
Здесь вы все еще можете вводить SQL через EmployeeName, поскольку он неправильно отформатирован / экранирован.
Однако использование параметризованной формы будет безопасным:
Create Procedure sp_EmployeeSelect
@EmployeeName NVarchar(100)
AS
Declare @SQLQuery AS NVarchar(4000)
Declare @ParamDefinition AS NVarchar(2000)
SET @SQLQuery = 'SELECT * FROM tblEmployees
WHERE EmployeeName LIKE ''%'' + @EmployeeName + ''%'''
SET @ParamDefinition = '@EmployeeName NVarchar(100)'
EXECUTE sp_executesql @SQLQuery, @ParamDefinition,
@EmployeeName
GO