資源描述:
《SQL注入攻擊和其防御策略研究》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、SQL注入攻擊和其防御策略研究摘要:隨著互聯(lián)網(wǎng)Web應(yīng)用的飛速發(fā)展,黑客攻擊的手段也在不斷翻新,各種新的攻擊技術(shù)層出不窮。SQL注入攻擊是黑客對(duì)Web應(yīng)用進(jìn)行攻擊的常用手段之一。以ASP和SQLServer為例詳細(xì)闡述了SQL注入攻擊的基本原理和過程,并從Web應(yīng)用生命周期的各個(gè)環(huán)節(jié)出發(fā),綜合探討防御SQL注入攻擊的有效方法和策略。關(guān)鍵詞:SQL注入;參數(shù)化查詢;滲透測(cè)試;Web應(yīng)用防火墻中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2013)05-1000-02隨著互聯(lián)網(wǎng)Web應(yīng)用的飛速發(fā)展,
2、各類Web網(wǎng)站大量涌現(xiàn)。在這種互聯(lián)性和開放性壞境下,各種Web應(yīng)用系統(tǒng)的復(fù)雜性和多樣性導(dǎo)致了系統(tǒng)漏洞層出不窮,黑客入侵和篡改網(wǎng)站的安全事件時(shí)有發(fā)生。SQL注入作為直接威脅Web應(yīng)用的最常見的網(wǎng)絡(luò)攻擊手段之一,一直受到網(wǎng)站開發(fā)人員和管理人員的關(guān)注。如何有效防御SQL注入攻擊是近年來人們討論的熱點(diǎn)問題。SQL注入是針對(duì)ASP、PHP、JSP等腳本建站語(yǔ)言的一種入侵手段,理論上它對(duì)所有基于SQL語(yǔ)言標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)軟件包括SQLServer>Oracle>MySQL、Access等都是有效的。該文以ASP和SQLServer
3、為例闡述SQL注入攻擊的基本原理和過程,并從Web應(yīng)用生命周期的各個(gè)環(huán)節(jié)深入探討防御SQL注入攻擊的有效方法和策略。1SQL注入攻擊的原理和過程所謂SQL注入攻擊[1],就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串中,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容被直接用來構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊。SQL注入過程中,攻擊者通過從客戶端提交構(gòu)造巧妙的SQL代碼,收集服務(wù)器返回的結(jié)果信息,從而獲取想要得到的資料并
4、實(shí)施攻擊。下面以HTTP://xxx.xxx.xxx/abc.asp?id=25作為測(cè)試URL討論SQL注入攻擊的一般過程。1)檢測(cè)是否有注入漏洞。最簡(jiǎn)單的方法就是在測(cè)試URL的末尾附加一個(gè)單引號(hào),提交頁(yè)面請(qǐng)求后查看服務(wù)器的響應(yīng)情況。如果返回錯(cuò)誤信息,則證明程序沒有對(duì)單引號(hào)進(jìn)行過濾,有可能存在注入漏洞。當(dāng)然,以上方法對(duì)那些實(shí)現(xiàn)單引號(hào)過濾的應(yīng)用程序不起作用,此時(shí)可以使用下面方法進(jìn)行檢測(cè)。在測(cè)試URL的后面分別加上“and1=1”和“and1=2”兩種注入?yún)?shù)并提交請(qǐng)求,若前者測(cè)試的返回結(jié)果為正常頁(yè)面,而后者測(cè)試的返回
5、結(jié)果為錯(cuò)誤信息,則說明可以進(jìn)行注入。其原理在于若后臺(tái)程序存在注入漏洞,提交第一種參數(shù)則會(huì)構(gòu)成SQL語(yǔ)句"select*from表名whereid二25and1=1”,由于邏輯正確服務(wù)器將返回正常頁(yè)面;提交第二種參數(shù)則會(huì)構(gòu)成SQL語(yǔ)句"select*from表名whereid二25and1=2”,由于邏輯錯(cuò)誤服務(wù)器會(huì)返回錯(cuò)誤信息。上例只是注入?yún)?shù)為數(shù)字型的檢測(cè)方法,實(shí)際應(yīng)用時(shí)還可以使用字符型和搜索型參數(shù)進(jìn)行檢測(cè)。2)判斷數(shù)據(jù)庫(kù)類型。一般與ASP最常搭配的數(shù)據(jù)庫(kù)是Access和SQLServer,判斷時(shí)可以從Acces
6、s和SQLServer的區(qū)別入手:Access的系統(tǒng)表是msysobjects,且在Web環(huán)境下沒有訪問權(quán)限;而SQLServer的系統(tǒng)表是sysobjects,在Web環(huán)境下可以被訪問。由此,可在測(cè)試URL的尾部注入?yún)?shù)uand(selectcount(*)fromsysobjects)>0”并提交,如果返回正常頁(yè)面,基本上可以斷定是SQLServer數(shù)據(jù)庫(kù);如果返回錯(cuò)誤信息,則可以斷定是Access數(shù)據(jù)庫(kù)。3)破解數(shù)據(jù)庫(kù)名。在注入點(diǎn)之后附加參數(shù)“and(selectcount(*)frommaster.dbo.
7、sysdatabaseswherename>landdbid=6)0"并提交,由于name字段是一個(gè)字符型字段,因此abc.asp工作異常,通過返回的錯(cuò)誤信息可得到第一個(gè)數(shù)據(jù)庫(kù)名。同理將dbid的值分別改成7、8、9……,就可得到所有數(shù)據(jù)庫(kù)名。除此之外也可以通過注入?yún)?shù)uanddb_name()>0來獲取連接數(shù)據(jù)庫(kù)的名稱。以下假設(shè)得到的數(shù)據(jù)庫(kù)名是TestDBo2)猜解用戶名表的名稱。Web用戶的賬號(hào)一般存放在一張表中,為了獲取數(shù)據(jù)庫(kù)的訪問權(quán)限,需要分析可能存放用戶名與密碼的表的名稱。常用的方法有猜解法和讀取法:猜解
8、法根據(jù)個(gè)人的經(jīng)驗(yàn)猜表名,通過在注入點(diǎn)后附加參數(shù)"and(selectcount(*)fromTestDB.dbo.表名)>0"實(shí)現(xiàn);讀取法通過構(gòu)造注入?yún)?shù)訪問SQLServer的系統(tǒng)表sysobjects來實(shí)現(xiàn)。以下假設(shè)此表名為admino3)猜解用戶名字段及密碼字段的名稱。在注入點(diǎn)之后附加參數(shù)“and(selecttop1col_name(object_i