手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

SQL盲注攻击技术综述

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

正好是“…cmd…”;方案(4)是现在最常被采用的方法,很多安全文档都认为SQL注入攻击需要通过错误信
息收集信息,有些甚至声称某些特别的任务若缺乏周详的错误信息则不能完成,这使很多安全专家形成一种
观念,即注入攻击在缺乏周详错误的情况下不能实施。
而实际上,屏蔽错误信息是在服务端处理完毕之后进行补救,攻击其实已发生,只是企图阻止攻击者
知道攻击的结果而已。本文所介绍SQL盲注技术就是一些攻击者使用的新技术,其在错误信息被屏蔽的情况
下使攻击者仍能获得所需的信息,并继续实施注入攻击。

1.3 本文的结构组织
为了理解盲注攻击,我们首先将介绍确定SQL注入漏洞所需的服务器的最小响应;其次,我们将构造一
个合乎语法的SQL请求,并能够将之替换成任何有效的SQL请求;最后,我们将讨论在没有周详错误信息
的情况下如何利用UNION SELECT语句。本文所讨论的盲注攻击的条件是我们在攻击前对网络应用程式、
数据库类型、表结构等等信息都一无所知,这些信息都需要在注入的过程中通过探测获得。

2 确定注入漏洞
要进行SQL注入攻击,首先当然是确认要攻击的网络应用程式存在注入漏洞,因此攻击者首先必须能确
立一些和服务器产生的错误相关的提示类型。尽管错误信息本身已被屏蔽,网络应用程式仍然具备能区分正
确请求和错误请求的能力,攻击者只需要学习去识别这些提示,寻找相关错误,并确认其是否和SQL相关。

2.1 识别错误
一个网络应用程式主要会产生两种类型的错误,第一种是由Web服务器产生的代码异常(exception),类
似于“500:Internal Server Error”,通常假如SQL注入语句出现语法错误,比如出现未闭合的引号,就会使服
务器抛出这类异常。假如要屏蔽该类错误,一般会采用将默认的错误信息替换成一个事先定制的HTML页面,
但只要观察到有这种响应出现,就能够确认其实是发生了服务器错误。在其他情况下,为了进一步屏蔽该类
错误,有些服务器一出现异常,会简单地跳转到主页面或前一个访问过的页面, 或显示一条简单的错误消
息但不提供任何细节。
第二类错误是由应用程式代码产生的,这代表其研发者有较好的编程习惯。这类应用程式考虑到可能会
出现一些无效的情况,并分别为之产生了一个特定的错误信息。尽管出现这类错误一般会返回一个请求有效
的响应(200 OK),但页面仍然会跳转到主页面,或采用某种隐藏信息的办法,类似于“Internal Server Error”。
为了区分这两种错误,我们看一个例子:有两个电子商务的应用程式,A和B,两个应用程式都使用同
一个叫proddetails.asp的页面,该页面期待获得一个参数,叫ProdID。他获取该参数后,从数据库中提取相
应的产品周详信息数据,然后对返回的结果进行一些处理。两个应用程式都是通过一个产品列表页面上的链
接调用proddetails.asp,因此能确保ProdID一直都是存在且有效的。应用程式A认为这样就不会出现问题,
因此对参数不做额外的检查,而假如攻击者篡改了ProdID,插入了一个在数据表中不存在的id,数据库就会
返回一个空记录。由于应用程式A没有料到可能会出现空记录,当他试图去处理该记录中的数据时,就可能
会出现异常,产生一个“500:Internal Server Error”。而应用程式B,会在对记录进行处理前确认记录的大小
超过0,假如是空记录,则会出现一个错误提示“该产品不存在”,或研发者为了隐藏该错误,会将页面重
新定位到产品的列表页面。
因此攻击者为了进行SQL盲注,会首先尝试提交一些无效的请求,并观察应用程式如何处理这些错误,
连同假如出现SQL错误会发生什么情况。

2.2 定位错误
对要攻击的应用程式有了初步的认识后,攻击者会试图定位由人为构造的输入而产生的错误信息。这时,
攻击者就会使用标准的SQL注入测试技术,比如添加一些SQL关键字(如OR,AND等)和一些META字
符(如;或’等)。每一个参数都被单独地进行测试,而获得的响应将被检验用来判断是否产生了错误。通过一
个拦截代理服务器(intercepting proxy)或类似的工具能够方便地识别页面跳转和其他一些可预测的隐藏错
误,而任何一个返回错误的参数都有可能存在SQL注入漏洞。而在单独测试每个参数过程中,必须确保其他
参数都是有效的,因为需要避免除注入以外任何其他可能的原因所导致的错误影响了判断结果。测试的结果
一般是个可疑参数的列表,列表中的一些参数可能的确能够进行注入利用,另外一些参数则可能是由一些
SQL无关的错误所造成,因此需要被剔除。攻击者接下来就需要从这些参数中挑选真正存在注入漏洞的参数,
我们称之为确定注入点。

2.3 确定注入点
SQL字段能够被划分为三个主要类型:数字、字符串和日期。虽然每个类型都有其特点,但却和注入的
过程无关。每一个从网络应用程式提交给SQL查询的参数都属于以上三个类型中的一类,其中数字参数被直
接提交给服务器,而字符串和日期则需要加上引号才被提交,例如:
SELECT * FROM Products WHERE ProdID = 4

SELECT * FROM Products WHERE ProdName = 'Book'
而SQL服务器,并不关心他接受到的是什么类型的参数表达式,只要该表达式是相关的类型即可。而这个特
点则使攻击者能够很容易地确认一个错误是否和SQL相关。假如是数字类型,最简单的处理办法是使用基本
的算术操作,例如以下请求:
/mysite/proddetails.asp?ProdID=4
测试该参数的一种办法是插入4’作为参数,另一种是使用3 1作为参数,假设这两个参数已直接被提交给SQL
请求语句,则将形成以下两个SQL请求语句:
(1) SELECT * FROM Products WHERE ProdID = 4'
(2) SELECT * FROM Products WHERE ProdID = 3 1
第一个SQL语法有问题,将一定会产生一个错误,而第二个假如被顺利地执行,返回和最初的请求(即ProdID
等于4)相同的产品信息,这就提示该参数是存在注入漏洞的。
类似的技术能够被应用于用一个符合SQL语法的字符串表达式替换该参数,这里有两个区别:第一,字
符串表示式是放在引号中的,因此需要阻断引号;第二,不同的SQL服务器连结字符串的语法不同,比如
MS SQL Server使用符号 来连结字符串,而Oracle使用符号||来连结。例如以下请求:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!