SQL Server vs MySQL - 经典ASP中的SQL注入漏洞

问题描述:

由于未能清理提供给页面的查询字符串参数,最近我们客户的一个网站受到SQL注入攻击。易受攻击的代码已经被识别出来并且正在被纠正,但是这让我想到了MySQL和SQL Server如何处理多查询字符串之间的一些差异。SQL Server vs MySQL - 经典ASP中的SQL注入漏洞

易受攻击的代码在几十个网站上使用,其中两个正在SQL服务器上运行,其余都在MySQL上。通过这段代码,我们以前从未遭受过注入攻击(由上帝的恩典),但是一旦我们发布了在SQL服务器上运行的两个网站(具有相同的代码库),网站就很快被利用。注射的方法是相当简单:

page.asp?param=1;delete from [some_table];

就像我说的,有漏洞的代码是在许多网站上共享,但如果我尝试执行我们的MySQL网站同类型的注入ASP抛出了一个不错的服务器错误让我们知道,有一个在查询时出现错误:

SELECT * FROM Table1 WHERE ID = 1;DELETE FROM TABLE1;

测试这进一步,我能够确认的MySQL ODBC 3.51驱动程序将不会允许两个SQL查询在相同的语句执行当ADODB.Connection对象调用Exec时ute(“”),而SQL Server Native Client(10.1)在运行两个并排查询时没有任何问题。这实际上只是提供者的一种配置,它使得SQL服务器以这种方式变得脆弱,而MySQL不是,或者这是来自其他地方的吗?

+0

请问您的公司是如何解决这个问题的? – user161433 2009-09-01 00:09:58

+0

请看http://support.microsoft.com/kb/200190以获取一个简单的解释 – 2009-09-01 02:17:38

默认情况下,MySQL客户端API不允许多查询。你必须明确地启用它,否则当你试图执行查询时你会看到错误。这对于降低SQL注入攻击的风险是一件好事。

MySQL ODBC驱动程序3.51.18(2007年8月)增加了对连接选项FLAG_MULTI_STATEMENTS的支持以启用多语句。见http://dev.mysql.com/doc/refman/5.1/en/connector-odbc-configuration-connection-parameters.html

另请参阅http://bugs.mysql.com/bug.php?id=7445了解此选项的历史记录。

另请参阅我对“Mysql change delimiter for better SQL INJECTION handling?”的回答请注意,多语句只是获取SQL注入漏洞的一种方法。禁用多语句不能100%证明这些缺陷。

我认为这是因为SQL Server支持MARS。据我了解,MySQL不支持这一点。火星是一个很好的功能,可以加快数据库的查询速度,减少往返次数。你可以把更多的一个查询放在一个sql语句中。

这是SQL服务器的一项功能,它支持多行语句。该解决方案不是用来清理输入,而是使用参数化查询或存储过程。如果查询已经

SELECT * FROM Table1 WHERE ID = @id 

然后通过“1;DELETE FROM TABLE1;”将产生一个错误,因为这不是一个有效的整数值。

+0

或者用cInt()或cLng() – AnonJr 2009-09-01 03:08:00

可以在不堆叠查询的情况下利用SQL注入。一个非常常见的方法是使用“联盟选择” 这里是一个MySQL注入漏洞,我已经写它采用了工会选择: http://milw0rm.com/exploits/3002 一位工会的选择可以让你做其他语句中的SELECT语句: 选择1个联盟选择从mysql.user

密码你也可以做一个子选择: INSERT INTO sometable(一些,山坳,ID)值((选择mysql.user密码),1,1) - )

盲目sql注入在所有平台上都能正常工作,但是根据数据库的不同,exploit会有所不同。这是一个盲目的SQL注入攻击的MySQL:” milw0rm.com/exploits/4547

这是SQL注入的MySQL的话题非常好的纸: www.ngssoftware.com/papers/HackproofingMySQL.pdf