是否可以对多行​​查询进行 运行 SQL 注入攻击?

Is it possible to run an SQL injection attack on a multi-line query?

假设我有一个接受用户输入的多行 SQL 查询。是否可以通过评论打破使用标准 SQL 注入?

这是针对通过环回 API 接受用户输入的 Microsoft SQL 服务器查询。因为在多个地方使用相同的用户输入,我似乎无法编写一个输入来创建一个有效的 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是前端的实际输入,用在两个通配符之间。

运行 用户输入此代码 ' DROP TABLE USERS; -- 会出错,因为 OR 语句。

此查询是否可通过 SQL 注入破解?

是的,有可能,您只需要多一点创造力。攻击者可以通过尝试更多内容并查看错误(或页面输出,通过制作目标 SELECTs)轻松推断出您的查询的形状。如果我们将 userinput 设置为

'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '

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

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 Tables 上犯下了四重杀人罪。请注意我们在这里甚至不需要评论;正确匹配分隔符就足够了。

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

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

  • SQL 注入是根据用户输入更改 SQL 程序代码的可能性。只是可能性。
  • 实际的漏洞是,好吧...实际的漏洞,执行某些操作的有效负载可能会更改数据库中的数据或检索攻击者不应访问的某些数据。

如果你不能想出一个有用的漏洞,并不意味着注入不存在。确实如此。一旦这样做,就会以这种或其他方式发现漏洞。至于您的查询是多行的还是允许评论或不允许某些字符或任何其他限制绝对无关紧要。 exploit 的数量是 infinite,如果 1000 个 exploit 都不起作用,那么第一个 1000 个就可以了。

所以现在你可以看出(不)著名的 ' DROP TABLE USERS; 漏洞利用并不是 SQL 注入的同义词。这只是 无数 可能的攻击之一。

此外,虽然不是每个API都允许你执行多个查询,所以在查询中有一个分隔符总是会产生语法错误,这并不意味着你的查询是正确的安全。即使无法通过SQL注入运行数据修改查询,也不代表没有危害。获取您无权访问的数据的漏洞可能比 table 删除更有害。

那么,这个咆哮的收获是什么?

是的,此查询可通过 SQL 注入破坏, 会造成致命后果。

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