科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SQL概述及在网络安全中的应用(上)(4)

SQL概述及在网络安全中的应用(上)(4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

有些网络数据库没有过滤客户提供的数据中可能有害的字符,SQL注射就是利用插入有害字符进行攻击的技术。

作者:yuanye 来源:赛迪网技术社区 2007年9月7日

关键字: 安全 SQL Server SQL Server 各版本 数据库

  • 评论
  • 分享微博
  • 分享邮件

所有其他的例子都是引号注射,在一个存在引号插入漏洞的程序里面, 任何一个你提交的参数,系统都会在前面和后面添加一个引号,就像这样:

  SQLString = "SELECT FirstName, LastName, 
   Title FROM Employees WHERE EmployeeID = '" & strCity & "'"

为了能(break out)打破这引号,并伪造一个正确的查询,在你的SQL注射字符串中的SQL关键字之前必须包含一个单引号,而且在WHERE子句的后面也需要加上一个单引号.现在我们来谈谈"欺骗"的问题.是的,SQL SERVER会忽视在";--"后面的任何东西,但是只有MS的SQL SERVER会这样做.我们最好学习如何处理这个问题,这样我们在面对Oracle,DB/2,MySQL 和他种类的数据库服务器的时候就知道怎么做了.

SELECT查询被用于从数据库中获取信息.大多数的web应用程序通过SELECT向数据库获取信息候再动态地在页面上显示出来.通常,数据库查询这部分你可以自己伪造,他将成为WHERE子句的一部分.我们可以通过插入UNION SELECT来绕过web程序允许我们查询的数据,从而得到其它的数据.联合查询(指UNION SELECT)允许在一条语句中使用多个SELECT查询,看上去就像这样:

  SELECT CompanyName FROM Shippers
    WHERE 1 = 1 UNION ALL SELECT CompanyName FROM Customers WHERE 1 = 1

它返回的结果中包含了第一个查询和第二个查询的结果,"ALL SELECT"这里的ALL是必须的,这样可以逃过SELECT DISTINCT语句的限制并且不会妨碍别的(??),所以最好是使用它.你必须确认第一个查询,即web应用程序编写者希望执行的那个被执行,不返回任何记录.这并不难.举个例子,有这么一个表达式:

  SQLString = "SELECT FirstName, 
    LastName, Title FROM Employees WHERE City = '" & strCity & "'"

我们构造如下的插入串:

  ' UNION ALL SELECT OtherField FROM OtherTable WHERE ''='

这将导致如下的SQL查询语句被提交给SQL SERVER:

SELECT FirstName, LastName, 
Title FROM Employees WHERE City = '' 
UNION ALL SELECT OtherField FROM OtherTable WHERE ''=''

让我们看看会发生什么:数据库搜索Employees表,查找City被设置为NULL的那一行,由于它找不到哪一行city是NULL,所以它不会返回任何记录,只有我们inject的查询才会返回记录.在一些情况下,使用NULL不能成功,因为表里的却存在

有NULL的项.在这种情况下,你要做的就是构造一个表中不存在的值,你只要输入一些不普通的值...最好是对照那些正常的值,当数据库需要一个自然数时,0或者负数都工作得很好,对于一个文本参数,简单的用"NoSuchRecord","NotInTable"或更常见的"sjdajdhajsh",只要它不返回记录就好.

如果所有的web应用程序使用的SQL查询都像上面这些那么简单就好了,可惜这不可能: ].按照各个编程者习惯和查询表达式编写方式的不同,你SQL注射时可能会遇到各种困难.

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章