0

我有基于 c# 表单的 Web 应用程序。当我通过 Acunetix 网络扫描仪扫描应用程序时,它在添加模块部分给了我一个盲目的 sql 注入。Aunteix 生成的报告是

POST (multipart) input ctl00$ContentPlaceHolder1$ddlRecommendoffer was set to -87
POST / 

这个 ddlRecommendoffer 是一个下拉列表,它从数据库中获取值,当我将表单存储在数据库中时,我得到这个下拉列表的值

 ddlRecommendoffer.SelectedValue.ToString()

理想情况下,DDL 值应该是一个 int(数据库中的行 ID)

我正在使用带有参数的存储过程将其插入到数据库中,这应该停止 Sql 注入,但是为什么它会在该字段上显示 BLIND SQL INJECTION ..

4

1 回答 1

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

在这里,您仍然可以通过EmployeeName注入 SQL,因为它的格式/转义不正确。

但是,使用参数化形式是安全的:

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
于 2013-08-03T05:54:08.820 回答