李虎軍
摘要:針對(duì)動(dòng)態(tài)網(wǎng)頁生成時(shí)存在的安全漏洞,該文簡(jiǎn)要介紹了網(wǎng)站SQL注入攻擊的原理、攻擊常用方法,并在此基礎(chǔ)上對(duì)如何防范對(duì)目標(biāo)網(wǎng)站數(shù)據(jù)庫系統(tǒng)進(jìn)行注入攻擊給出了一些防御方法,以期抵御網(wǎng)站所受的注入攻擊,更好地保護(hù)Web網(wǎng)站安全和應(yīng)用。
關(guān)鍵詞:網(wǎng)站; SQL注入;攻擊;數(shù)據(jù)庫系統(tǒng)
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)08-0001-03
隨著互聯(lián)網(wǎng)的飛速發(fā)展,對(duì)網(wǎng)站進(jìn)行SQL注入攻擊的事件層出不窮。2009年2月,據(jù)稱羅馬尼亞黑客團(tuán)伙利用數(shù)據(jù)庫注入攻擊技術(shù)分別攻擊了F-Secure、BT.com、CNET.com等知名網(wǎng)站。為美國1萬多家公司提供工資服務(wù)的美國PayChoice公司,在受到網(wǎng)站SQL注入攻擊后暫時(shí)被迫關(guān)閉其全部網(wǎng)站。Open Web Application Security Project Top 10 for 2013報(bào)告稱,注入漏洞攻擊已成為十大網(wǎng)站攻擊之首。
1 網(wǎng)站SQL注入攻擊原理
網(wǎng)站SQL注入攻擊,是別有用心的人先使用搜索引擎定位網(wǎng)頁中包含的動(dòng)態(tài)ASP腳本,測(cè)試目標(biāo)網(wǎng)站的網(wǎng)頁腳本是否存在數(shù)據(jù)庫注入漏洞并確定注入點(diǎn),最終試圖遍歷目標(biāo)網(wǎng)站后臺(tái)數(shù)據(jù)庫的所有文本字段,獲取目標(biāo)數(shù)據(jù)庫中用戶名和密碼,進(jìn)而非法登錄目標(biāo)網(wǎng)站計(jì)算機(jī)系統(tǒng),達(dá)到惡意目的。一旦攻擊得逞,被攻擊站點(diǎn)就會(huì)被入侵、泄密、破壞,甚至也可能成為惡意軟件的分發(fā)點(diǎn)。網(wǎng)站注入攻擊以網(wǎng)站數(shù)據(jù)庫為目標(biāo),一般利用Web應(yīng)用程序?qū)μ厥庾址^濾不完全的缺陷,通過精心構(gòu)造的字符串達(dá)到非法訪問網(wǎng)站數(shù)據(jù)庫內(nèi)容或在數(shù)據(jù)庫中執(zhí)行命令的目的。
假設(shè)有語句str="SELECT * FROM user WHERE name=' "+username+" ' and pwd=' "+PassWord+" '; " ,該語句含義是:將用戶輸入的用戶名(存儲(chǔ)在變量username中)和登錄口令(存儲(chǔ)在變量PassWord中)進(jìn)行數(shù)據(jù)庫檢索驗(yàn)證,如果相應(yīng)的用戶名和登錄口令正確,則該語句能返回正確的檢索信息,否則,檢索結(jié)果為空(意味著身份驗(yàn)證失?。?。以下兩種情況都可實(shí)現(xiàn)注入攻擊。
如果將username賦值如下: username="1'or 1=1--",將PassWord賦值任意字符串,則程序在進(jìn)行變量替換后,str中實(shí)際存放的字符串為:str="SELECT * FROM user WHERE name='1' OR 1=1-- and pwd=' 任意字符串'; "。表達(dá)式name='1' OR 1=1值為真,其后驗(yàn)證密碼部分被注釋掉,則strSQL中實(shí)際存放的字符串相當(dāng)于:str="SELECT * FROM user ;",就相當(dāng)于不需對(duì)用戶輸入的用戶名和密碼進(jìn)行驗(yàn)證。
如果在正常瀏覽網(wǎng)頁的URL地址http://xx.xx.xx.xx/abd.asp?id=KK后添加“and 1=1”時(shí)網(wǎng)頁如果無變化,而當(dāng)添加“ and 1=2”時(shí)網(wǎng)頁出現(xiàn)錯(cuò)誤,則說明該網(wǎng)頁存在注入漏洞。當(dāng)添加“and 1=(SELECT is_srvrolemember('sysadmin'))”時(shí)頁面訪問正常,則說明連接數(shù)據(jù)庫的用戶權(quán)限為sysadmin,可以執(zhí)行數(shù)據(jù)庫命令,表明存在注入權(quán)限為系統(tǒng)管理員漏洞。此時(shí),如果添加的語句為“;exec master..xp_cmdshell 'net user test 123/add '--” ,則URL地址中包含的SQL語句就可以在數(shù)據(jù)庫中創(chuàng)建一個(gè)名為test、登錄口令為123的用戶。黑客即可利用新建的用戶text上傳木馬至目標(biāo)主機(jī),為后續(xù)非法攻擊奠定基礎(chǔ)。
2 網(wǎng)站SQL注入攻擊
2.1 SQL注入漏洞與位置探測(cè)
一般來說,帶有參數(shù)的動(dòng)態(tài)網(wǎng)頁并且此網(wǎng)頁的生成需要訪問數(shù)據(jù)庫系統(tǒng),則很有可能存在SQL注入漏洞。如果網(wǎng)站設(shè)計(jì)程序員安全意識(shí)不強(qiáng),沒有過濾掉一些輸入的特殊字符,則存在SQL注入的可能性就非常大。通常在頁面URL地址處添加“and 1=1”、“ and 1=2”以及單雙引號(hào)等一些特殊字符,并通過網(wǎng)頁瀏覽器所返回的信息來判斷目標(biāo)網(wǎng)站是否存在SQL注入漏洞。如果網(wǎng)站程序員對(duì)單引號(hào)進(jìn)行了過濾,則攻擊者還可以采用:如用SELect代替select、SELECT的大小寫混合法;在IE中將輸入的字符串變成UNICODE字符串進(jìn)行輸入,如將+換成%2b、將空格換成 %20的UNICODE法;把輸入的字符用ASCII碼代替,例如將字符A換成chr(65)的 ASCII碼法。
2.2 判斷網(wǎng)站后臺(tái)數(shù)據(jù)庫的相關(guān)信息
在進(jìn)行SQL注入攻擊前,需要先識(shí)別被攻擊網(wǎng)站后臺(tái)所用數(shù)據(jù)庫管理系統(tǒng)的類型和版本??梢酝ㄟ^網(wǎng)站所用的開發(fā)語言判斷后臺(tái)數(shù)據(jù)庫類型。例如基于ASP或者ASP.NET技術(shù)所開發(fā)的網(wǎng)站通常用Microsoft SQL SERVER作為網(wǎng)站后臺(tái)數(shù)據(jù)庫管理系統(tǒng)。也可通過網(wǎng)站的部署環(huán)境進(jìn)行判斷,如果是運(yùn)行在Linux操作系統(tǒng)上的Apache應(yīng)用服務(wù)器,則網(wǎng)站很可能使用的是MySQL數(shù)據(jù)庫。如果網(wǎng)站開發(fā)者沒有向?yàn)g覽者屏蔽錯(cuò)誤消息,則通過在URL中附加一些字符使網(wǎng)站后臺(tái)數(shù)據(jù)庫系統(tǒng)產(chǎn)生語法錯(cuò)誤消息并將相應(yīng)信息返回到訪問頁面,則攻擊者可以根據(jù)返回的錯(cuò)誤消息來判斷是那類數(shù)據(jù)庫管理系統(tǒng)。還可以利用不同數(shù)據(jù)庫管理系統(tǒng)的獨(dú)特SQL語法進(jìn)行判斷。例如, MySQL支持select 'a'+'b' 和select concat('a','b');Oracle數(shù)據(jù)庫支持select 'a' ||'b'和select concat('a','b')。
判斷出數(shù)據(jù)庫管理系統(tǒng)類型之后,可通過查詢語句獲取版本信息。如果是MySQL數(shù)據(jù)庫則可發(fā)送select version( )。也可通過判別系統(tǒng)表方式判斷數(shù)據(jù)庫類型,Access數(shù)據(jù)庫的系統(tǒng)表是msysobjects,SQL Server數(shù)據(jù)庫的系統(tǒng)表是sysobjects,系統(tǒng)變量有user和db_name( )。通過讀取上述表和變量的方式判斷網(wǎng)站后臺(tái)數(shù)據(jù)庫管理系統(tǒng)類型。通過http://xx.xx.xx.xx/abc.asp?id=KK and( select db_name( ))>0,可以得到目標(biāo)網(wǎng)站當(dāng)前連接的數(shù)據(jù)庫名。獲知了網(wǎng)站后臺(tái)數(shù)據(jù)庫的相關(guān)信息,為后續(xù)有針對(duì)性地采取對(duì)應(yīng)入侵方式打下基礎(chǔ)。
2.3 確定目標(biāo)網(wǎng)站主機(jī)目錄
為了上傳木馬程序到目標(biāo)網(wǎng)站,需先找到目標(biāo)網(wǎng)站的Web虛擬目錄,并將木馬程序上傳其中,使木馬程序得到運(yùn)行,從而創(chuàng)建目標(biāo)網(wǎng)站后門。通常有兩種方法:
1)根據(jù)經(jīng)驗(yàn)猜解。一般來說,Web虛擬目錄可能是c:\inetpub\wwwroot或是d:\inetpub\wwwroot等,而可執(zhí)行虛擬目錄可能是c:\inetpub\scripts或是d:\inetpub\scripts等。
2)通過遍歷目標(biāo)網(wǎng)站主機(jī)的目錄結(jié)構(gòu),分析相關(guān)數(shù)據(jù)發(fā)現(xiàn)目標(biāo)主機(jī)的Web虛擬目錄??梢岳脁p_availablemedia獲取當(dāng)前所有驅(qū)動(dòng)器;接著利用xp_subdirs獲得子目錄列表;然后利用xp_dirtree獲得所有子目錄的目錄樹結(jié)構(gòu)。
2.4獲取用戶賬戶信息與口令
許多Web網(wǎng)站為了維護(hù)方便,提供了遠(yuǎn)程管理功能,對(duì)于不同用戶有不同的訪問權(quán)限。為了以合法用戶身份登錄目標(biāo)網(wǎng)站,需要獲取目標(biāo)網(wǎng)站的用戶名和登錄口令。用戶名與口令通常存儲(chǔ)在數(shù)據(jù)庫才一張表中。首先找到系統(tǒng)存放用戶名和口令的表,這里假設(shè)該表名為Stable。
1)猜解表中用戶名字段名和口令字段名。在Stable表中必定存在一個(gè)用戶名字段和一個(gè)登錄口令字段,只有首先得到這兩個(gè)字段的名稱,后續(xù)才能設(shè)法得到這兩個(gè)字段的內(nèi)容。
假設(shè)有:http://xx.xx.xx.xx/abc.asp?id=KK and( SELECT top 1 col_name (object_id('Stable'),1) FROM TestDB.dbo.sysobjects)>0,該注入語句是從系統(tǒng)表sysobjects中得到表Stable的第一個(gè)字段名。當(dāng)與整數(shù)進(jìn)行比較時(shí),該URL訪問異常,但在異常中卻可以發(fā)現(xiàn)想要的字段名稱。把col_name(object_id('Stable'),1)中的1依次替換為2、3、……就可以得到Stable表中所有的字段名稱。
2)猜測(cè)用戶名和口令
可以采用ASCII碼逐字解碼,先猜測(cè)字段的長(zhǎng)度,然后異常猜測(cè)出每一位的值。以猜測(cè)用戶名為例。http://xx.xx.xx.xx/abc.asp?id=KK and( SELECT top 1用戶名字段FROM TestDB.dbo.Stable)=YY(YY=1、2、3、……),若YY為i值且abc.asp運(yùn)行正常,則i就是第一個(gè)用戶名的長(zhǎng)度。
猜測(cè)用戶名的第一個(gè)字符(猜測(cè)口令同理):http://xx.xx.xx.xx/abc.asp?id=KK and(SELECT top 1 ascii(substring(username,1,1) FROM TestDB.dbo.Stable)=XX,若XX為某i值且abc.asp運(yùn)行正常,則i就是對(duì)應(yīng)字符的ASCII碼值。
通過上述操作,可獲得目標(biāo)網(wǎng)站的用戶名與口令。
3 防御SQL注入策略
網(wǎng)站SQL注入攻擊主要針對(duì)運(yùn)行在目標(biāo)計(jì)算機(jī)應(yīng)用層的Web應(yīng)用程序,因此對(duì)于絕大多數(shù)防火墻來說,這種攻擊是“合法”的(使用合法的HTTP協(xié)議)。為更好地防御SQL注入攻擊需要在設(shè)計(jì)網(wǎng)站、進(jìn)行編程時(shí)進(jìn)行完善。因此在設(shè)計(jì)網(wǎng)站、編寫Web應(yīng)用程序時(shí),應(yīng)遵循以下策略以減少SQL注入漏洞。
3.1 SQL注入攻擊的檢測(cè)
SQL注入攻擊的檢測(cè)分為網(wǎng)站被入侵前的檢測(cè)和被入侵后的檢測(cè)。被入侵前的檢測(cè),既可以采用手工方式,也可以采用SQL注入工具軟件。對(duì)于被SQL注入攻擊后的檢測(cè),主要通過對(duì)日志的檢測(cè)來發(fā)現(xiàn)攻擊活動(dòng)。因?yàn)镾QL注入攻擊成功后,都會(huì)在網(wǎng)站的IIS日志和數(shù)據(jù)庫系統(tǒng)中留下“痕跡”。 檢測(cè)的目的是為預(yù)防SQL注入攻擊。
1)數(shù)據(jù)庫系統(tǒng)檢查
使用NBSI、HDSI等軟件進(jìn)行SQL注入攻擊后,都會(huì)在目標(biāo)主機(jī)的數(shù)據(jù)庫系統(tǒng)中生成臨時(shí)表。通過查看目標(biāo)主機(jī)的數(shù)據(jù)庫系統(tǒng)中最近新建表的結(jié)構(gòu)和內(nèi)容,通常可以判斷出是否被SQL注入攻擊過。
2)Internet 信息服務(wù)(IIS)日志檢查
如果網(wǎng)站主機(jī)系統(tǒng)啟用了日志記錄,則IIS 日志中存有訪問者的IP地址、所訪問文件等訪問信息;SQL注入攻擊者往往會(huì)大量訪問某一個(gè)存在SQL注入漏洞的動(dòng)態(tài)網(wǎng)頁,則IIS日志文件內(nèi)容會(huì)快速增加。通過查看IIS日志文件的大小變化以及IIS日志文件中的內(nèi)容,也能判斷是否被SQL注入攻擊過。
3)通過其他相關(guān)信息進(jìn)行判斷
在SQL注入攻擊成功后,攻擊者通常會(huì)在目標(biāo)主機(jī)系統(tǒng)中添加用戶、開放遠(yuǎn)程服務(wù)以及安裝運(yùn)行木馬等??梢酝ㄟ^檢查系統(tǒng)用戶賬號(hào)、遠(yuǎn)程服務(wù)開啟情況、系統(tǒng)最近產(chǎn)生的文件等信息來判斷是否被入侵過。
3.2 參數(shù)化語句
ASP網(wǎng)站易受到SQL注入攻擊的原因是攻擊者將惡意的SQL語句以合法的字符串形式利用網(wǎng)站系統(tǒng)動(dòng)態(tài)構(gòu)造SQL語句的特點(diǎn)使后臺(tái)數(shù)據(jù)庫系統(tǒng)執(zhí)行。大多數(shù)網(wǎng)站編程語言和數(shù)據(jù)庫訪問API允許使用占位符或通過綁定變量來向數(shù)據(jù)庫系統(tǒng)的查詢命令提供參數(shù),而不僅僅是對(duì)用戶的輸入直接進(jìn)行操作;即使用戶輸入的參數(shù)中含有分號(hào)、注釋符號(hào)、SELECT等一些SQL關(guān)鍵字,也要被轉(zhuǎn)義成一般字符進(jìn)行處理,這種處理方式通常被稱為參數(shù)化查詢。此方法是一種較為安全的動(dòng)態(tài)字符串構(gòu)造方法,參數(shù)化查詢可以避免網(wǎng)站URL中常見的SQL注入攻擊問題。
3.3 過濾特殊字符
在SQL注入攻擊前進(jìn)行漏洞探測(cè)時(shí),攻擊者需要在提交的參數(shù)中包含一些特殊字符,在實(shí)施SQL注入時(shí),SQL語句中往往需要包含“'”、“;”、“or”、“--”、“select”、“add”、“xp_”等字符。防范SQL注入攻擊的最有效的方法是對(duì)用戶的輸入內(nèi)容進(jìn)行安全檢查。根據(jù)參數(shù)的類型,將用戶輸入的單引號(hào)、雙引號(hào)、分號(hào)、逗號(hào)、冒號(hào)、連接號(hào)等進(jìn)行轉(zhuǎn)換或過濾,可以防止很多SQL注入攻擊。例如對(duì)單引號(hào)過濾,可以將單引號(hào)轉(zhuǎn)換成兩個(gè)單引號(hào),此舉將導(dǎo)致用戶提交的數(shù)據(jù)在進(jìn)行SQL語句查詢時(shí)出現(xiàn)語法錯(cuò)誤;也可以將單引號(hào)轉(zhuǎn)換成空格,對(duì)用戶輸入提供數(shù)據(jù)進(jìn)行嚴(yán)格限制。上述方法將導(dǎo)致SQL注入失敗。
3.4 最小權(quán)限原則
為防止網(wǎng)站訪問用戶濫用權(quán)限,應(yīng)該只給網(wǎng)頁訪問數(shù)據(jù)庫系統(tǒng)所需的最小權(quán)限。如果網(wǎng)頁不需要訪問數(shù)據(jù)庫中的某些表,則應(yīng)該明確網(wǎng)頁沒有訪問這些表的權(quán)限;如果網(wǎng)頁只需要讀權(quán)限,則應(yīng)確認(rèn)其無表的更改等權(quán)限。如果網(wǎng)頁程序需訪問數(shù)據(jù)庫系統(tǒng),則其不應(yīng)使用sa、root、system等系統(tǒng)管理員賬號(hào),而應(yīng)該使用普通用戶賬號(hào),并且根據(jù)實(shí)際需要嚴(yán)格設(shè)置其權(quán)限。對(duì)于只讀操作,則只分配select權(quán)限,而不要分配insert、update、delete等這些具有修改功能的權(quán)限。即便網(wǎng)站被攻擊泄露了數(shù)據(jù),數(shù)據(jù)也不會(huì)被破壞。特別注意,Web應(yīng)用程序所使用的存儲(chǔ)過程和函數(shù)的權(quán)限,也要遵循最小權(quán)限原則。運(yùn)行在操作系統(tǒng)上的數(shù)據(jù)庫應(yīng)用程序也要被設(shè)置成最小權(quán)限。還應(yīng)關(guān)閉數(shù)據(jù)庫中的額外功能,例如在SQL SERVER中,應(yīng)關(guān)閉xp_cmdshell以及xp_reg*等存儲(chǔ)過程的運(yùn)行。確保操作系統(tǒng)和數(shù)據(jù)庫系統(tǒng)漏洞已得到修補(bǔ),系統(tǒng)已更新了最新的補(bǔ)丁。
3.5規(guī)范化輸入
攻擊者也可以通過發(fā)送輸入數(shù)據(jù)前對(duì)其進(jìn)行編碼,然后再對(duì)其進(jìn)行解碼和解釋的方式,來達(dá)到攻擊目的。對(duì)上述方式中所輸入的數(shù)據(jù)進(jìn)行驗(yàn)證是比較難處理的。例如在UNICODE中SQL注入常將雙引號(hào)用"%u0022"表示。為規(guī)范化輸入,可以通過白名單驗(yàn)證的方式過濾掉所有不符合規(guī)定的輸入內(nèi)容。但當(dāng)SQL注入攻擊字符串是符合格式要求的字符串時(shí),就需要尋找編碼方法或其他輸入方法來保證接收的字符串是安全的??梢韵葘⑤斎氲淖址M(jìn)行解碼,當(dāng)解碼后的字符串中還存有經(jīng)過編碼的字符時(shí),則認(rèn)為該字符串為非法輸入。另外,每種數(shù)據(jù)庫管理系統(tǒng)都有一個(gè)字符轉(zhuǎn)義機(jī)制來判斷輸入的內(nèi)容是數(shù)據(jù)而不是代碼,則可以對(duì)用戶所有輸入的字符串進(jìn)行轉(zhuǎn)義,那么數(shù)據(jù)庫系統(tǒng)就不會(huì)混淆數(shù)據(jù)和代碼,也就不易出現(xiàn)被SQL注入攻擊了。
3.6 網(wǎng)站服務(wù)器設(shè)置
SQL注入攻擊很多時(shí)候是根據(jù)目標(biāo)服務(wù)器給出的錯(cuò)誤信息進(jìn)行判斷、入侵的,網(wǎng)站服務(wù)器端配置應(yīng)將錯(cuò)誤提示信息的反饋功能關(guān)閉,使得攻擊者只能進(jìn)行盲注入,大大提高注入攻擊的難度。同時(shí),要利用IIS日志服務(wù),及時(shí)發(fā)現(xiàn)SQL注入攻擊痕跡。數(shù)據(jù)庫名、表名、字段名的命名要避免采用默認(rèn)或通用的名稱,避免給注入者留下可乘之機(jī)。對(duì)系統(tǒng)的用戶和角色合理授權(quán),嚴(yán)格用戶最小權(quán)限原則。 刪除網(wǎng)站主機(jī)不使用的賬戶,防止攻擊者通過這些賬戶來獲得目標(biāo)服務(wù)器上的數(shù)據(jù)和應(yīng)用程序的訪問權(quán)。系統(tǒng)必須使用強(qiáng)密碼,以增加攻擊者進(jìn)行暴力攻擊的難度。在網(wǎng)站服務(wù)器系統(tǒng)中適當(dāng)設(shè)置假用戶,誘騙攻擊者,增加攻擊難度。禁止將敏感性數(shù)據(jù)以明文存放在數(shù)據(jù)庫中,通過哈希函數(shù)加密后存放,或通過RSA提供的加解密API在讀取/寫入數(shù)據(jù)時(shí)進(jìn)行解密/加密處理,進(jìn)行這樣即使數(shù)據(jù)庫被SQL注入漏洞攻擊,也會(huì)減少泄密的風(fēng)險(xiǎn)。
將網(wǎng)站后臺(tái)存放文本的目錄的執(zhí)行權(quán)限均設(shè)置為“無”,即使網(wǎng)站該目錄被上傳了木馬,該木馬也不能運(yùn)行。將Web應(yīng)用的根目錄和虛擬目錄轉(zhuǎn)移到非系統(tǒng)分區(qū),以防被目錄遍歷攻擊。Web管理員必須通過本地登錄方式管理Web服務(wù)器。經(jīng)常使用漏洞掃描工具和網(wǎng)站監(jiān)視工具對(duì)網(wǎng)站進(jìn)行監(jiān)測(cè)和查找漏洞,保護(hù)網(wǎng)站的安全。
4 結(jié)束語
本文從SQL注入攻擊的基本原理和過程描述了SQL注入攻擊可能對(duì)網(wǎng)站系統(tǒng)造成的各種破壞,以及相關(guān)攻擊過程和手段,重點(diǎn)闡述了如何有效防范SQL注入攻擊的策略和措施,以便有效防范SQL注入攻擊,更好地保護(hù)Web網(wǎng)站安全。
參考文獻(xiàn):
[1] 黃景文.SQL注入攻擊的一個(gè)新的防范策略[J].微計(jì)算機(jī)信息,2008(6):31-32.
[2] 查凱.基于標(biāo)識(shí)的SQL注入攻擊防御方法[J].信息安全與通信保密,2011(6):54-55.
[3] 黃健.計(jì)算機(jī)信息安全技術(shù)及防護(hù)[J].信息安全與技術(shù),2012(4):83-85.