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注入技术概述
[1]
现在没有对SQL注入技术的标准定义,微软中国技术中央从2个方面进行了描述:
(1) 脚本注入式的攻击
(2) 恶意用户输入用来影响被执行的SQL脚本
[2]
根据Chris Anley的定义, 当一个攻击者通过在查询语句中插入一系列的SQL语句来将数据写入到应用
[3]
程式中,这种方法就能够定义成SQL注入。Stephen Kost给出了这种攻击形式的另一个特征,“从一个数据
库获得未经授权的访问和直接检索”,SQL注入攻击就其本质而言,他利用的工具是SQL的语法,针对的是
应用程式研发者编程过程中的漏洞,“当攻击者能够操作数据,往应用程式中插入一些SQL语句时,SQL注
入攻击就发生了”。实际上,SQL注入是存在于常见的多连接的应用程式中一种漏洞,攻击者通过在应用程
序中预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。这类
应用程式一般是网络应用程式(Web Application),他允许用户输入查询条件,并将查询条件嵌入SQL请求语句
中,发送到和该应用程式相关联的数据库服务器中去执行。通过构造一些畸形的输入,攻击者能够操作这种
请求语句去获取预先未知的结果。
在风险方面,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应用
[2][4]
程式中的高级SQL注入”一文和其后续“更多的高级SQL注入”,Cesar Cerrundo所撰的“利用SQL注入
[5]
操纵Microsoft SQL Server”一文,连同SPI实验室的Kevin Spett撰写的白皮书“SQL注入 – 您的网络应用
[6]
程式是否会受攻击?”;而针对Oracle的普通SQL注入技术介绍,能够参考Stephen Kost的“针对Oracle研发
[3]
人员的SQL注入攻击简介”一文。

1.2 SQL注入攻击的防御手段
由于越来越多的攻击利用了SQL注入技术,也随之产生了很多试图解决注入漏洞的方案。现在被提出的
方案有:
(1) 在服务端正式处理之前对提交数据的合法性进行检查;
(2) 封装客户端提交信息;
(3) 替换或删除敏感字符/字符串;
(4) 屏蔽出错信息。
方案(1)被公认是最根本的解决方案,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作,
但是这需要研发者能够以一种安全的方式来构建网络应用程式,虽然已有大量针对在网络应用程式研发中如
何安全地访问数据库的文档出版,但仍然有很多研发者缺乏足够的安全意识,造成研发出的产品中依旧存在
注入漏洞;方案(2)的做法需要RDBMS的支持,现在只有Oracle采用该技术;方案(3)则是一种不完全的解决
措施,例如,当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”替换删除以后,剩下的字符

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