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

第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 數據表名稱 (永久性刪除一個數據表)
主站蜘蛛池模板: 黄浦区| 彰武县| 昌黎县| 娱乐| 新巴尔虎左旗| 隆化县| 高安市| 睢宁县| 滦平县| 葵青区| 石屏县| 宜黄县| 阳泉市| 界首市| 都兰县| 沿河| 昌都县| 叶城县| 虞城县| 桑植县| 冕宁县| 梅河口市| 北辰区| 策勒县| 许昌市| 泸水县| 昌吉市| 河南省| 海淀区| 盐亭县| 曲阜市| 白河县| 寿宁县| 固安县| 扎囊县| 永和县| 大宁县| 彰化市| 余庆县| 仁布县| 郧西县|