摘要:SQL注入是一種基于跨站請(qǐng)求偽造的技術(shù),黑客可以利用跨站請(qǐng)求偽造來(lái)進(jìn)行SQL注入獲得的管理員權(quán)限,進(jìn)入網(wǎng)站任意獲得網(wǎng)站上的文件或者在網(wǎng)頁(yè)上加掛木馬和各種惡意程序,對(duì)網(wǎng)站和訪問(wèn)該網(wǎng)站的網(wǎng)友都帶來(lái)巨大危害。該文主要介紹了SQL注入的原理、方法及防范措施。
關(guān)鍵詞:SQL注入;數(shù)據(jù)庫(kù);權(quán)限;密碼
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)14-3592-01
1 引言
ASP編程簡(jiǎn)便易學(xué),初學(xué)者很容易掌握。在一段不長(zhǎng)的時(shí)間里,就已經(jīng)能夠編出比較完美的動(dòng)態(tài)網(wǎng)站,但在安全性方面,新手最容易忽略的問(wèn)題就是SQL注入漏洞的問(wèn)題。用NBSI 2.0對(duì)網(wǎng)上的一些ASP網(wǎng)站稍加掃描,就能發(fā)現(xiàn)許多ASP網(wǎng)站存在SQL注入漏洞,高校內(nèi)部機(jī)構(gòu)的一些網(wǎng)站這種漏洞就更普遍了,可能這是因?yàn)檫@些網(wǎng)站大都是一些學(xué)生做的緣故吧,雖然個(gè)個(gè)都很聰明,可是畢竟沒(méi)有經(jīng)驗(yàn),而且處于學(xué)習(xí)中,難免存在漏洞了。如何有效地防范措施SQL注入呢?SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等帶有參數(shù)的ASP動(dòng)態(tài)網(wǎng)頁(yè)中,有時(shí)一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)中可能只有一個(gè)參數(shù),有時(shí)可能有N個(gè)參數(shù),有時(shí)是整型參數(shù),有時(shí)是字符串型參數(shù),不能一概而論。總之只要是帶有參數(shù)的動(dòng)態(tài)網(wǎng)頁(yè)且此網(wǎng)頁(yè)訪問(wèn)了數(shù)據(jù)庫(kù),那么就有可能存在SQL注入。如果ASP程序員沒(méi)有安全意識(shí),不進(jìn)行必要的字符過(guò)濾,存在SQL注入的可能性就非常大。
2 什么是SQL注入
利用現(xiàn)有應(yīng)用程序,將惡意的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù)引擎執(zhí)行的能力,這是SQL注入的標(biāo)準(zhǔn)釋義。它一般通過(guò)互聯(lián)網(wǎng)的輸入?yún)^(qū)域,插入SQL meta-characters和指令,操縱執(zhí)行后端的SQL查詢的技術(shù)。這些攻擊主要針對(duì)其他組織的WEB服務(wù)器。CSS攻擊通過(guò)在URL里插入script標(biāo)簽,然后誘導(dǎo)信任它們的用戶點(diǎn)擊它們,確保惡意Javascript代碼在受害人的機(jī)器上運(yùn)行。這些攻擊利用了用戶和服務(wù)器之間的信任關(guān)系,事實(shí)上服務(wù)器沒(méi)有對(duì)輸入、輸出進(jìn)行檢測(cè),從而未拒絕javascript代碼。
SQL注入是從正常的WWW端口訪問(wèn),而且表面看起來(lái)跟一般的Web頁(yè)面訪問(wèn)沒(méi)什么區(qū)別,所以目前市面的防火墻都不會(huì)對(duì)SQL注入發(fā)出警報(bào),如果管理員沒(méi)查看IIS日志的習(xí)慣,可能被入侵很長(zhǎng)時(shí)間都不會(huì)發(fā)覺(jué)。但是,SQL注入的手法相當(dāng)靈活,在注入的時(shí)候會(huì)碰到很多意外的情況。能不能根據(jù)具體情況進(jìn)行分析,構(gòu)造巧妙的SQL語(yǔ)句,從而成功獲取想要的數(shù)據(jù)。
3 SQL注入的原理及分類
3.1 SQL-Injection的原理
SQL是一種用于關(guān)系數(shù)據(jù)庫(kù)的結(jié)構(gòu)化查詢語(yǔ)言。它分為許多種,但大多數(shù)都松散地基于美國(guó)國(guó)家標(biāo)準(zhǔn)化組織最新的標(biāo)準(zhǔn)SQL-92。SQL語(yǔ)言可以修改數(shù)據(jù)庫(kù)結(jié)構(gòu)和操作數(shù)據(jù)庫(kù)內(nèi)容。當(dāng)一個(gè)攻擊者能夠通過(guò)往查詢中插入一系列的SQL操作數(shù)據(jù)寫入到應(yīng)用程序中去,并對(duì)數(shù)據(jù)庫(kù)實(shí)施了查詢,這時(shí)就已經(jīng)構(gòu)成了SQL-Injection。
3.2 SQL-Injection的分類
由于SQL-injection攻擊出要發(fā)生在B/S結(jié)構(gòu)的應(yīng)用程序上,而這些程序大部分都屬于互聯(lián)網(wǎng)的web站點(diǎn),在這種情況下SQL-Injection同樣需要遵循HTTP協(xié)議,形成了兩種分類:POST方式注入和GET方式注入。
4 SQL-Injection的注入方法
4.1 常規(guī)注入方法
SQL注入攻擊本身就是一個(gè)常規(guī)性的攻擊,它可以允許一些不法用戶檢索你的數(shù)據(jù),改變服務(wù)器的設(shè)置,或者在你不小心的時(shí)候黑掉你的服務(wù)器。
4.2 旁注
顧名思義就是從旁注入,也就是利用主機(jī)上面的一個(gè)虛擬站點(diǎn)進(jìn)行滲透 ,此類手法多出現(xiàn)與虛擬主機(jī)站點(diǎn)。
4.3 盲注
通過(guò)構(gòu)造特殊的SQL語(yǔ)句,在沒(méi)有返回錯(cuò)誤信息的情況下進(jìn)行注入。
4.4 跨站注入
攻擊者利用程序?qū)τ脩糨斎脒^(guò)濾及判斷的不足,寫入或插入可以顯示在頁(yè)面上對(duì)其他用戶造成影響的代碼??缯咀⑷氲母呒?jí)攻擊就屬于這種攻擊。
5 SQL注入的過(guò)程
SQL注入利用的是正常的HTTP服務(wù)端口,表面上看來(lái)和正常的web訪問(wèn)沒(méi)有區(qū)別,隱蔽性極強(qiáng),不易被發(fā)現(xiàn)。
第一步:判斷Web環(huán)境是否可以SQL注入。如果URL僅是對(duì)網(wǎng)頁(yè)的訪問(wèn),不存在SQL注入問(wèn)題,如:http://news.xxx.com.cn/162414739931.shtml就是普通的網(wǎng)頁(yè)訪問(wèn)。只有對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)查詢的業(yè)務(wù)才可能存在SQL注入,如:http://www.google.cn/webhp?id=18,其中?id=18表示數(shù)據(jù)庫(kù)查詢變量,這種語(yǔ)句會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行,因此可能會(huì)給數(shù)據(jù)庫(kù)帶來(lái)威脅。
第二步:尋找SQL注入點(diǎn)。完成上一步的判斷后,就要尋找可利用的注入漏洞,通過(guò)輸入一些特殊語(yǔ)句,可以根據(jù)瀏覽器返回信息,判斷數(shù)據(jù)庫(kù)類型,從而構(gòu)建數(shù)據(jù)庫(kù)查詢語(yǔ)句找到注入點(diǎn)。
第三步:猜解用戶名和密碼。數(shù)據(jù)庫(kù)中存放的表名、字段名都是有規(guī)律可言的。通過(guò)構(gòu)建特殊數(shù)據(jù)庫(kù)語(yǔ)句在數(shù)據(jù)庫(kù)中依次查找表名、字段名、用戶名和密碼的長(zhǎng)度,以及內(nèi)容。這個(gè)猜測(cè)過(guò)程可以通過(guò)網(wǎng)上大量注入工具快速實(shí)現(xiàn),并借助破解網(wǎng)站輕易破譯用戶密碼。
第四步:尋找WEB管理后臺(tái)入口。通常WEB后臺(tái)管理的界面不面向普通用戶開(kāi)放,要尋找到后臺(tái)的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進(jìn)行嘗試,就可以試出管理臺(tái)的入口地址。
第五步:入侵和破壞。成功登陸后臺(tái)管理后,接下來(lái)就可以任意進(jìn)行破壞行為,如篡改網(wǎng)頁(yè)、上傳木馬、修改、泄漏用戶信息等,并進(jìn)一步入侵?jǐn)?shù)據(jù)庫(kù)服務(wù)器。
6 SQL注入的危害
SQL注入的主要危害包括:1) 未經(jīng)授權(quán)狀況下操作數(shù)據(jù)庫(kù)中的數(shù)據(jù);2) 惡意篡改網(wǎng)頁(yè)內(nèi)容;3) 私自添加系統(tǒng)帳號(hào)或者是數(shù)據(jù)庫(kù)使用者帳號(hào);4) 網(wǎng)頁(yè)掛木馬。
無(wú)論你有多強(qiáng)大的防火墻規(guī)則設(shè)置或者非常勤于補(bǔ)漏的修補(bǔ)機(jī)制,如果你的網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)者沒(méi)有遵循安全代碼進(jìn)行開(kāi)發(fā),攻擊者都能進(jìn)入你的系統(tǒng)。SQL注入意味著數(shù)據(jù)庫(kù)被攻破,入侵者得到當(dāng)前數(shù)據(jù)庫(kù)權(quán)限的同時(shí),也獲得了整個(gè)數(shù)據(jù)庫(kù)服務(wù)器的管理權(quán)限,入侵者可通過(guò)數(shù)據(jù)庫(kù)管理權(quán)限得到系統(tǒng)權(quán)限,并為所欲為。
7 防止SQL注入的方法
很多新手從網(wǎng)上下載SQL通用防注入系統(tǒng)的程序,在需要防范注入的頁(yè)面頭部用來(lái)防止別人進(jìn)行手動(dòng)注入測(cè)試??墒侨绻ㄟ^(guò)SQL注入分析器就可輕松跳過(guò)防注入系統(tǒng)并自動(dòng)分析其注入點(diǎn)。然后只需要幾分鐘,你的管理員賬號(hào)及密碼就會(huì)被分析出來(lái)。對(duì)于注入分析器的防范,首先我們要知道SQL注入分析器是如何工作的。在操作過(guò)程中,發(fā)現(xiàn)軟件并不是沖著“admin”管理員賬號(hào)去的,而是沖著權(quán)限(如flag=1)去的。這樣一來(lái),無(wú)論你的管理員賬號(hào)怎么變都無(wú)法逃過(guò)檢測(cè)。
一般的做法是注冊(cè)兩個(gè)賬號(hào),一個(gè)是普通的管理員賬號(hào),一個(gè)是防止注入的賬號(hào),理由是如果找一個(gè)權(quán)限最大的賬號(hào)制造假象,吸引軟件的檢測(cè),而這個(gè)賬號(hào)里的內(nèi)容是大于千字以上的中文字符,就會(huì)使軟件對(duì)這個(gè)賬號(hào)進(jìn)行分析的時(shí)候進(jìn)入全負(fù)荷狀態(tài)甚至資源耗盡而死機(jī)。具體做法如下:
1) 對(duì)表結(jié)構(gòu)進(jìn)行修改。將管理員的賬號(hào)字段的數(shù)據(jù)類型進(jìn)行修改,文本型改成最大字段255(其實(shí)也夠了,如果還想做得再大點(diǎn),可以選擇備注型),密碼的字段也進(jìn)行相同設(shè)置。
2) 對(duì)表進(jìn)行修改。設(shè)置管理員權(quán)限的賬號(hào)放在ID1,并輸入大量中文字符(最好大于100個(gè)字)。
3) 把真正的管理員密碼放在ID2后的任何一個(gè)位置(如放在ID549上)。
4) 在管理員登錄的頁(yè)面文件中寫入字符限制。
我們通過(guò)上面的四步完成了對(duì)數(shù)據(jù)庫(kù)的修改,就算對(duì)方使用這個(gè)有上千字符的賬號(hào)密碼也會(huì)被擋住的,而真正的密碼則可以不受限制。
參考文獻(xiàn):
[1] 潘愛(ài)民.計(jì)算機(jī)網(wǎng)絡(luò)[M].4版.北京:清華大學(xué)出版社,2004.77-81.
[2] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].5版.北京:清華大學(xué)出版社,2008.101-108.
[3] 王吉軍.網(wǎng)絡(luò)安全機(jī)密與解決方案[M].5版.北京:清華大學(xué)出版社,2006.56-83.