use*_*150 7 sql-server sql-injection jdbc
问题
我们需要在我们的java应用程序中防御'WAITFOR DELAY'sql注入攻击.
背景
[这很长.跳到'解决方案?' 以下部分,如果你匆忙]
我们的应用程序主要使用预准备语句和可调用语句(存储过程)来访问数据库.
在一些地方,我们动态构建并执行查询以供选择.在此范例中,我们使用条件对象根据用户输入条件构建查询.例如,如果用户为first_name和last_name指定了值,则查询结果总是如下所示:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier'
Run Code Online (Sandbox Code Playgroud)
(在这个例子中,用户会指定"joe"和"frazier"作为他/她的输入值.如果用户有更多或更少的批评,我们会有更长或更短的查询.我们发现这种方法比使用准备更容易声明,比存储过程更快/更高效.
攻击
漏洞审计报告了sql注入失败.攻击者为'last_name'参数注入'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'
Run Code Online (Sandbox Code Playgroud)
结果:查询成功执行,但执行时间为20秒.攻击者可以占用数据库池中的所有数据库连接,并有效地关闭您的站点.
关于这种'WAITFOR DELAY'攻击的一些观察
我曾经想过,因为我们使用了Statement executeQuery(String),所以我们可以安全地从sql注入.executeQuery(String)不会执行DML或DDL(删除或删除).并且在分号上执行Query(String)choke,因此'Bobby Tables'范例将失败(即用户输入'frazier; DROP TABLE成员'作为参数.参见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
Run Code Online (Sandbox Code Playgroud)
问题
ang*_*son 24
处理SQL注入的正确方法是使用参数化查询.其他一切都只是在风中撒尿.它可能会工作一次,甚至两次,但最终你会被那种温暖的感觉所打击,说"你搞砸了,糟糕!"
无论你做什么,除了参数化查询,都将是次优的,并且由你决定你的解决方案没有你需要修补的其他漏洞.
另一方面,参数化查询开箱即用,并防止所有这些攻击.
Aar*_*ght 11
SQL注入是SQL注入 - 没有什么特别的WAITFOR DELAY
.
在这个时代,没有理由不在这样简单的查询中使用预准备语句.
(编辑:好的,不是"绝对" - 但几乎从来没有借口)
归档时间: |
|
查看次数: |
14236 次 |
最近记录: |