问题
在我们的java应用程序中,我们需要防范'WAITFOR‘sql注入攻击。
背景
这太长了。跳到“解决方案”?如果您有急事,请在下面的部分中
我们的应用程序主要使用准备好的语句和可调用的语句(存储过程)访问数据库。
在一些地方,我们动态地构建和执行用于选择的查询。在这个范例中,我们使用条件对象来构建查询,这取决于用户输入条件。例如,如果用户为first_name和last_name指定值,则结果查询总是如下所示:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier'(在本例中,用户将指定"joe“和"frazier”作为他/她的输入值。如果用户有或多或少的批判性,我们就会有更长或更短的查询。我们发现这种方法比使用准备好的语句更容易,比存储过程更快/更有表现力。
攻击
漏洞审核报告了sql注入失败。攻击者将“last_name”参数的值“frazier WAITFOR”延迟'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延迟”攻击的几点观察
的末尾
解决方案,廉价黑客,还是两者兼而有之?
最明显的解决方案是简单地在where子句中添加“和1=1”。
生成的sql立即失败,并挫败攻击者:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20' AND 1=1问题
vulnerabilities?
发布于 2010-01-07 21:45:24
处理SQL注入的正确方法是使用参数化查询。其他的一切都在风中撒尿。它可能会工作一次,甚至两次,但最终你会被那种温暖的感觉击中,上面写着“你搞砸了,糟糕!”
无论您做什么,除了参数化查询,都将是次优的,这将取决于您自己来确保您的解决方案没有需要修补的其他漏洞。
另一方面,参数化查询是不受限制的,可以防止所有这些攻击。
发布于 2010-01-07 21:40:20
SQL注入就是SQL注入-- WAITFOR DELAY没有什么特别之处。
在这个时代,绝对没有理由不使用准备好的语句来进行如此简单的查询。
(编辑:好吧,不是“绝对”-但几乎没有任何借口)
发布于 2010-01-07 21:44:19
我认为您自己提出了解决方案:参数化查询。
您如何发现动态构建的查询比使用存储过程更快?一般来说,情况往往正好相反。
https://stackoverflow.com/questions/2023854
复制相似问题