Sql blind Injection

本文关键字:Injection blind Sql | 更新日期: 2023-09-27 18:26:16

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

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

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

 ddlRecommendoffer.SelectedValue.ToString()

DDL值最好是int(数据库中的行Id)

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

Sql blind Injection

当注入尝试没有直接反馈时,例如当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