ASP脚本中的SQL注入漏洞

时间:2013-06-26 09:09:17

标签: sql asp-classic sql-injection

现在我有一个示例ASP脚本:

    <%Set objConn = CreateObject("ADODB.Connection")
    objConn.Open Application("WebUsersConnection")
    sSQL="SELECT * FROM Users where Username=? & Request("user") & _"?and Password=? & Request("pwd") & "?
    Set RS = objConn.Execute(sSQL)
    If RS.EOF then
       Response.Redirect("login.asp?msg=Invalid Login")
    Else
       Session.Authorized = True
    Set RS = nothing
    Set objConn = nothing Response.Redirect("mainpage.asp")
    End If%> 

我可以知道这个脚本会导致什么样的SQL注入?执行的结果是什么,以及可以使用上述脚本注入应用程序的任何示例SQL?它是从纸上提取的。感谢

3 个答案:

答案 0 :(得分:1)

将用户输入直接写入SQL查询的问题之一:

sSQL="SELECT * FROM Users where Username='" & Request("user") & "' and Password='" & Request("pwd") & "'"

是用户提交的

username' OR 1=1 --

使您的查询最终如下所示:

SELECT * FROM Users where Username='username' OR 1=1 --' and Password=''

取决于您的数据库驱动程序,这可能至少返回一行,使您的脚本认为这是一个有效用户(或者甚至是管理员,如果默认按id升序排序)。

您可以使用ADODB.Command对象来准备SQL查询并将值绑定到占位符。

这样的事情:

sSQL="SELECT * FROM Users where Username=? and Password=?"
set objCommand=CreateObject("ADODB.Command")
objCommand.Prepared = true
objCommand.ActiveConnection = objConn
objCommand.CommandText = sSQL
objCommand.Parameters.Append objCommand.CreateParameter("name",200,1,50,Request("user"))
objCommand.Parameters.Append objCommand.CreateParameter("password",200,1,64,Request("pwd"))
objCommand.Execute

MSDN似乎并不清楚ADODB.Command是否会实际单独处理查询和值,但我想对于“现代”数据库驱动程序,这是支持的。如果我没记错的话,这适用于Oracle OLEDB数据库驱动程序。

MSDN on ADODB.Command properties and methods

答案 1 :(得分:0)

我已经使用以下两个步骤来防止在高流量网站上多年使用ASP注入SQL,并且从未遇到过问题。

  1. 对于每个char数据类型,请确保使用双撇号替换任何撇号,如下所示:

    sql = "SELECT * FROM users WHERE "
    sql = sql & "Username = '" & Replace(Request("user"), "'", "''") & "' "
    sql = sql & "AND Password = '" & Replace(Request("pwd"), "'", "''") & "'"
    
  2. 对于任何数字(非字符)字段,请先验证输入是否为数字,否则忽略它,或返回错误。

答案 2 :(得分:0)

在将它们传递到数据库进行处理之前,使用正则表达式检查输入中的字符(查询字符串/表单变量/ etc ...)总是好的。应该进行检查以查看输入中的所有字符是否都在允许的字符内(白名单检查)。

Function ReplaceRegEx(str, pattern)
set pw = new regexp
pw.global = true
pw.pattern = pattern
replaced = pw.replace(str, "") 'Find the pattern and store it in "replaced"
ReplaceRegEx = replace(str,replaced,"") 'Replace with blank.
End Function

'below is a sample. you can create others as needed
Function UserNameCheck(x)
UserNameCheck = ReplaceRegEx(x,"^[a-zA-Z_-]+$")
End Function

这就是你在ASP页面中调用它的方式:

fld_UserName=UserNameCheck(fld_UserName)
if fld_UserName="" then 
    'You can probably define the below steps as function and call it...
    response.write "One or more parameters contains invalid characters"
    response.write "processing stopped"
    response.end
end if