【问题标题】:Accidental SQL Injection Triggered from SQL Management Studio从 SQL Management Studio 触发的意外 SQL 注入
【发布时间】:2018-10-06 03:54:03
【问题描述】:

这种说法很奇怪,但想不出更好的标题。

我知道在一定程度上,使用 LINQ/Entity/SqlParam/etc 有助于防止 SQL 注入。我的客户询问是否允许中级 DBA 人员从 Management Studio 运行 SQL 查询意外运行已作为值存储在 DB 中的恶意代码。

我不认为这会是一个问题,但后来我想到了一些更高级的查询,其中您有循环等,它可能会读取电子邮件字段的值,该值可能具有以下值:

--Let's say this value already is stored in the database
--since Linq/Entities/SqlParams prevented it from running in code
--but it obviously still stored it inside of the field.
x'; DROP TABLE members; --

...然后也许对它做一些可能导致它执行的事情。在给出答案之前,我想我最好问问周围的一些意见。

【问题讨论】:

  • 可能会注入一个写得不好的存储过程,但这取决于特定的代码。
  • 我也在想同样的事情。我只是讨厌给出这样的答案,“好吧,一切皆有可能。”。在这种情况下,我想我可以附上,“有可能……可能不会……但是执行不当的 SP 可能会导致这种情况发生……”
  • 问题是,如果发生这种攻击,那是来自内部的攻击,来自管理层高度信任的人​​。另一方面,来自外部的 SQL 注入,例如通过恶意 AJAX 请求,是另一回事。在这种情况下,我们从一开始就不会信任这个人。
  • 这不是“一切皆有可能”,这对于写得不好的 SP 来说是真正的可能性。然而,真正的问题是:为什么中级 DBA 甚至需要费心弄清楚如何运行恶意代码?他们可以直接在 Management Studio 中简单地运行恶意查询。那么这里有什么意义呢?你想把你家的钥匙给别人,但你不信任他们,你害怕他们会从窗户闯进来偷东西? :)
  • 我明白了,所以这不是信任 DBA,而是信任数据库中的数据条目。再次,是的,这是一个真正的可能性,但这不是运行 SP 的 DBA 的错,而是编写 SP 的人的错。在编写 SP 时,您需要考虑类似于在应用程序代码中编写查询时的 SQL 注入。您永远不应该将字符串参数连接到内联 SQL 并执行它,您必须先清理它们。

标签: sql sql-server stored-procedures sql-injection


【解决方案1】:

在编写存储过程时,您必须考虑类似于在应用程序代码中编写查询时的 SQL 注入。你不应该将字符串参数连接到内联 SQL 并执行它,你必须先清理它们。

事实上,内联查询是不好的,应该尽可能避免它,无论是在应用程序的代码中还是在存储过程中。但是,有时我们在存储过程中确实需要它们,在这种情况下,您必须在将它们连接到内联查询之前清理任何参数或数据库值。如果您没有正确执行此操作,那么这些存储过程将存在真正的 SQL 注入风险。

【讨论】:

  • 清理参数几乎总是一件坏事。改用参数化查询,并仅将“清理”作为不接受参数的查询(例如 DDL)的最后手段。
  • @Alejandro 我完全同意,但如果你仔细阅读我的回答,我说的是存储过程中的内联字符串查询。遗憾的是,您不能在那里使用参数化查询。这就是为什么我说尽可能避免它(这类似于你所说的“作为最后手段”),但我需要在你的存储过程中使用内联字符串查询,你必须清理你使用的参数和数据库值查询,没有办法解决这个问题。
  • 有一个系统存储过程sp_executesql,它接受一个动态SQL字符串加上它的参数,从而使动态SQL完全可参数化,与从客户端提交命令完全相同。一个普通的EXEC @sql 几乎总是错误的。这将涵盖绝大多数情况,将消毒作为最后的手段。
  • @Alejandro 是的,再次完全同意。这比使用EXEC @sql 好得多,但是当我回答时,这个问题没有用 SQL Server 标记,而且我的回答对于任何数据库都是通用的。我不确定每个数据库都有类似的方式来使用参数化查询,但是有这样一个选项的数据库,我们应该总是喜欢它而不是动态 SQL。
  • 非常好的讨论,我已将 Racil 的答案标记为已接受的答案,因为他和 Tim B. 在问题区域也有一些很棒的 cmets。我认为对我来说真正的收获是更多地关注存储过程中潜在的 SQL 注入,老实说,直到这个问题我才真正考虑过。感谢大家的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多