Sql server 有可能对多行查询运行SQL注入攻击吗?

Sql server 有可能对多行查询运行SQL注入攻击吗?,sql-server,sql-injection,Sql Server,Sql Injection,假设我有一个接受用户输入的多行SQL查询。通过注释使用标准SQL注入是否可能中断 这适用于通过环回API接受用户输入的Microsoft SQL Server查询。因为相同的用户输入在多个点中使用,所以我似乎无法编写创建有效SQL查询以运行注入攻击的输入 修订代码: SELECT Field_Name FROM Table_Name WHERE Field_Name != 'Hardcoded Value' AND ( Field_1 LIKE '%userin

假设我有一个接受用户输入的多行SQL查询。通过注释使用标准SQL注入是否可能中断

这适用于通过环回API接受用户输入的Microsoft SQL Server查询。因为相同的用户输入在多个点中使用,所以我似乎无法编写创建有效SQL查询以运行注入攻击的输入

修订代码:

SELECT Field_Name
FROM Table_Name
WHERE  Field_Name != 'Hardcoded Value' AND (
                Field_1 LIKE '%userinput%' OR
                Field_2 LIKE '%userinput%' OR
                Field_3 LIKE '%userinput%' OR
                Field_4 LIKE '%userinput%'
            ) 
请注意,userinput是来自前端的实际输入,用于两个通配符之间

在用户输入为的情况下运行此代码 '删除表用户- 将由于OR语句而出错


这个查询可以通过SQL注入破解吗?

是的,这是可能的,您只需要多一点创造性。攻击者只需尝试更多内容并查看错误或页面输出,通过精心设计目标选择,就可以轻松推断查询的形状。如果我们将userinput设置为

我们最终得到一个如下所示的查询:

SELECT Field_Name
FROM Table_Name
WHERE  Field_Name != 'Hardcoded Value' AND (
    Field_1 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_2 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_3 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_4 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%'
) 

这在语法上是有效的,在可怜的Bobby桌子上犯了四起谋杀罪。注意,我们在这里甚至不需要评论;正确匹配分隔符就足够了。

这是一个基于一些极其常见的误解的好问题

有两件事,可能的注入和实际的利用,重要的是不要混淆它们

SQL注入是根据用户输入修改SQL程序代码的可能性。只是可能性。 实际的利用是,嗯。。。实际利用漏洞,即执行某些操作的有效负载,这些操作可能会更改数据库中的数据或检索atacker不应该访问的某些数据。 如果你不能想出一个有用的漏洞,这并不意味着注入不存在。是的。一旦它这样做了,就会以这种或那种方式发现漏洞。至于您的查询是多行查询还是允许注释、不允许某些字符或任何其他限制,这完全无关紧要。漏洞的数量是无限的,如果一千个漏洞不起作用,一千个第一个就可以了

现在你可以知道臭名昭著的“删除表用户”;利用中的漏洞不是SQL注入的同义词。这只是无数可能的漏洞之一

此外,虽然不是每个API都允许执行多个查询,因此在查询中使用分隔符总是会产生语法错误,但这并不意味着您的查询是可靠和安全的。即使无法通过SQL注入运行数据修改查询,但这并不意味着没有危害。获取未经授权的数据的漏洞可能比表删除更有害

那么,这番咆哮有什么好处呢

是的,这个查询是可以通过SQL注入破坏的,并且会产生致命的后果


从开发人员的角度来看,您不关心哪些特定的漏洞是可能的。您应该始终修复注入、全部可能性,而不是您意识到的某个特定漏洞。为此,您永远不会让任何外部数据进入您的查询,就这么简单

我不知道你在问什么。上述查询中没有任何注入或参数化;这样它就不会受到影响了。如果将值注入到上面的%userinput%中,则可以。可以通过其他方式添加注释,例如/*这也是注释*/。没有任何理由不对查询进行参数化,而是在不确保正确引用的情况下注入值。虽然您的答案包含好的内容,并且我对其进行了投票,但从字面上看,任何以某种方式包含用户字符串的查询都不会落入注入。如果是这样的话,任何动态SQL的使用本质上都是一个有保证的安全漏洞,幸运的是,在我们需要它的情况下,情况并非如此。事实上,很难说您已经设置了一种注入无法发生的方式,特别是因为这会因数据库引擎的不同而有所不同,而且参数化总是首选。这正是我正在考虑的可怜的概念。只要像QUOTENAME这样的函数得到了良好的实现,并且假设它与假设引擎的其他部分不包含安全漏洞一样安全,可通过非动态查询利用动态查询文本,如“选择1作为”+QUOTENAME@t这是安全的。在这种情况下,输出域可以完全描述为公认的庞大输入域的函数。如果插入任意字符串,情况显然不同,但基于用户输入修改代码所涉及的范围更广。是否可怜是另一回事。
SELECT Field_Name
FROM Table_Name
WHERE  Field_Name != 'Hardcoded Value' AND (
    Field_1 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_2 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_3 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_4 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%'
)