• λ我爱Aspx >> C#.Net >> SQL概述及在网络安全中的应用_数据库安全
  • SQL概述及在网络安全中的应用_数据库安全

  • :aspxer  Դ:internet  :2007-4-28 23:46:17  ؼ:sql,数据库,数据
  • 要想知道我们要注入的目标语句中有多少个列,你就要试探性的往UNION SELECT子句中添加相应的值,直到它不报“在UNION语句中的所有查询都必须在目标列表中具有相同数目的表达式”这样的错为止。如图所示,如果你遇到的是数据类型不匹配的错误,那么你要去改变列的数据类型。如果返回消息只是一个转换数据类型失败的错误,那就说明你已经猜对了列的数目,只是其中有个别的列的数据类型不对。那么接下来要做的就是判断是哪个列的数据类型的不正确导致的错误。然后将他改过来就可以了。

    如果一切顺利,那么祝贺你,你会得到一个和上面格式类似的而且是合法的页面;)无论动态页面在哪里出现,你都可以构造自己的语句应对自如。

    3.2.8.WHERE关键字

    报错为“无效的列名'EmployeeID'”,这个问题可能是由我们注入的语句结尾的WHERE关键字引起的,举例说明:

    SQLString="SELECT FirstName,LastName,Title FROM Employees WHERE City='"&strcity&"'AND Country ='USA'"

    如果我们注入的语句是UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 那么会得到如下的提交语句:

    SELECT FirstName, LastName, Title FROM Employees WHERE City = 'NoSuchCity' UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 AND Country = 'USA'

    这样就会报错:[Microsoft][ODBC SQL Server Driver][SQL Server]无效的列名 'Country'。

    其实问题就是因为你注入的语句后,系统没有在从数据库的表中找到一个叫'Country'的列名。我们这里可以简单的用“;--”注释符号将其注释掉(如果我们是SQL Server)。或者干脆继续猜其他的列名,然后构造合法请求就如我们上一节讲到的一样。

    表名的枚举

    我们已经开始掌握如何来使用注入进行攻击,但是我们还要确定要从哪个表得到信息,换句话说就是我们要的到关键的表名才能获得我们想要的有用信息。如何获得表名呢?在SQL Server中,你可以很容易得从数据库中得到全部的表名和列名。但是在Oracle和Access中,你就不一定能如此轻易的得到了,这要看WEB程序对数据库的访问权限了。关键在于是否能得到系统建立时自动生成的表中包含的表名和列名。如在SQL Server中,它们分别为'sysobjects'和'syscolumns',(在本文最后我们将给出其他数据库系统自建表和相应的列名)我们用以下的句子可以在这些表中列出数据库的所有列名和表名,(根据情况自行修改):

    SELECT name FROM sysobjects WHERE xtype = 'U'

    这句话会返回数据库中用户定义的所有表,如果我们看到我们感兴趣的或者是想要看的表,那么我们就把他打开,这里以Orders为例构造语句:SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Orders')得到结果如图。

    Ҷƪл˵?
  • һƪMssql和Mysql的安全性分析_数据库安全
    һƪ升级MD5.ASP,打造完全动态不重复的安全加密代码_ASP技巧