首页 > 安全 > 网站安全 >

SQL盲注攻击技术综述

2008-05-27

1 SQL盲注攻击技术综述 JavaphileSQL盲注攻击技术综述coolswallow of Javaphile (coolswallow@shaolin.org.cn)Blind SQL Injection Techniques: A SurveyAbstract: This paper gives a survey of current Blind SQL Injection Techniques

1 SQL盲注攻击技术综述 Javaphile
SQL盲注攻击技术综述
coolswallow of Javaphile (coolswallow@shaolin.org.cn)
Blind SQL Injection Techniques: A Survey
Abstract: This paper gives a survey of current Blind SQL Injection Techniques. It first introduces the definition
of SQL Injection and its risk, and reviews several solutions proposed to solve the problem and their each
disadvantages. Then, the paper discusses that if detailed error messages are suppressed, how to identify SQL
Injections based on minimal reaction of the server, and how to identify SQL Injection vulnerable parameters, to
generate valid injection syntax and to build the required exploit. At last, an injection of union select statements
is described in detail, including how to count the columns and how to identify columns types. Although the
provided examples in the paper refer to Microsoft SQL Server and Oracle only, the same techniques can be applied
to other Databases as well. By the paper, we hope to make it clear that application level vulnerabilities must be
handled by application level solutions, and that relying on suppressed error messages for protection from SQL
Injection is eventually useless.
Key words: SQL Injection; Blind Injection; Database Attack; Web Application Security
摘 要: 本文对目前SQL注入攻击中使用的盲注技术进行了综述.本文首先介绍了普通SQL注入技术的定义和
危害,回顾了几种已被提出的针对SQL注入的防御手段及其各自的缺点,然后讨论了在错误信息被屏蔽或掩饰
的情况下探测SQL注入漏洞是否存在所需的服务器最小响应,以及如何确定注入点和确定正确的注入句法并构
造利用代码.最后本文还以union select语句为例,详细介绍了利用该语句在盲注条件下统计数据表的列数
和判断列的数据类型的方法和步骤.本文中给出的例子都是针对Microsoft SQL Server和Oracle的,但同样的技
术也可以被应用到其他数据库系统.本文的目的是明确应用程序级别的漏洞只能通过应用程序级别的方案才能解
决,仅仅依靠屏蔽错误信息来回避SQL注入攻击是无益的.
关键词: SQL注入;盲注;数据库攻击;网络应用程序安全
1 简介
1.1 普通SQL注入技术概述
目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]:
(1) 脚本注入式的攻击
(2) 恶意用户输入用来影响被执行的SQL脚本
根据Chris Anley的定义[2], 当一个攻击者通过在查询语句中插入一系列的SQL语句来将数据写入到应用
程序中,这种方法就可以定义成SQL注入.Stephen Kost[3]给出了这种攻击形式的另一个特征,"从一个数据
库获得未经授权的访问和直接检索",SQL注入攻击就其本质而言,它利用的工具是SQL的语法,针对的是
应用程序开发编程过程中的漏洞,"当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注
入攻击就发生了".实际上,SQL注入是存在于常见的多连接的应用程序中一种漏洞,攻击者通过在应用程
序中预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询.这类
应用程序一般是网络应用程序(Web Application),它允许用户输入查询条件,并将查询条件嵌入SQL请求语句
coolswallow:SQL盲注攻击技术综述 2
中,发送到与该应用程序相关联的数据库服务器中去执行.通过构造一些畸形的输入,攻击者能够操作这种
请求语句去获取预先未知的结果.
在风险方面,SQL注入攻击是位居前列的,与缓冲区溢出等漏洞基本相当.而且如果要实施缓冲区溢出
攻击,攻击者必须首先能绕过站点的防火墙;而对于SQL注入攻击,由于防火墙为了使用户能访问网络应用
程序,必须允许从Internet到Web服务器的正向连接,因此一旦网络应用程序有注入漏洞,攻击者就可以直
接访问数据库进而甚至能够获得数据库所在的服务器的访问权,因此在某些情况下,SQL注入攻击的风险要
高于所有其他漏洞.
SQL注入攻击利用的是SQL语法,这使得这种攻击具有广泛性.理论上说,对于所有基于SQL语言标
准的数据库软件包括SQL Server,Oracle,MySQL, DB2,Informix等以及与之连接的网络应用程序包括
Active/Java Server Pages, Cold Fusion Management, PHP或Perl等都是有效的.当然各种软件有自身的特点,
实际的攻击代码可能不尽相同.SQL注入攻击的原理相对简单,且各类基于数据库系统的应用程序被广泛使
用,介绍注入漏洞和利用方法的公开出版物也大量问世,造成近年SQL注入攻击的数量一直增长,注入攻击
的形式也有被滥用的趋势.
关于针对MS SQL Server的普通SQL注入技术的详细介绍,可以参考Chris Anley所撰的"SQL Server应用
程序中的高级SQL注入"[2]一文和其后续"更多的高级SQL注入"[4],Cesar Cerrundo所撰的"利用SQL注入
操纵Microsoft SQL Server" [5]一文,以及SPI实验室的Kevin Spett撰写的白皮书"SQL注入 - 你的网络应用
程序是否会受攻击 " [6];而针对Oracle的普通SQL注入技术介绍,可以参考Stephen Kost的"针对Oracle开发
人员的SQL注入攻击简介"[3]一文.
1.2 SQL注入攻击的防御手段
由于越来越多的攻击利用了SQL注入技术,也随之产生了很多试图解决注入漏洞的方案.目前被提出的
方案有:
(1) 在服务端正式处理之前对提交数据的合法性进行检查;
(2) 封装客户端提交信息;
(3) 替换或删除敏感字符/字符串;
(4) 屏蔽出错信息.
方案(1)被公认是最根本的解决方案,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作,
不过这需要开发者能够以一种安全的方式来构建网络应用程序,虽然已有大量针对在网络应用程序开发中如
何安全地访问数据库的文档出版,但仍然有很多开发者缺乏足够的安全意识,造成开发出的产品中依旧存在
注入漏洞;方案(2)的做法需要RDBMS的支持,目前只有Oracle采用该技术;方案(3)则是一种不完全的解决
措施,例如,当客户端的输入为"…ccmdmcmdd…"时,在对敏感字符串"cmd"替换删除以后,剩下的字符
正好是"…cmd…";方案(4)是目前最常被采用的方法,很多安全文档都认为SQL注入攻击需要通过错误信
息收集信息,有些甚至声称某些特殊的任务若缺乏详细的错误信息则不能完成,这使很多安全专家形成一种
观念,即注入攻击在缺乏详细错误的情况下不能实施.
而实际上,屏蔽错误信息是在服务端处理完毕之后进行补救,攻击其实已经发生,只是企图阻止攻击者
知道攻击的结果而已.本文所介绍SQL盲注技术就是一些攻击者使用的新技术,其在错误信息被屏蔽的情况
下使攻击者仍能获得所需的信息,并继续实施注入攻击.
1.3 本文的结构组织
为了理解盲注攻击,我们首先将介绍确定SQL注入漏洞所需的服务器的最小响应;其次,我们将构造一
个合乎语法的SQL请求,并可以将之替换成任何有效的SQL请求;最后,我们将讨论在没有详细错误信息
的情况下如何利用union select语句.本文所讨论的盲注攻击的条件是我们在攻击前对网络应用程序,
数据库类型,表结构等等信息都一无所知,这些信息都需要在注入的过程中通过探测获得.
coolswallow:SQL盲注攻击技术综述 3
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错误会发生什么情况.
热点推荐