gpt4 book ai didi

sql-server - 防御 'WAITFOR DELAY' SQL注入(inject)攻击?

转载 作者:行者123 更新时间:2023-12-02 23:11:26 26 4
gpt4 key购买 nike

问题

我们需要防御 Java 应用程序中的“WAITFOR DELAY”sql 注入(inject)攻击。

背景

[这很长。跳至“解决方案?”如果您很着急,请参阅下面的部分]

我们的应用程序在访问数据库时主要使用准备好的语句和可调用语句(存储过程)。

在一些地方,我们动态构建并执行查询以进行选择。在此范例中,我们使用条件对象根据用户输入条件构建查询。例如,如果用户指定了first_name和last_name的值,则查询结果总是如下所示:

SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier'

(在此示例中,用户将指定“joe”和“frazier”作为他/她的输入值。如果用户有更多或更少的条件,我们将会有更长或更短的查询。我们发现这种方法更容易比使用准备好的语句并且比存储过程更快/性能更高)。

攻击

漏洞审核报告 SQL 注入(inject)失败。攻击者为“last_name”参数注入(inject)了值“frazier WAITFOR DELAY '00:00:20”,从而产生了以下 SQL:

   SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20'

结果:查询执行成功,但执行时间为 20 秒。攻击者可以占用数据库池中的所有数据库连接并有效地关闭您的站点。

关于此“WAITFOR DELAY”攻击的一些观察

  • 我曾以为,因为我们使用了 StatementexecuteQuery(String),所以我们可以安全地避免 sql 注入(inject)。 executeQuery(String) 不会执行 DML 或 DDL(删除或删除)。并且executeQuery(String) 被分号阻塞,因此“Bobby Tables”范例将失败(即用户输入“frazier; DROP TABLE member”作为参数。请参阅。http://xkcd.com/327/)

  • “WAITFOR”攻击在一个重要方面有所不同:WAITFOR 修改了现有的“SELECT”命令,并且不是一个单独的命令。

  • 攻击仅适用于结果查询中的“最后一个参数”。即'WAITFOR'必须出现在sql语句的最后

解决方案、廉价黑客,还是两者兼而有之?

最明显的解决方案只需将“AND 1=1”添加到 where 子句中。

生成的 SQL 立即失败并挫败了攻击者:

   SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20' AND 1=1

问题

  • 这是针对 WAITFOR 攻击的可行解决方案吗?
  • 它是否可以防御其他类似的漏洞?
  • 我认为最好的选择是使用准备好的语句。更多的工作,但更少的脆弱。

最佳答案

处理SQL注入(inject)的正确方法是使用参数化查询。其他一切都只是随风而去。它可能会起作用一次,甚至两次,但最终你会被那种温暖的感觉击中,“你搞砸了,严重了!”

无论您做什么,除了参数化查询之外,都将不是最佳的,并且您需要确保您的解决方案没有其他需要修补的漏洞。

另一方面,参数化查询开箱即用,可以防止所有这些攻击。

关于sql-server - 防御 'WAITFOR DELAY' SQL注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2023854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com