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

SQL Server vs MySQL-经典ASP中的SQL注入漏洞,mysql,sql-server,asp-classic,sql-injection,security,Mysql,Sql Server,Asp Classic,Sql Injection,Security,最近,由于未能清理提供给页面的查询字符串参数,我们客户的一个网站受到SQL注入攻击。这段易受攻击的代码已经被识别并正在被纠正,但它让我想知道MySQL和SQL Server处理多查询字符串的方式之间的一些差异 该易受攻击的代码用于几十个网站,其中两个在SQL server上运行,其余在MySQL上运行。有了这段代码,我们以前从未遭受过注入攻击(上帝保佑),但一旦我们发布了在SQL server上运行的两个网站(使用相同的代码库),该网站很快就被利用了。注射方法非常简单: page.asp?参数=

最近,由于未能清理提供给页面的查询字符串参数,我们客户的一个网站受到SQL注入攻击。这段易受攻击的代码已经被识别并正在被纠正,但它让我想知道MySQL和SQL Server处理多查询字符串的方式之间的一些差异

该易受攻击的代码用于几十个网站,其中两个在SQL server上运行,其余在MySQL上运行。有了这段代码,我们以前从未遭受过注入攻击(上帝保佑),但一旦我们发布了在SQL server上运行的两个网站(使用相同的代码库),该网站很快就被利用了。注射方法非常简单:

page.asp?参数=1;从[某些表]中删除

正如我所说,易受攻击的代码在许多网站上共享,但如果我尝试在MySQL网站上执行相同类型的注入,ASP会抛出一个很好的服务器错误,让我们知道查询中有错误:

从表1中选择*,其中ID=1;从表1中删除


通过进一步测试,我能够验证MySQL ODBC 3.51驱动程序在ADODB.Connection对象调用Execute(“”)时不允许在同一语句中执行两个SQL查询,而SQL Server本机客户端(10.1)在运行两个并行查询时没有任何问题。这实际上只是一个提供程序的配置,使得SQL server以这种方式易受攻击,而MySQL则不是,还是这源于其他地方?

我认为这是因为SQL server支持MARS。据我所知,MySQL不支持这一点。火星是一个很好的功能,可以加速数据库查询,从而减少往返次数。您可以在sql语句中放置多个查询。

我认为这是因为sql Server支持MARS。据我所知,MySQL不支持这一点。火星是一个很好的功能,可以加速数据库查询,从而减少往返次数。您可以在sql语句中放置多个查询。

默认情况下,MySQL客户端API不允许多个查询。您必须显式地启用它,否则在尝试执行您所看到的查询时会出现错误。这对于降低SQL注入攻击的风险是一件好事

MySQL ODBC驱动程序3.51.18(2007年8月)添加了对连接选项
FLAG_MULTI_STATEMENTS
的支持,以启用多语句。看

有关此选项的历史记录,请参见


另请参见我对“”的回答。请注意,多语句只是获取SQL注入漏洞的一种方法。禁用多语句并不能100%证明这些缺陷。

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

MySQL ODBC驱动程序3.51.18(2007年8月)添加了对连接选项
FLAG_MULTI_STATEMENTS
的支持,以启用多语句。看

有关此选项的历史记录,请参见


另请参见我对“”的回答。请注意,多语句只是获取SQL注入漏洞的一种方法。禁用多语句并不能100%证明这些缺陷。

SQL server的一项功能是支持一行多个语句。解决方案与其说是清理输入,不如说是使用参数化查询或存储过程。如果问题已经解决了

SELECT * FROM Table1 WHERE ID = @id

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

SQL server的一个功能是支持一行中的多个语句。解决方案与其说是清理输入,不如说是使用参数化查询或存储过程。如果问题已经解决了

SELECT * FROM Table1 WHERE ID = @id

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

可以在不堆叠查询的情况下利用SQL注入。一种非常常见的方法是使用“联合选择” 下面是我编写的一个mysql注入攻击,它使用union select: union select允许您在其他语句中生成select语句: 从mysql.user中选择1联合选择密码

您还可以进行子选择: 插入sometable(some,col,id)值((从mysql.user中选择密码),1,1)--)

盲sql注入可以在所有平台上工作,但是根据数据库的不同,利用漏洞的情况也会有所不同。这是一个针对mysql的盲目SQL注入漏洞: milw0rm.com/exploits/4547

这是一篇关于MySQL SQL注入主题的非常好的论文:
www.ngssoftware.com/papers/HackproofingMySQL.pdf

可以利用SQL注入而无需堆叠查询。一种非常常见的方法是使用“联合选择” 下面是我编写的一个mysql注入攻击,它使用union select: union select允许您在其他语句中生成select语句: 从mysql.user中选择1联合选择密码

您还可以进行子选择: 插入sometable(some,col,id)值((从mysql.user中选择密码),1,1)--)

盲sql注入可在所有平台上工作,但根据数据库的不同,利用漏洞的情况会有所不同。这是针对mysql的盲sql注入漏洞: milw0rm.com/exploits/4547

这是一篇关于MySQL SQL注入主题的非常好的论文:
www.ngssoftware.com/papers/HackproofingMySQL.pdf

我可以问一下贵公司是如何解决这个问题的吗?请看一个简单的解释。或者用cInt()或cLng()或cInt()或cLng()进行转换