mysql - SQL Server 与 MySQL - 经典 ASP 中的 SQL 注入(inject)漏洞

标签 mysql sql-server asp-classic sql-injection security

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

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

page.asp?param=1;从[some_table]删除;

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

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

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

最佳答案

默认情况下,MySQL 客户端 API 不允许多查询。您必须明确启用此功能,否则在尝试执行您看到的查询时会出错。这对于降低 SQL 注入(inject)攻击的风险是一件好事。

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 注入(inject)漏洞的一种方法。禁用多语句并不能 100% 证明这些缺陷。

关于mysql - SQL Server 与 MySQL - 经典 ASP 中的 SQL 注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1359973/

相关文章:

asp.net - 我应该开始学习经典的 VB/ASP 还是 .NET?

sql - 将两级 XML 列表中的值提取到 SQL 列中

sql-server - 在动态 SQL 中使用 OUTPUT 参数调用存储过程

ms-access - 微软 Access : No value given for one or more required parameters

mysql - 如何在不使用 "SQL"中的 GROUP BY 的情况下解决此操作

c# - 将 SQL Server 数据库添加到 Visual Studio 2013 ASP.Net 网页

javascript - 我可以在 document.setcookie 中返回 document.getelementbyid 的值吗?

mysql - 自动转换查询结果中每个日期列的日期格式的函数?

php - 获取不同的列并返回过滤结果

mysql - SQL:选择列值至少出现两次的行?