代码之家  ›  专栏  ›  技术社区  ›  Nathan Taylor

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

  •  1
  • Nathan Taylor  · 技术社区  · 15 年前

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

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

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

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

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

    4 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    7 年前

    默认情况下,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%证明这些缺陷。

        2
  •  2
  •   John Saunders    15 年前

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

    SELECT * FROM Table1 WHERE ID = @id
    

    然后经过“ 1;DELETE FROM TABLE1;

        3
  •  1
  •   richardtallent    15 年前

    火星

        4
  •  1
  •   rook    15 年前

    可以在不堆叠查询的情况下利用SQL注入。一种非常常见的方法是使用“联合选择” http://milw0rm.com/exploits/3002 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