0

现在我在下面有一个示例 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?它是从纸上提取的。谢谢

4

3 回答 3

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 关于ADODB.Command属性和方法

于 2013-06-26T10:02:36.373 回答
0

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

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
于 2013-06-27T14:23:34.693 回答
0

多年来,我在高流量站点上使用以下两个步骤来防止使用 ASP 进行 SQL 注入,但从未遇到过问题。

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

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

于 2013-06-26T21:19:38.177 回答