【问题标题】:Looking for a SQL injection demonstration寻找 SQL 注入演示
【发布时间】:2012-04-12 18:48:03
【问题描述】:

我是一名 Web 应用程序开发人员,使用 Classic ASP 作为服务器端脚本。

我总是通过使用一个简单的函数将字符串参数的单撇号加倍来保护我的应用免受 SQL 注入。

Function ForSQL(strString)  
  ForSQL = Replace(strString, "'", "''")  
End Function

对于数值参数,我使用 CInt、CLng 和 CDbl 函数。

我经常写串联查询;我并不总是使用存储过程,也不总是验证用户输入。

我想问你是否有人可以向我展示针对这行代码的有效攻击:

strSQL = "SELECT Id FROM tUsers WHERE Username='" & _
         ForSQL(Left(Request.Form("Username"),20)) & "' AND Password='" & _ 
         ForSQL(Left(Request.Form("Username"),20)) & "'"

这可能是一种平庸,但我从未发现一种有效的攻击方式。

【问题讨论】:

标签: asp-classic sql-injection


【解决方案1】:

我总是找到“sqli helper 2.7”(您可以下载它)来查找大多数/所有 SQL 注入。我不确定这是否会有所帮助,但它至少有助于测试所有 SQL cmets 和所有内容。我记得在我的一个网站上,它发现了一个主要的 SQL 注入来使我的所有数据库数据变得哑巴。这不是您要寻找的东西,但它可能能够找到解决方法。

【讨论】:

    【解决方案2】:

    以这种方式净化的输入没有有效的 SQL 注入。缺点是从数据库中检索数据是您必须替换双撇号。

    sDataRetrievedFromDatabase = Replace(sDataRetrievedFromDatabase, "''", "'")
    

    【讨论】:

    • 对不起,我没听懂你的回答。我是意大利人,也许我无法正确理解英语。你能举个例子解释一下吗?
    • 我看到了你的例子。但我不明白为什么我必须将双撇号替换为单个撇号。当我在数据库中写一个双 apos... 它只考虑一个。
    • 根据我的经验,情况并非如此。当我返回数据时,我需要执行此替换以将数据返回到单个撇号。
    • 如果使用 MS SQL Server,如果您 INSERT INTO Temp(Field1) ('''') 数据库只保存一个单引号。如果您 SELECT * FROM Temp 结果只有 ' (一个单引号,而不是两个)...所以...无需替换...
    • 这是不正确的。有关一些示例,请参阅 Lister 先生作为对该问题的评论发布的链接。
    猜你喜欢
    • 2012-10-08
    • 2017-09-12
    • 2018-05-06
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多