这种消毒不安全吗?它是否容易受到SQL注入攻击?

时间:2014-04-17 05:15:18

标签: sql-server sql-injection

Function RemoveSuspeitos(ByVal strTXT)
               Dim txtAux As String
               txtAux = strTXT
               txtAux = Replace(txtAux, chr(34), "")
               txtAux = Replace(txtAux, "'", "")
               RemoveSuspeitos = txtAux
End Function

DB:MSSQL

1)忘记上面代码中的语法错误,我不是VB的专家。

2)假设我总是使用单引号或双引号,即使是int值(例如:'" + $ int_id +"')。

这种消毒不安全吗? 如果是,为什么?请告诉我一个真正的漏洞利用场景。

1 个答案:

答案 0 :(得分:1)

这是我的尝试。

漏洞问题在于,大多数用户认为它们并非直接

实际上,生产代码与人工完全控制的示例略有不同。

所以,这里没有技术,但方法漏洞正在进入现场。我去年做了大量研究这个问题,这是我的结论

让我们从一个比喻开始:

必须始终使用安全带。没有例外。 是的,你可以随时说你驾驶得如此安全,以至于不会发生任何崩溃。但不幸的是,统计数据不利于你。还有其他人参与交通。有突然的障碍。有无法预料的破损。这就是为什么你应该总是系安全带。 保护代码完全相同。

我在这里发帖摘录my research


为什么手动格式化不好?

因为它是手册。手动==容易出错。这取决于程序员的技能,脾气,情绪,昨晚的啤酒数量等等。事实上,手动格式化是世界上大多数注射案例的唯一原因。为什么呢?

  1. 手动格式可能不完整。
    我们来看看Bobby Tables'案件。它是不完整格式化的完美示例:我们添加到查询中的字符串被引用但未转义!虽然我们从上面得知,引用和转义应始终一起应用(同时为转义函数设置正确的编码)。但是在一个通常的PHP应用程序中,它单独执行SQL字符串格式化(部分在查询中,部分在其他地方),很可能很容易忽略格式化的某些部分。

  2. 手动格式可以应用于错误的文字 只要我们使用完整格式化(因为它会导致立即错误,可以在开发阶段修复),这不是什么大问题,但结合不完整的格式化,这是一场真正的灾难。在Stack Overflow这个伟大的网站上有数百个答案,建议以与字符串相同的方式转义标识符。这完全没用,直接注射。

  3. 手动格式化基本上是非强制性措施 首先,明显缺乏关注案例,可以简单地忘记正确的格式。但是有一个非常奇怪的情况 - 许多PHP用户经常故意拒绝应用任何格式,因为直到今天他们仍然将数据分离到"清理"和"不清洁","用户输入"和"非用户输入"等等。手段"安全"数据不需要格式化。这是一个简单的废话 - 记得Sarah O' Hara。从格式化的角度来看,重要的是目的地。开发人员必须考虑类型的SQL文字,而不是数据源。这个字符串是否会进入查询?它必须格式化然后。无论如何,如果它来自用户输入或只是在代码执行中神秘地出现。

  4. 手动格式可以与实际查询执行分开相当长的距离。

      

    最被低估和忽视的问题。然而,最重要的是,如果没有遵循的话,它可以破坏所有其他规则   几乎每个PHP用户都倾向于进行所有"清理"在一个地方,远离实际的查询执行,这种错误的方法是无数错误的来源:

         
        
    • 首先,由于手头没有查询,人们无法分辨出这段特定数据将代表什么样的SQL文字 - 因此同时违反了格式规则(1)和(2)。
    •   
    • 有一个以上的地方进行补充,我们要求灾难,因为一个开发人员认为它是由另一个人完成的,或者已经在其他地方制作,等等。
    •   
    • 有一个以上的地方进行纯化,我们引入另一种危险,即双重清理数据(比如,一个开发人员在入口点格式化它,另一个在查询执行之前)
    •   
    • 过早格式化很可能会破坏源变量,使其无法在其他地方使用。
    •   

  5. 正如您所看到的,如果正如您所说,您始终将您的值放在引号中,则可以认为前两项不适用。但最后两点来了。 "总是"太夸张了。我们是人类,我们都犯错误。您不仅是正在从事该项目的人员。即使你个人做得对,其他用户可能也不会分享你的信心。比如,他们中的一些人可能会分享一种广泛的错觉,好像只有用户输入必须被消毒" - 因此暴露于二阶注入的危险。

    这就是为什么应该有一个机制,如果严格遵守,可以保证100%的安全,无论开发人员是否理解。 并使用占位符作为查询中的每个动态文字都是这样一种机制。