网站入侵与脚本攻防修炼
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 SQL注入,刺入网站的核心

果说数据库是一个网站的心脏,那么,SQL注入攻击绝对是一把直刺网站心脏的匕首,让网站陷入万劫不复之地。SQL注入(SQL Injection)攻击,是众多针对脚本系统的攻击中最常见的一种攻击手段,也是危害最大的一种攻击手段。由于SQL注入攻击的易学易用,使得网上各种SQL注入攻击事件成风,对网站安全的危害十分严重。

目前,引起SQL注入的原因主要是程序员在编写脚本程序时对特殊字符过滤不完全引起的,造成此现象主要是由于程序员对脚本安全的意识不够,或者是考虑不周所造成的。因此,深入了解与SQL注入攻击的成因及相应的攻击手段与防范方法,对每一个网站安全工作者来说,都是必需的。

2.1 SQL注入的目标是数据库

那么,究竟什么是SQL注入(SQL Injection)攻击呢?来自官方的说法是:“当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递时,也会发生SQL注入攻击。SQL注入可能导致攻击者能够使用应用程序登录,并在数据库中执行命令。如果应用程序使用特权过高的账户连接到数据库,这种问题会变得很严重。”

也就是说,SQL注入攻击是建立在网站数据库上的一种攻击方式。因此,了解一些常见的数据库分类、数据库执行语句,以及数据库在网站中的调用,是学习分析SQL注入攻击的基础。

从上面对SQL注入攻击的解释可以看出,SQL注入的攻击目标就是数据库,或者将数据库作为跳板,进而攻击数据库所有的服务器。那么,要深入地了解SQL注入攻击,就不得不对数据库有所了解。在本节中,我们将向大家简单介绍一些数据库知识,为后面的SQL注入攻击学习打下基础。

2.1.1 数据库就是网站的一切内容

我们先来了解一下什么是“数据库”。简单地说,“数据库”(database)就是为了实现一定的目的按某种规则组织起来的“数据”的“集合”。下面以一个很直观的例子来说明。

每个人都有很多朋友,为了保持与他们的联系,我们常常用一个笔记本将他们的姓名、地址、电话等信息都记录下来,这样要查谁的电话或地址就很方便了。这个“通讯录”就可以看做一个最简单的“数据库”,每个人的姓名、地址、电话等信息就是这个数据库中的“数据”。我们可以在笔记本这个“数据库”中添加新朋友的个人信息,也可以由于某个朋友的电话变动而修改他的电话号码的“数据”。

在计算机系统中,构成数据库的数据,并不是记录在某个通讯录之类的存储上,而是作为一个数据集合,被电子化存储在计算机的磁盘存储系统中。这些数据集合,通常被保存为一个或多个彼此相关的磁盘文件。通常,就把这些文件形式存在的数据集合称为数据库。

对于一个网站来说,数据库是必不可少的。在网站的数据库中,记录着网站的一切操作信息,包括新闻、文章、用户名及密码、商品信息、图片分类等。数据库对网站是至关重要的,可以说,网站的数据库就好像网站的存储器,在这个存储器中,存储着网站中的所有数据信息。一旦网站的数据库遭到攻击破坏,就会丢失网站新闻、文章等各种信息,可能会造成整个网站的崩溃!

依照数据库中的数据关系,数据库可分为两类:关系(型)数据库和面向对象数据库。

数据库中的数据被分门别类地存放在一些结构化的数据表(table)里,而数据表之间又往往会形成种种内在的交叉引用关系。存在于数据表之间的这种关系(relation)的数据库又被称为关系(型)数据库(Relational DataBase, RDB)。另一类数据库被统称为面向对象数据库(object-oriented database),主要用于存储彼此没有内在联系的数据对象(而不必把它们安排到数据表里去)。

在各种网站中,面向对象的数据库产品使用得比较少,因此本书主要涉及到的是与各网站安全息息相关的关系(型)数据库。

2.1.2 明白几个SQL中要用到的名词

与其他计算机系统数据库相似,在网站的数据库中,也有一些基本的构成组件,包括数据表(table)、记录(data record)、字段(field)、查询(query)、SQL、索引(index)和键(key)等。

1.数据表(table)、记录(data record)和字段(field)

前面已经提到过数据表(table),即用来实际存放有关数据的框架结构(见图1)。这种数据表里的每一行被称为一条数据记录(data record),简称“记录”,每条记录的结构和格式是由操作者在定义该数据表时决定的。

例如,在某个网站的用户数据表里,每条数据记录可能包含着姓氏、名字、性别、生日、电话等多个字段(field)。每个字段对自己所能存储的信息数据类型又有着一定的要求,例如,它必须是一个指定格式的数字,或者是一个指定长度的字符或字符串等。

图1 某网站数据库中的用户数据表结构

对一个数据库的描述被称为一个数据库模型(database model),它是由这个数据库里的全体数据表及它们所有的字段、关系和索引构成的。数据库模型不仅要定义所涉及的各种数据结构的整体框架,还必须同时给出将存放于此的数据存储格式。

2.查询(query)与SQL

存储在数据表里的数据通常没有特定的顺序,数据表里的数据通常是按照它们被录入或修改时的顺序进行排列的。因此,要想有效率地使用数据库里的数据,根据某个条件为相应的数据创建一个清单十分必要。

例如,在上面的数据表中,我们需要查看所有电话号码为130开头的用户数据,就需要创建一个数据清单。要创建数据清单,就必须构造并执行相应的查询(query)。查询的结果其实也是一个数据表,只不过这个数据表将只存在于计算机的内存中,而不是在硬盘上。

查询(query)是通过各种SQL指令执行的,SQL指令负责具体完成筛选和提取结果数据的工作。SQL是英文“Structured Query Language”(结构化查询语言)的缩写,这种语言已发展演变为人们在构造数据库查询命令时的一个标准。

3.索引(index)和主键(primary key)

随着数据量的增加,数据表会变得越来越大,数据字段通常是按照先后顺序被存入数据表的,查询的速度往往会因为数据量而受很大的影响,因此为了提高查询速度,需要为数据建立适当的索引。索引(index)是一种辅助性的数据表,它们只包含一种信息——原始数据记录的排序情况。索引还经常被人们称为键字或键(key)。

索引有助于加快对数据的访问速度,但同时也存在着一些缺点。首先,索引会增加数据库文件在硬盘上的空间占用量。其次,索引必须随原始数据同步更新才有实际意义,而这么做当然需要花费时间。换句话说,在读取数据时,索引可以节约时间;但在输入和修改数据时,索引反而会“浪费”时间。

有一种特殊的索引叫做主索引(primary index)或主键(primary key),它们与其他索引的区别在于,主索引必须保证每条记录的索引值必须是独一无二的。为了做到这一点,通常采用一个递增的索引编号(ID编号)作为主索引。主索引在关系数据库里扮演着一个极其重要的角色,它们可以显著加快对数据的访问速度。

2.1.3 SQL注入攻击中常碰到的几种DBMS

对于网站的数据库来说,数据库管理系统就是掌握数据库功能的主宰,而攻击者正是通过数据库管理系统,向网站发送一条条的欺骗性攻击指令,达到攻击网站的目的。

数据库管理系统(Database Management System)是一种操纵和管理数据库的软件,是用于建立、使用和维护数据库,简称DBMS。

数据库管理系统对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。

数据库数据模型结构,是数据库管理系统的一个重要组成。数据库的各种数据操作,如查找、修改、插入和删除等,以及数据库的维护管理,都是以数据库模型为依据的。目前数据模型比较重要的有3种类型:分级模型、网络模型和关系模型。

基于关系模型的数据库管理系统,被称为关系型数据库管理系统(Relational Database Management System,简称RDMS)。目前比较著名的数据库管理系统,大多是关系型数据库管理系统,比如Oracle、Sybase、Informix、Microsoft SQL Server、Microsoft Access、Visual FoxPro和MySQL等。

1.Microsoft SQL Server

Microsoft SQL Server是一种典型的关系型数据库管理系统,可以在许多操作系统上运行,它使用Transact-SQL语言完成数据操作。由于Microsoft SQL Server是开放式的系统,其他系统可以与它进行完好的交互操作。目前,最新版本的产品为Microsoft SQL Server 2005,它具有可靠性、可伸缩性、可用性、可管理性等特点,可为用户提供完整的数据库解决方案。

SQL Server 2005是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理。SQL Server 2005数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。

SQL Server 2005数据引擎是本企业数据管理解决方案的核心。此外,SQL Server 2005还结合了分析、报表、集成和通知功能。

2.MySQL

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中、小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中、小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统, Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。

MySQL可以使用命令行工具管理MySQL数据库,也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。另外,MySQL还有一个专用的管理工具phpMyAdmin。phpMyAdmin是由PHP写成的MySQL资料库系统管理程式,让管理者可用Web界面管理MySQL资料库。

3.Microsoft Access

Microsoft Access是Microsoft Office组件之一,也是在Windows环境下非常流行的桌面型数据库管理系统。使用Microsoft Access无须编写任何代码,只需通过直观的可视化操作就可以完成大部分数据管理任务。

在Microsoft Access数据库中,包括许多组成数据库的基本要素。这些要素是存储信息的表、显示人机交互界面的窗体、有效检索数据的查询、信息输出载体的报表、提高应用效率的宏、功能强大的模块工具等。它不仅可以通过ODBC与其他数据库相连,实现数据交换和共享,还可以与Word、Excel等办公软件进行数据交换和共享,并且通过对象链接与嵌入技术在数据库中嵌入和链接声音、图像等多媒体数据。

4.Oracle

Oracle也是一个应用广泛、功能强大的关系型数据库管理系统。Oracle作为一个通用的数据库管理系统,不仅具有完整的数据管理功能,还是一个分布式数据库系统,支持各种分布式功能,特别是支持Internet应用。

作为一个应用开发环境,Oracle提供了一套界面友好、功能齐全的数据库开发工具。Oracle使用PL/SQL语言执行各种操作,具有可开放性、可移植性、可伸缩性等功能。特别是在最新的Oracle11g中,支持面向对象的功能,如支持类、方法、属性等,使得Oracle产品成为一种对象/关系型数据库管理系统。

目前,网上最常见的数据库与语言网站构架方式有MySQL+PHP、MS SQL+PHP、ASP+MS SQL、ASP+Access、JSP+Oracle、JSP+MySQL、ASPX+Access、ASPX+MS SQL和ASPX+Access等。因此,对前面提到的这4种数据库管理系统,进行深入的了解是很有必要的。

2.1.4 提前了解几条SQL注入查询指令

通过前面的介绍,我们知道数据库管理系统是通过SQL语句,执行各种数据库添加删除操作及安全管理备份等功能。也就是说,数据库是网站的大脑,数据库管理系统就是传导这些指令信号的神经网络,而SQL语句就像是通过神经网络传导到大脑的一条条神经指令,让大脑进行信号分析从而执行各种指令。

而攻击者之所以能够对网站进行攻击,正是在混入神经网络中发送了一条条的欺骗性神经指令。网络入侵者最常用到的几条欺骗性指令是哪些呢?

这里我们简单地介绍一下,在SQL注入攻击中最常用到的几条SQL语句,至于每条指令的详细执行及功能,将在后面以实例结合进行讲解。

1)数据记录筛选语句

            sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
            sql="select * from 数据表 where 字段名 like ' %字段值%' order by
            字段名 [desc]"
            sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
            sql="select * from 数据表 where 字段名 in (’值1' , ’值2' , ’值3' )"
            sql="select * from 数据表 where 字段名 between 值1 and 值2"

2)更新数据记录语句

            sql="update 数据表 set 字段名=字段值 where 条件表达式"
            sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where
            条件表达式"

3)删除添加数据记录语句

            sql="delete from 数据表 where 条件表达式"
            sql="delete from 数据表" (将数据表所有记录删除)
            sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,
            值3 …)"
            sql="insert into 目标数据表 select * from 源数据表" (把源数据表的
            记录添加到目标数据表)

4)数据记录统计函数

            AVG(字段名) 得出一个表格栏平均值
            COUNT(*—字段名) 对数据行数的统计或对某一栏有值的数据行数统计
            MAX(字段名) 取得一个表格栏最大的值
            MIN(字段名) 取得一个表格栏最小的值
            SUM(字段名) 把数据栏的值相加
            引用以上函数的方法:
            sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
            set rs=conn.excute(sql)
            用 rs("别名") 获取统的计值,其他函数运用同上。

5)数据表的建立和删除

            CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) ……)

以上语句用于新建一个数据表,例如:CREATE TABLE tab01(name varchar(50), datetime default now())

            DROP TABLE 数据表名称 (永久性删除一个数据表)