Sql盲注入

时间:2013-08-02 22:55:39

标签: c# asp.net security testing

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

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

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

 ddlRecommendoffer.SelectedValue.ToString()

DDL值理想情况下应为int(数据库中Row的Id)

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

1 个答案:

答案 0 :(得分: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