摘要:計(jì)算機(jī)網(wǎng)絡(luò)的飛速發(fā)展,使得人們對(duì)于網(wǎng)絡(luò)安全越來(lái)越關(guān)注。隨著多起SQL注入式攻擊案例的出現(xiàn)。大家已經(jīng)開(kāi)始逐步的關(guān)心這類(lèi)問(wèn)題。該文針對(duì)當(dāng)今的SQL注入式攻擊的特點(diǎn)進(jìn)行闡述。對(duì)大家認(rèn)清SQL注入式攻擊有一定的參考價(jià)值。
關(guān)鍵詞:Web應(yīng)用;SQL;注入式攻擊;Web安全
中圖分類(lèi)號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)14-3587-02
The Analysis of SQL Injection Attacks
LIU Bin
(Panzhihua University, Panzhihua 617000, China)
Abstract: The rapid development of computer networks, making it a growing concern for network security. With the number of cases SQL injection attacks to happen. We have begun to care about these problems step-by-step. for the Features of the current SQL injection attacks, this paper giving us a certain reference value to get to know it.
Key words: Web application; SQL; Injection attacks; Web Security
1 引言
分布式Web應(yīng)用的飛速發(fā)展使得軟件系統(tǒng)的體系結(jié)構(gòu)在一定程度上由C/S模式偏向于B/S模式,其平臺(tái)架構(gòu)大多采用ASP(.NET)+SQL+IIS的模式。由于程序編寫(xiě)人員的水平參差不齊,使得很多程序員設(shè)計(jì)出來(lái)的產(chǎn)品存在著各種安全隱患。其中一個(gè)常見(jiàn)的安全隱患就是SQL注入式攻擊。本文從SQL注入式攻擊的原理和方法上進(jìn)行分析,提出防范的一些解決方法,從而在一定程度上幫助大家解決對(duì)SQL注入進(jìn)行攻擊的問(wèn)題。
2 SQL注入式攻擊簡(jiǎn)介
2.1 相關(guān)基礎(chǔ)知識(shí)
SQL語(yǔ)言是一種用于關(guān)系數(shù)據(jù)庫(kù)的結(jié)構(gòu)化查詢語(yǔ)言。其典型的執(zhí)行語(yǔ)句是query。它可以修改數(shù)據(jù)庫(kù)結(jié)構(gòu)和操作數(shù)據(jù)庫(kù)內(nèi)容。假如攻擊者通過(guò)往query中插入一系列的SQL語(yǔ)句來(lái)操作數(shù)據(jù)寫(xiě)入到應(yīng)用程序中去,我們把這種方法定義成SQL注入。SQL注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后將該字符串傳遞到SQLServer進(jìn)行分析和執(zhí)行。SQL 注入攻擊技術(shù)在國(guó)際上最早出現(xiàn)于1999年,2002年后,我國(guó)開(kāi)始大量出現(xiàn)此類(lèi)問(wèn)題。它有兩種形式,一種是腳本注入式的攻擊,另外一種是惡意用戶輸入用來(lái)影響被執(zhí)行的SQL腳本。
2.2 攻擊原理及過(guò)程
SQL注入是目前比較常見(jiàn)的針對(duì)數(shù)據(jù)庫(kù)的一種攻擊方式。攻擊者從正常的網(wǎng)頁(yè)端口對(duì)網(wǎng)頁(yè)進(jìn)行訪問(wèn),當(dāng)遇到網(wǎng)頁(yè)需要查詢數(shù)據(jù)庫(kù)時(shí),通過(guò)把一些含有特殊含義的語(yǔ)句綁定到SQL語(yǔ)句中等方式改變用戶的初衷,從而達(dá)到攻擊者篡改數(shù)據(jù)等非法的目的。
引言中我們已提到,現(xiàn)在的軟件設(shè)計(jì)平臺(tái)架構(gòu)大多采用ASP(.NET)+SQL+IIS的模式。ASP頁(yè)面客戶端和服務(wù)器進(jìn)行數(shù)據(jù)交流有兩種方式。一是客戶端向服務(wù)器發(fā)送請(qǐng)求所采用的POST方式,其特點(diǎn)是不需要在URL中顯示,且傳輸數(shù)據(jù)量較大;另外一個(gè)方面是客戶端要從服務(wù)器取得數(shù)據(jù)所采用的GET方式,它需要在URL中顯示出來(lái),并受到URL長(zhǎng)度限制。傳送的數(shù)據(jù)量很小。
一般ASP.NET的Web應(yīng)用都有一個(gè)登錄頁(yè)面,識(shí)別用戶的身份與權(quán)限。大部分網(wǎng)站的用戶登錄驗(yàn)證程序都是采用POST方法提交用戶名和密碼兩個(gè)參數(shù),登錄頁(yè)面中輸入的內(nèi)容將直接用來(lái)構(gòu)造動(dòng)態(tài)的SQL命令,或者直接用作存儲(chǔ)過(guò)程的參數(shù),如:
System.Text.StringBuilder query = new System.Text.StringBuilder(
\"SELECT * from Users WHERE login =' '\")
.Append(txtLogin.Text).Append(\"' AND password=' '\")
.Append(txtPassword.Text).Append(\"'\");
如果用戶在輸入內(nèi)容中輸入有“1=1”之類(lèi)的內(nèi)容,則提交給服務(wù)器后,服務(wù)器構(gòu)造出的SQL語(yǔ)句為:
Select * from users where login=\"user\" or 1=1and password=\"pwd\"\"or 1=1
我們看看其執(zhí)行情況。由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)給攻擊者。在SQL語(yǔ)句中,“l(fā)ogin=\"user\" or 1=1”以及“password=\"pwd\"\"or 1=1”均是邏輯“或”的判斷。即兩個(gè)條件中任何一個(gè)成立,那么表達(dá)式成立,而的1=1是肯定成立的。也就是說(shuō)整個(gè)表達(dá)式的值始終成立。這樣查詢語(yǔ)句就通過(guò)了,從而就可以進(jìn)入到管理界面。
以上是一個(gè)利用POST方法實(shí)現(xiàn)攻擊的例子,實(shí)際上利用GET方法實(shí)現(xiàn)攻擊的應(yīng)用更加廣泛。例如訪問(wèn)某網(wǎng)站的地址如下:
http://www.***.com/showdetail.asp?id=2。如果在地址之后加一單引號(hào)。則服務(wù)器會(huì)報(bào)錯(cuò):
Microsoft JET Database Engine 錯(cuò)誤 '80040e14'
字符串的語(yǔ)法錯(cuò)誤在查詢表達(dá)式“ID=2”中。
/showdetail.asp,行8
從其報(bào)錯(cuò)信息,我們分析出,
1) 網(wǎng)站使用的是Access數(shù)據(jù)庫(kù),通過(guò)JET引擎連接數(shù)據(jù)庫(kù)。
2) 程序沒(méi)有判斷客戶端提交的數(shù)據(jù)是否符合程序要求。
3) 該SQL語(yǔ)句所查詢的表中有一名為ID的字段。
從以上信息我們可以簡(jiǎn)單分析出SQL注入式攻擊的一般過(guò)程[3]:
1) 找到SQL注入點(diǎn)的位置。這是進(jìn)行SQL注入式攻擊的切入點(diǎn)。
2) 判斷后臺(tái)數(shù)據(jù)庫(kù)的類(lèi)型。不同的數(shù)據(jù)庫(kù)有不同的攻擊方法,因此攻擊者必須正確判斷出后臺(tái)數(shù)據(jù)庫(kù)的類(lèi)型。目前常用的數(shù)據(jù)庫(kù)為ACCESS、SQL-SERVER以及ORACAL。
3) 查看XP_CMDSHELL的可執(zhí)行情況。即:判斷當(dāng)前連接數(shù)據(jù)的帳號(hào)是否具有SA權(quán)限,且master.dbo.xp_cmdshell擴(kuò)展存儲(chǔ)過(guò)程(調(diào)用此存儲(chǔ)過(guò)程可以直接使用操作系統(tǒng)的shell)能夠正確執(zhí)行。
4) 找到Web虛擬目錄的位置,上傳ASP木馬。這一步主要是找到放置ASP木馬的位置,進(jìn)而得到USER權(quán)限。然后把木馬放入Web虛擬目錄的Scripts下,遠(yuǎn)程客戶通過(guò)IE就可執(zhí)行它,進(jìn)而得到系統(tǒng)的USER權(quán)限,實(shí)現(xiàn)對(duì)系統(tǒng)的初步控制。
5) 獲得管理員權(quán)限。
3 SQL注入攻擊防范
在了解了SQL注入式攻擊的原理之后,我們將分析如何對(duì)其進(jìn)行防范。綜合各方面因素,總結(jié)如下:
1) 檢查輸入的 SQL 語(yǔ)句內(nèi)容,過(guò)濾敏感字符。比如:', >, <=, !, -, +, *, /, |, 空格等。
2) 加強(qiáng)對(duì)用戶輸入的驗(yàn)證。
這里指檢查用戶輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。總體來(lái)說(shuō),防治SQL注入式攻擊可以采用兩種方法,一是加強(qiáng)對(duì)用戶輸入內(nèi)容的檢查與驗(yàn)證;二是強(qiáng)迫使用參數(shù)化語(yǔ)句來(lái)傳遞用戶輸入的內(nèi)容。在SQLServer數(shù)據(jù)庫(kù)中,有較多的用戶輸入內(nèi)容驗(yàn)證工具可以抵制SQL注入式攻擊。協(xié)助管理員管理。
再則,我們可以使用存儲(chǔ)過(guò)程來(lái)驗(yàn)證用戶的輸入。利用存儲(chǔ)過(guò)程可以實(shí)現(xiàn)對(duì)用戶輸入變量的過(guò)濾,比如拒絕一些特殊的符號(hào)等等。在以上惡意代碼中,只要存儲(chǔ)過(guò)程把那個(gè)分號(hào)過(guò)濾掉,那么這個(gè)惡意代碼也就沒(méi)有用武之地了。在執(zhí)行SQL語(yǔ)句之前,可以通過(guò)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,來(lái)拒絕接納一些特殊的符號(hào)。
另外,通過(guò)測(cè)試類(lèi)型、長(zhǎng)度、格式和范圍來(lái)驗(yàn)證用戶輸入,過(guò)濾用戶輸入的內(nèi)容。這些都是防止SQL注入式攻擊的常見(jiàn)并且行之有效的措施。
3) 區(qū)分不同帳戶的權(quán)限。分配給不同類(lèi)型的用戶以不同的權(quán)限,可以最大限度的減少注入式攻擊對(duì)數(shù)據(jù)庫(kù)帶來(lái)的危害。特別是不要用dbo或者sa賬戶。比如對(duì)于普通的終端用戶,因?yàn)樗麄兪擒浖鞘褂谜撸⒉粻可娴綄?duì)數(shù)據(jù)庫(kù)的設(shè)計(jì)操作,要使其具有最小的權(quán)限。那么即使在他們使用SQL語(yǔ)句中帶有嵌入式的惡意代碼,由于權(quán)限的限制,這些代碼也將無(wú)法被執(zhí)行。因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
4) 采用加密機(jī)制。加密用戶輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)比較,這相當(dāng)于對(duì)用戶輸入的數(shù)據(jù)進(jìn)行了“消毒”處理,用戶輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。System.Web.Security.FormsAuthentication類(lèi)有一個(gè)HashPasswordForStoringInConfigFile,非常適合于對(duì)輸入數(shù)據(jù)進(jìn)行消毒處理。
5) 使用專(zhuān)業(yè)的漏洞掃描工具。通過(guò)使用一些微軟發(fā)布的專(zhuān)業(yè)漏洞掃描工具,可以幫助我們更好的識(shí)別哪些地方將是SQL注入式攻擊的著手點(diǎn)。然后程序員再根據(jù)其漏洞進(jìn)行修補(bǔ)完善處理。
6) 定期檢查IIS日志和數(shù)據(jù)表。由于攻擊程序是通過(guò)URI請(qǐng)求字符串來(lái)觸發(fā),管理員們可以定期檢查IIS日志,查看其中的異常請(qǐng)求。如果IIS日志表明服務(wù)器可能已經(jīng)被攻擊,那么下一步就要檢查相應(yīng)的Web應(yīng)用所使用到的數(shù)據(jù)庫(kù)中的表格,并找出附加在文本內(nèi)容中的