◆趙少飛 楊 帆 田國敏
(陜西省網(wǎng)絡(luò)與信息安全測評中心 陜西 710065)
伴隨信息時代科技水平的不斷發(fā)展,云計算、大數(shù)據(jù)等技術(shù)應(yīng)運(yùn)而生,B/S模式的應(yīng)用系統(tǒng)在不同領(lǐng)域得到廣泛應(yīng)用,使用這種模式編寫應(yīng)用程序的程序員也越來越多。但是由于程序員的水平及經(jīng)驗(yàn)也參差不齊,相當(dāng)大一部分程序員在編寫代碼的時候,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。越來越多的惡意攻擊者利用應(yīng)用程序存在的隱患肆意攻擊應(yīng)用程序,使應(yīng)用系統(tǒng)的安全受到了嚴(yán)重的威脅。其中,最致命的攻擊之一就是SQL注入。
SQL注入(SQL Injection)是Web應(yīng)用程序面臨的一種注入攻擊,可以執(zhí)行惡意SQL語句。它通過將任意SQL代碼插入數(shù)據(jù)庫查詢,使攻擊者能夠完全控制Web應(yīng)用程序后面的數(shù)據(jù)庫服務(wù)器。攻擊者可以使用SQL注入漏洞繞過應(yīng)用程序安全措施;可以繞過網(wǎng)頁或Web應(yīng)用程序的身份驗(yàn)證和授權(quán),并檢索整個SQL數(shù)據(jù)庫的內(nèi)容;還可以使用SQL注入來添加、修改和刪除數(shù)據(jù)庫中的記錄。
由于SQL注入一般發(fā)生在B/S結(jié)構(gòu)的應(yīng)用程序上,而這些應(yīng)用程序大部分屬于互聯(lián)網(wǎng)上的web站點(diǎn),因此依據(jù)SQL注入形成的原因,將SQL注入進(jìn)行以下分類。
(1)數(shù)字型注入點(diǎn)
當(dāng)輸入?yún)?shù)為數(shù)字類型時,例如頁碼、ID等,存在注入時則為數(shù)字類型的注入。這類注入方式常見于PHP和ASP等弱類型語言中,弱類型語言會自動推導(dǎo)數(shù)據(jù)類型,例如輸入的ID的值為1時,會自動推導(dǎo)出ID的數(shù)據(jù)類型為int型,當(dāng)輸入的ID的值為1 and 1=2時,會自動推導(dǎo)出ID的數(shù)據(jù)類型為string型,但JAVA或者C#這類強(qiáng)類型語言并沒有這樣的特性,int型強(qiáng)制轉(zhuǎn)換成string型時,會拋出異常,注入失敗,所以這類注入方式常見于弱類型語言中。
(2)字符型注入點(diǎn)
當(dāng)輸入?yún)?shù)為字符類型時,則為字符類型的注入,其與數(shù)字類型的注入的區(qū)別在于:注入時需要使用單引號來閉合。這一類的SQL語句原型大概為select*from表名where name='admin',注入時需要單引號閉合,注入的數(shù)據(jù)應(yīng)為admin’and 1=1--,合并為sql則為select*from user where name=‘a(chǎn)dmin’and 1=1–‘。
(3)搜索型注入點(diǎn)
這是一類特殊的注入類型。這類注入主要是指在進(jìn)行數(shù)據(jù)搜索時沒過濾搜索參數(shù),一般在鏈接地址中有"keyword=關(guān)鍵字",有的不顯示在的鏈接地址里面,而是直接通過搜索框表單提交。此類注入點(diǎn)提交的SQL語句,其原形大致為:select*from 表名where字段 like'%關(guān)鍵字%',若存在注入,我們可以構(gòu)造出類似與如下的sql注入語句進(jìn)行爆破:select*from 表名 where字段like'%測試%'and'%1%'='%1%'。
(1)GET注入
提交數(shù)據(jù)的方式是GET,注入點(diǎn)的位置在GET參數(shù)部分。
(2)POST注入
使用POST方式提交數(shù)據(jù),注入點(diǎn)位置在POST數(shù)據(jù)部分,常發(fā)生在表單中。
(3)Cookie注入
HTTP請求的時候會帶上客戶端的Cookie,注入點(diǎn)存在Cookie當(dāng)中的某個字段中。
(4)HTTP頭部注入
注入點(diǎn)在HTTP請求頭部的某個字段中。例如存在User-Agent字段中。
(1)基于布爾的盲注
即可以根據(jù)返回頁面判斷條件真假的注入。
(2)基于時間的盲注
即不能根據(jù)頁面返回內(nèi)容判斷任何信息,而是用條件語句查看時間延遲語句是否執(zhí)行(即頁面返回時間是否增加)來判斷。
(3)基于報錯注入
即頁面會返回錯誤信息,或者把注入的語句的結(jié)果直接返回在頁面中。
SQL注入利用的是正常HTTP服務(wù)端口,表面上看和正常的HTTP訪問沒有任何區(qū)別,隱蔽性強(qiáng)。
第一步:判斷web站點(diǎn)是否可以進(jìn)行SQL注入,如果web站點(diǎn)的URL只對網(wǎng)頁進(jìn)行訪問,是不存在SQL注入的可能,只有對數(shù)據(jù)庫進(jìn)行動態(tài)查詢的URL才會存在SQL注入的可能,例如http://www.xxx.com/test.php?id=1,其中id=1表示會對數(shù)據(jù)庫進(jìn)行動態(tài)查詢,存在SQL注入可能性。
第二步:尋找注入點(diǎn),構(gòu)造SQL注入語句。判斷出web站點(diǎn)可以進(jìn)行SQL注入后,就需要尋找站點(diǎn)可利用的注入漏洞,通過輸入一些特殊字符,查看瀏覽器返回的數(shù)據(jù),判斷數(shù)據(jù)庫類型,進(jìn)一步構(gòu)造數(shù)據(jù)庫查詢語句找到注入點(diǎn)。
第三步:猜測數(shù)據(jù)庫表名、用戶名和密碼。數(shù)據(jù)庫中的表名、字段名都有一定的規(guī)律,通過構(gòu)造特殊的數(shù)據(jù)查詢語句,利用SQL注入工具依次查找數(shù)據(jù)庫名、表名、字段名、用戶名和密碼長度。一般查詢的密碼都進(jìn)行MD5加密,需要借助解密工具對MD5密碼進(jìn)行解密,就可以得到用戶名和密碼。
第四步:尋找web站點(diǎn)的管理后臺。利用站點(diǎn)目錄掃描工具或后臺掃描工具對web站點(diǎn)進(jìn)行掃描,查找出web后臺的登錄路徑,并依次進(jìn)行嘗試,找到web站點(diǎn)的后臺入口地址。
第五步:入侵和破壞。成功登錄后臺管理后,可以進(jìn)行篡改網(wǎng)頁、上傳木馬、修改用戶信息等操作,也可以進(jìn)一步入侵?jǐn)?shù)據(jù)庫服務(wù)器。
SQL注入的基本原理就是在網(wǎng)站頁面提交欺騙性的數(shù)據(jù),用于欺騙網(wǎng)站后臺構(gòu)造的非法SQL語句并執(zhí)行。明晰SQL注入的原理,針對SQL注入提出一些措施進(jìn)行防范。
對用戶輸入網(wǎng)頁的數(shù)據(jù)進(jìn)行正則表達(dá)式校驗(yàn),包括對單引號和雙"-"進(jìn)行轉(zhuǎn)換,進(jìn)而校驗(yàn)輸入數(shù)據(jù)中是否包含SQL語句的保留字,如:where,when,drop等。對用戶輸入數(shù)據(jù)進(jìn)行嚴(yán)格限制,可以有效防范SQL注入攻擊。
SQL注入之所以能成功的原因是從數(shù)據(jù)庫中取出的數(shù)據(jù)以及用戶輸入的數(shù)據(jù)均是字符型數(shù)據(jù),這些字符型數(shù)據(jù)與SQL語句混合在一起且沒有明確的界限,從而使DBMS在執(zhí)行相應(yīng)SQL語句時誤將數(shù)據(jù)中的部分字符作為SQL關(guān)鍵字執(zhí)行,改變了預(yù)期SQL語句的執(zhí)行邏輯。如果將存入數(shù)據(jù)庫中的數(shù)據(jù)統(tǒng)一采用參數(shù)化進(jìn)行存儲,當(dāng)用戶試圖在URL中嵌入惡意的SQL語句時,參數(shù)化存儲過程已經(jīng)幫用戶校驗(yàn)出傳遞給數(shù)據(jù)庫的變量不是整型,而且使用存儲過程的好處是我們還可以很方便地控制用戶權(quán)限,我們可以給用戶分配只讀或可讀寫權(quán)限。
鑒于如今許多網(wǎng)站進(jìn)行集約化平臺部署,針對網(wǎng)站的SQL注入攻擊行為,可以采用云檢測技術(shù),對用戶輸入網(wǎng)站的數(shù)據(jù)進(jìn)行靜態(tài)和動態(tài)檢測,并通過智能化匹配漏洞庫信息,定期檢查并發(fā)現(xiàn)應(yīng)用程序中的SQL注入漏洞,并加以攔截阻斷。
本文闡述了SQL注入的概念,分別按注入點(diǎn)類型、數(shù)據(jù)提交方式、執(zhí)行效果等三方面對SQL注入進(jìn)行分類說明,通過對SQL注入的過程進(jìn)行描述,提出SQL注入防御的具體措施。在云計算、大數(shù)據(jù)技術(shù)不斷深入發(fā)展的今天,SQL注入作為web應(yīng)用的一種典型攻擊方式,也伴隨著新技術(shù)、新應(yīng)用有著新的變化,如何應(yīng)對SQL注入不斷變化的攻擊方式,需要我們深入了解其原理,以不變應(yīng)萬變。