官术网_书友最值得收藏!

第2章 SQL注入,刺入網(wǎng)站的核心

果說數(shù)據(jù)庫是一個網(wǎng)站的心臟,那么,SQL注入攻擊絕對是一把直刺網(wǎng)站心臟的匕首,讓網(wǎng)站陷入萬劫不復之地。SQL注入(SQL Injection)攻擊,是眾多針對腳本系統(tǒng)的攻擊中最常見的一種攻擊手段,也是危害最大的一種攻擊手段。由于SQL注入攻擊的易學易用,使得網(wǎng)上各種SQL注入攻擊事件成風,對網(wǎng)站安全的危害十分嚴重。

目前,引起SQL注入的原因主要是程序員在編寫腳本程序時對特殊字符過濾不完全引起的,造成此現(xiàn)象主要是由于程序員對腳本安全的意識不夠,或者是考慮不周所造成的。因此,深入了解與SQL注入攻擊的成因及相應的攻擊手段與防范方法,對每一個網(wǎng)站安全工作者來說,都是必需的。

2.1 SQL注入的目標是數(shù)據(jù)庫

那么,究竟什么是SQL注入(SQL Injection)攻擊呢?來自官方的說法是:“當應用程序使用輸入內(nèi)容來構造動態(tài)SQL語句以訪問數(shù)據(jù)庫時,會發(fā)生SQL注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞時,也會發(fā)生SQL注入攻擊。SQL注入可能導致攻擊者能夠使用應用程序登錄,并在數(shù)據(jù)庫中執(zhí)行命令。如果應用程序使用特權過高的賬戶連接到數(shù)據(jù)庫,這種問題會變得很嚴重?!?/p>

也就是說,SQL注入攻擊是建立在網(wǎng)站數(shù)據(jù)庫上的一種攻擊方式。因此,了解一些常見的數(shù)據(jù)庫分類、數(shù)據(jù)庫執(zhí)行語句,以及數(shù)據(jù)庫在網(wǎng)站中的調(diào)用,是學習分析SQL注入攻擊的基礎。

從上面對SQL注入攻擊的解釋可以看出,SQL注入的攻擊目標就是數(shù)據(jù)庫,或者將數(shù)據(jù)庫作為跳板,進而攻擊數(shù)據(jù)庫所有的服務器。那么,要深入地了解SQL注入攻擊,就不得不對數(shù)據(jù)庫有所了解。在本節(jié)中,我們將向大家簡單介紹一些數(shù)據(jù)庫知識,為后面的SQL注入攻擊學習打下基礎。

2.1.1 數(shù)據(jù)庫就是網(wǎng)站的一切內(nèi)容

我們先來了解一下什么是“數(shù)據(jù)庫”。簡單地說,“數(shù)據(jù)庫”(database)就是為了實現(xiàn)一定的目的按某種規(guī)則組織起來的“數(shù)據(jù)”的“集合”。下面以一個很直觀的例子來說明。

每個人都有很多朋友,為了保持與他們的聯(lián)系,我們常常用一個筆記本將他們的姓名、地址、電話等信息都記錄下來,這樣要查誰的電話或地址就很方便了。這個“通訊錄”就可以看做一個最簡單的“數(shù)據(jù)庫”,每個人的姓名、地址、電話等信息就是這個數(shù)據(jù)庫中的“數(shù)據(jù)”。我們可以在筆記本這個“數(shù)據(jù)庫”中添加新朋友的個人信息,也可以由于某個朋友的電話變動而修改他的電話號碼的“數(shù)據(jù)”。

在計算機系統(tǒng)中,構成數(shù)據(jù)庫的數(shù)據(jù),并不是記錄在某個通訊錄之類的存儲上,而是作為一個數(shù)據(jù)集合,被電子化存儲在計算機的磁盤存儲系統(tǒng)中。這些數(shù)據(jù)集合,通常被保存為一個或多個彼此相關的磁盤文件。通常,就把這些文件形式存在的數(shù)據(jù)集合稱為數(shù)據(jù)庫。

對于一個網(wǎng)站來說,數(shù)據(jù)庫是必不可少的。在網(wǎng)站的數(shù)據(jù)庫中,記錄著網(wǎng)站的一切操作信息,包括新聞、文章、用戶名及密碼、商品信息、圖片分類等。數(shù)據(jù)庫對網(wǎng)站是至關重要的,可以說,網(wǎng)站的數(shù)據(jù)庫就好像網(wǎng)站的存儲器,在這個存儲器中,存儲著網(wǎng)站中的所有數(shù)據(jù)信息。一旦網(wǎng)站的數(shù)據(jù)庫遭到攻擊破壞,就會丟失網(wǎng)站新聞、文章等各種信息,可能會造成整個網(wǎng)站的崩潰!

依照數(shù)據(jù)庫中的數(shù)據(jù)關系,數(shù)據(jù)庫可分為兩類:關系(型)數(shù)據(jù)庫和面向對象數(shù)據(jù)庫。

數(shù)據(jù)庫中的數(shù)據(jù)被分門別類地存放在一些結構化的數(shù)據(jù)表(table)里,而數(shù)據(jù)表之間又往往會形成種種內(nèi)在的交叉引用關系。存在于數(shù)據(jù)表之間的這種關系(relation)的數(shù)據(jù)庫又被稱為關系(型)數(shù)據(jù)庫(Relational DataBase, RDB)。另一類數(shù)據(jù)庫被統(tǒng)稱為面向對象數(shù)據(jù)庫(object-oriented database),主要用于存儲彼此沒有內(nèi)在聯(lián)系的數(shù)據(jù)對象(而不必把它們安排到數(shù)據(jù)表里去)。

在各種網(wǎng)站中,面向對象的數(shù)據(jù)庫產(chǎn)品使用得比較少,因此本書主要涉及到的是與各網(wǎng)站安全息息相關的關系(型)數(shù)據(jù)庫。

2.1.2 明白幾個SQL中要用到的名詞

與其他計算機系統(tǒng)數(shù)據(jù)庫相似,在網(wǎng)站的數(shù)據(jù)庫中,也有一些基本的構成組件,包括數(shù)據(jù)表(table)、記錄(data record)、字段(field)、查詢(query)、SQL、索引(index)和鍵(key)等。

1.數(shù)據(jù)表(table)、記錄(data record)和字段(field)

前面已經(jīng)提到過數(shù)據(jù)表(table),即用來實際存放有關數(shù)據(jù)的框架結構(見圖1)。這種數(shù)據(jù)表里的每一行被稱為一條數(shù)據(jù)記錄(data record),簡稱“記錄”,每條記錄的結構和格式是由操作者在定義該數(shù)據(jù)表時決定的。

例如,在某個網(wǎng)站的用戶數(shù)據(jù)表里,每條數(shù)據(jù)記錄可能包含著姓氏、名字、性別、生日、電話等多個字段(field)。每個字段對自己所能存儲的信息數(shù)據(jù)類型又有著一定的要求,例如,它必須是一個指定格式的數(shù)字,或者是一個指定長度的字符或字符串等。

圖1 某網(wǎng)站數(shù)據(jù)庫中的用戶數(shù)據(jù)表結構

對一個數(shù)據(jù)庫的描述被稱為一個數(shù)據(jù)庫模型(database model),它是由這個數(shù)據(jù)庫里的全體數(shù)據(jù)表及它們所有的字段、關系和索引構成的。數(shù)據(jù)庫模型不僅要定義所涉及的各種數(shù)據(jù)結構的整體框架,還必須同時給出將存放于此的數(shù)據(jù)存儲格式。

2.查詢(query)與SQL

存儲在數(shù)據(jù)表里的數(shù)據(jù)通常沒有特定的順序,數(shù)據(jù)表里的數(shù)據(jù)通常是按照它們被錄入或修改時的順序進行排列的。因此,要想有效率地使用數(shù)據(jù)庫里的數(shù)據(jù),根據(jù)某個條件為相應的數(shù)據(jù)創(chuàng)建一個清單十分必要。

例如,在上面的數(shù)據(jù)表中,我們需要查看所有電話號碼為130開頭的用戶數(shù)據(jù),就需要創(chuàng)建一個數(shù)據(jù)清單。要創(chuàng)建數(shù)據(jù)清單,就必須構造并執(zhí)行相應的查詢(query)。查詢的結果其實也是一個數(shù)據(jù)表,只不過這個數(shù)據(jù)表將只存在于計算機的內(nèi)存中,而不是在硬盤上。

查詢(query)是通過各種SQL指令執(zhí)行的,SQL指令負責具體完成篩選和提取結果數(shù)據(jù)的工作。SQL是英文“Structured Query Language”(結構化查詢語言)的縮寫,這種語言已發(fā)展演變?yōu)槿藗冊跇嬙鞌?shù)據(jù)庫查詢命令時的一個標準。

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

隨著數(shù)據(jù)量的增加,數(shù)據(jù)表會變得越來越大,數(shù)據(jù)字段通常是按照先后順序被存入數(shù)據(jù)表的,查詢的速度往往會因為數(shù)據(jù)量而受很大的影響,因此為了提高查詢速度,需要為數(shù)據(jù)建立適當?shù)乃饕?。索引(index)是一種輔助性的數(shù)據(jù)表,它們只包含一種信息——原始數(shù)據(jù)記錄的排序情況。索引還經(jīng)常被人們稱為鍵字或鍵(key)。

索引有助于加快對數(shù)據(jù)的訪問速度,但同時也存在著一些缺點。首先,索引會增加數(shù)據(jù)庫文件在硬盤上的空間占用量。其次,索引必須隨原始數(shù)據(jù)同步更新才有實際意義,而這么做當然需要花費時間。換句話說,在讀取數(shù)據(jù)時,索引可以節(jié)約時間;但在輸入和修改數(shù)據(jù)時,索引反而會“浪費”時間。

有一種特殊的索引叫做主索引(primary index)或主鍵(primary key),它們與其他索引的區(qū)別在于,主索引必須保證每條記錄的索引值必須是獨一無二的。為了做到這一點,通常采用一個遞增的索引編號(ID編號)作為主索引。主索引在關系數(shù)據(jù)庫里扮演著一個極其重要的角色,它們可以顯著加快對數(shù)據(jù)的訪問速度。

2.1.3 SQL注入攻擊中常碰到的幾種DBMS

對于網(wǎng)站的數(shù)據(jù)庫來說,數(shù)據(jù)庫管理系統(tǒng)就是掌握數(shù)據(jù)庫功能的主宰,而攻擊者正是通過數(shù)據(jù)庫管理系統(tǒng),向網(wǎng)站發(fā)送一條條的欺騙性攻擊指令,達到攻擊網(wǎng)站的目的。

數(shù)據(jù)庫管理系統(tǒng)(Database Management System)是一種操縱和管理數(shù)據(jù)庫的軟件,是用于建立、使用和維護數(shù)據(jù)庫,簡稱DBMS。

數(shù)據(jù)庫管理系統(tǒng)對數(shù)據(jù)庫進行統(tǒng)一的管理和控制,以保證數(shù)據(jù)庫的安全性和完整性。用戶通過DBMS訪問數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫管理員也通過DBMS進行數(shù)據(jù)庫的維護工作。

數(shù)據(jù)庫數(shù)據(jù)模型結構,是數(shù)據(jù)庫管理系統(tǒng)的一個重要組成。數(shù)據(jù)庫的各種數(shù)據(jù)操作,如查找、修改、插入和刪除等,以及數(shù)據(jù)庫的維護管理,都是以數(shù)據(jù)庫模型為依據(jù)的。目前數(shù)據(jù)模型比較重要的有3種類型:分級模型、網(wǎng)絡模型和關系模型。

基于關系模型的數(shù)據(jù)庫管理系統(tǒng),被稱為關系型數(shù)據(jù)庫管理系統(tǒng)(Relational Database Management System,簡稱RDMS)。目前比較著名的數(shù)據(jù)庫管理系統(tǒng),大多是關系型數(shù)據(jù)庫管理系統(tǒng),比如Oracle、Sybase、Informix、Microsoft SQL Server、Microsoft Access、Visual FoxPro和MySQL等。

1.Microsoft SQL Server

Microsoft SQL Server是一種典型的關系型數(shù)據(jù)庫管理系統(tǒng),可以在許多操作系統(tǒng)上運行,它使用Transact-SQL語言完成數(shù)據(jù)操作。由于Microsoft SQL Server是開放式的系統(tǒng),其他系統(tǒng)可以與它進行完好的交互操作。目前,最新版本的產(chǎn)品為Microsoft SQL Server 2005,它具有可靠性、可伸縮性、可用性、可管理性等特點,可為用戶提供完整的數(shù)據(jù)庫解決方案。

SQL Server 2005是一個全面的數(shù)據(jù)庫平臺,使用集成的商業(yè)智能(BI)工具提供了企業(yè)級的數(shù)據(jù)管理。SQL Server 2005數(shù)據(jù)庫引擎為關系型數(shù)據(jù)和結構化數(shù)據(jù)提供了更安全可靠的存儲功能,使用戶可以構建和管理用于業(yè)務的高可用和高性能的數(shù)據(jù)應用程序。

SQL Server 2005數(shù)據(jù)引擎是本企業(yè)數(shù)據(jù)管理解決方案的核心。此外,SQL Server 2005還結合了分析、報表、集成和通知功能。

2.MySQL

MySQL是一個小型關系型數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中、小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中、小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫。目前Internet上流行的網(wǎng)站構架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作為操作系統(tǒng), Apache作為Web服務器,MySQL作為數(shù)據(jù)庫,PHP作為服務器端腳本解釋器。

MySQL可以使用命令行工具管理MySQL數(shù)據(jù)庫,也可以從MySQL的網(wǎng)站下載圖形管理工具MySQL Administrator和MySQL Query Browser。另外,MySQL還有一個專用的管理工具phpMyAdmin。phpMyAdmin是由PHP寫成的MySQL資料庫系統(tǒng)管理程式,讓管理者可用Web界面管理MySQL資料庫。

3.Microsoft Access

Microsoft Access是Microsoft Office組件之一,也是在Windows環(huán)境下非常流行的桌面型數(shù)據(jù)庫管理系統(tǒng)。使用Microsoft Access無須編寫任何代碼,只需通過直觀的可視化操作就可以完成大部分數(shù)據(jù)管理任務。

在Microsoft Access數(shù)據(jù)庫中,包括許多組成數(shù)據(jù)庫的基本要素。這些要素是存儲信息的表、顯示人機交互界面的窗體、有效檢索數(shù)據(jù)的查詢、信息輸出載體的報表、提高應用效率的宏、功能強大的模塊工具等。它不僅可以通過ODBC與其他數(shù)據(jù)庫相連,實現(xiàn)數(shù)據(jù)交換和共享,還可以與Word、Excel等辦公軟件進行數(shù)據(jù)交換和共享,并且通過對象鏈接與嵌入技術在數(shù)據(jù)庫中嵌入和鏈接聲音、圖像等多媒體數(shù)據(jù)。

4.Oracle

Oracle也是一個應用廣泛、功能強大的關系型數(shù)據(jù)庫管理系統(tǒng)。Oracle作為一個通用的數(shù)據(jù)庫管理系統(tǒng),不僅具有完整的數(shù)據(jù)管理功能,還是一個分布式數(shù)據(jù)庫系統(tǒng),支持各種分布式功能,特別是支持Internet應用。

作為一個應用開發(fā)環(huán)境,Oracle提供了一套界面友好、功能齊全的數(shù)據(jù)庫開發(fā)工具。Oracle使用PL/SQL語言執(zhí)行各種操作,具有可開放性、可移植性、可伸縮性等功能。特別是在最新的Oracle11g中,支持面向對象的功能,如支持類、方法、屬性等,使得Oracle產(chǎn)品成為一種對象/關系型數(shù)據(jù)庫管理系統(tǒng)。

目前,網(wǎng)上最常見的數(shù)據(jù)庫與語言網(wǎng)站構架方式有MySQL+PHP、MS SQL+PHP、ASP+MS SQL、ASP+Access、JSP+Oracle、JSP+MySQL、ASPX+Access、ASPX+MS SQL和ASPX+Access等。因此,對前面提到的這4種數(shù)據(jù)庫管理系統(tǒng),進行深入的了解是很有必要的。

2.1.4 提前了解幾條SQL注入查詢指令

通過前面的介紹,我們知道數(shù)據(jù)庫管理系統(tǒng)是通過SQL語句,執(zhí)行各種數(shù)據(jù)庫添加刪除操作及安全管理備份等功能。也就是說,數(shù)據(jù)庫是網(wǎng)站的大腦,數(shù)據(jù)庫管理系統(tǒng)就是傳導這些指令信號的神經(jīng)網(wǎng)絡,而SQL語句就像是通過神經(jīng)網(wǎng)絡傳導到大腦的一條條神經(jīng)指令,讓大腦進行信號分析從而執(zhí)行各種指令。

而攻擊者之所以能夠對網(wǎng)站進行攻擊,正是在混入神經(jīng)網(wǎng)絡中發(fā)送了一條條的欺騙性神經(jīng)指令。網(wǎng)絡入侵者最常用到的幾條欺騙性指令是哪些呢?

這里我們簡單地介紹一下,在SQL注入攻擊中最常用到的幾條SQL語句,至于每條指令的詳細執(zhí)行及功能,將在后面以實例結合進行講解。

1)數(shù)據(jù)記錄篩選語句

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

2)更新數(shù)據(jù)記錄語句

            sql="update 數(shù)據(jù)表 set 字段名=字段值 where 條件表達式"
            sql="update 數(shù)據(jù)表 set 字段1=值1,字段2=值2 …… 字段n=值n where
            條件表達式"

3)刪除添加數(shù)據(jù)記錄語句

            sql="delete from 數(shù)據(jù)表 where 條件表達式"
            sql="delete from 數(shù)據(jù)表" (將數(shù)據(jù)表所有記錄刪除)
            sql="insert into 數(shù)據(jù)表 (字段1,字段2,字段3 …) values (值1,值2,
            值3 …)"
            sql="insert into 目標數(shù)據(jù)表 select * from 源數(shù)據(jù)表" (把源數(shù)據(jù)表的
            記錄添加到目標數(shù)據(jù)表)

4)數(shù)據(jù)記錄統(tǒng)計函數(shù)

            AVG(字段名) 得出一個表格欄平均值
            COUNT(*—字段名) 對數(shù)據(jù)行數(shù)的統(tǒng)計或對某一欄有值的數(shù)據(jù)行數(shù)統(tǒng)計
            MAX(字段名) 取得一個表格欄最大的值
            MIN(字段名) 取得一個表格欄最小的值
            SUM(字段名) 把數(shù)據(jù)欄的值相加
            引用以上函數(shù)的方法:
            sql="select sum(字段名) as 別名 from 數(shù)據(jù)表 where 條件表達式"
            set rs=conn.excute(sql)
            用 rs("別名") 獲取統(tǒng)的計值,其他函數(shù)運用同上。

5)數(shù)據(jù)表的建立和刪除

            CREATE TABLE 數(shù)據(jù)表名稱(字段1 類型1(長度),字段2 類型2(長度) ……)

以上語句用于新建一個數(shù)據(jù)表,例如:CREATE TABLE tab01(name varchar(50), datetime default now())

            DROP TABLE 數(shù)據(jù)表名稱 (永久性刪除一個數(shù)據(jù)表)
主站蜘蛛池模板: 莫力| 乡宁县| 宁安市| 加查县| 本溪| 巴塘县| 民乐县| 广宗县| 桦甸市| 舒城县| 临沂市| 丰都县| 隆德县| 弥渡县| 柳江县| 平武县| 南乐县| 许昌县| 花莲市| 常德市| 瑞昌市| 安康市| 斗六市| 楚雄市| 黄石市| 澜沧| 扶绥县| 阿拉善左旗| 扎鲁特旗| 监利县| 华阴市| 厦门市| 荣昌县| 伊宁市| 肃宁县| 株洲市| 宝鸡市| 金沙县| 稷山县| 和林格尔县| 兰考县|