黃碧玲
摘 要: 網(wǎng)站注入式攻擊成為Web應(yīng)用系統(tǒng)的嚴(yán)重安全隱患。通過該類型攻擊,攻擊者能非法獲得對Web應(yīng)用程序數(shù)據(jù)庫無限制的訪問權(quán)限,進(jìn)而得到企業(yè)和網(wǎng)絡(luò)用戶的機密信息,如銀行賬號、交易數(shù)據(jù)等,給網(wǎng)絡(luò)用戶和企業(yè)造成了巨大損失。通過對注入式攻擊途徑、動機、流程及原理的分析,結(jié)合目前普遍采用的攻擊測試方法,提出一些防范方法和措施。采用這些方法和措施可極大限度地減少網(wǎng)站注入攻擊的可能性,保護(hù)數(shù)據(jù)庫的安全。
關(guān)鍵詞: 注入式攻擊; 攻擊原理; 攻擊防范; 網(wǎng)絡(luò)安全
中圖分類號:TP309.2 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2013)08-22-03
0 引言
網(wǎng)站注入是動態(tài)網(wǎng)頁經(jīng)常存在的一種漏洞(這些漏洞并非Window、IIS、SQL Server或者其他底層代碼的漏洞,而是在這些平臺上運行的由程序員自行編寫的代碼中的漏洞),攻擊者利用這種漏洞可以通過SQL語句直接訪問數(shù)據(jù)庫,因而對系統(tǒng)的安全產(chǎn)生很大隱患。隨著B/S模式應(yīng)用開發(fā)的發(fā)展,相當(dāng)一部分程序員在編寫代碼的時候,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在著安全隱患。本文通過對注入式攻擊途徑、動機、流程及原理的分析,結(jié)合目前普遍采用的攻擊測試方法,提出一些防范方法和措施。這些防范方法可極大程度地減少網(wǎng)站注入攻擊的可能性,保護(hù)數(shù)據(jù)庫的安全。
1 網(wǎng)站注入攻擊途徑、流程及原理分析
1.1 SQL注入攻擊的途徑
用戶通過一定的途徑將自己的輸入提交給Web應(yīng)用程序,因而SQL注入也就有其相應(yīng)的攻擊途徑。惡意用戶一般通過客戶端輸入、Server變量以及Cookie三種[1]基本的方式進(jìn)行畸形SQL語句查詢的提交,從而達(dá)到進(jìn)行SQL注入的最終目的。
通過用戶輸入注入 在客戶端頁面上的輸入是用戶和Web應(yīng)用程序最主要的交互方式,用戶輸入主要通過HTTP的GET和POST請求提交。Web應(yīng)用程序通過訪問這些請求變量并引用包含在這些變量中的用戶輸入值(變量值),然后使用這些用戶輸入值,動態(tài)地生成SQL查詢語句,提交給后臺數(shù)據(jù)庫。惡意用戶則通過精心構(gòu)造用戶輸入值進(jìn)行SQL注入。
通過Server變量注入 Server變量是包含在HTTP、網(wǎng)絡(luò)header和環(huán)境變量中的變量。瀏覽器請求和服務(wù)端的響應(yīng)都包含headers。Headers提供有關(guān)請求和響應(yīng)的附加信息,包括瀏覽器生成請求和服務(wù)端響應(yīng)過程的信息。惡意用戶就可能通過偽造HTTP和headers的值操縱數(shù)據(jù)庫,生成攻擊。
通過Cookie注入 Cookie是Web應(yīng)用程序產(chǎn)生的包含狀態(tài)信息的文件,存儲在客戶端并由客戶端完全控制。因此惡意用戶可以任意處理Cookie內(nèi)容,若Web應(yīng)用程序用Cookie的內(nèi)容動態(tài)構(gòu)造SQL查詢,那么惡意用戶就可以使用Cookie的內(nèi)容構(gòu)造SQL查詢,并將攻擊嵌入Cookie提交。
1.2 網(wǎng)站注入攻擊的分類
使用注釋符(- -,#) 使用注釋通??梢允构粽呃@過驗證。SQL在查詢中支持注釋,如,- -、#等。通過注入注釋符,惡意用戶或者攻擊者可以毫不費力的截斷SQL查詢語句。
重言式攻擊 該類型攻擊是為繞過驗證、識別可注入的參數(shù)或者提取數(shù)據(jù)。這種攻擊的目的是在條件句中注入代碼,使該條件句恒真。攻擊者利用查詢條件中的可注入字段,將條件轉(zhuǎn)換為重言式,使數(shù)據(jù)庫返回所有相關(guān)行。這類攻擊的結(jié)果依賴于攻擊對象在應(yīng)用程序中的作用,最常見的是繞過驗證和提取數(shù)據(jù)。
不合法/邏輯錯誤查詢(SQL注入攻擊發(fā)現(xiàn)技術(shù)) 其攻擊動機是識別可攻擊參數(shù)、識別數(shù)據(jù)庫的類型和版本等信息或提取數(shù)據(jù)等。該類型的攻擊其實是攻擊的一個預(yù)備步驟,用于為其他類型的攻擊收集信息,包括數(shù)據(jù)庫的類型和結(jié)構(gòu)。語法錯誤可以識別可注入?yún)?shù),類型轉(zhuǎn)換錯誤可以推導(dǎo)某列的數(shù)據(jù)類型或者取得數(shù)據(jù),邏輯錯誤可以返回導(dǎo)致錯誤的表和列的名字。從這些錯誤信息中得到的信息為其他攻擊方法收集了必要的攻擊信息。
Union查詢攻擊 Union查詢動機是繞過驗證或者提取數(shù)據(jù)。攻擊者在查詢語句中注入Union SELECT語句,并且因為用戶控制“SELECT語句”的內(nèi)容,攻擊者可以得到想要的信息。
附帶查詢攻擊 該類型攻擊是為提取數(shù)據(jù)、添加和修改數(shù)據(jù)、實現(xiàn)拒絕服務(wù)或者執(zhí)行遠(yuǎn)程命令。該類型的攻擊并不改變原有查詢,而是在原有查詢后插入新的查詢語句。數(shù)據(jù)庫配置如果允許執(zhí)行多個查詢語句,那么攻擊者將能在原有查詢后插入任何SQL命令,包括存儲過程(系統(tǒng)或用戶自定義的),因而這種攻擊能造成巨大危害。
利用存儲過程攻擊 數(shù)據(jù)庫廠商用一些標(biāo)準(zhǔn)存儲過程來擴展數(shù)據(jù)庫的功能并允許其與系統(tǒng)交互,或者用戶會自定義一些存儲過程。通過其他類型攻擊搜集到數(shù)據(jù)庫的相關(guān)信息(數(shù)據(jù)庫類型)后,就可以構(gòu)造執(zhí)行存儲過程的命令。而人們以為用存儲過程寫程序就能避免注入攻擊漏洞,這樣的說法是錯誤的。
推斷 可以識別可注入?yún)?shù)、提取數(shù)據(jù)或確定數(shù)據(jù)庫模式。該種類型的攻擊利用網(wǎng)站對用戶輸入的返回信息,推導(dǎo)數(shù)據(jù)庫模式和可注入?yún)?shù)。該類型的攻擊所構(gòu)造的查詢執(zhí)行后得到的答案有兩種:真或假。
替換編碼 該種攻擊主要是為逃避檢測。通過替換編碼修改注入文本,以達(dá)到逃避系統(tǒng)已有檢測機制(如編碼防御或自動防御技術(shù))的目的,經(jīng)常與其他類型攻擊結(jié)合使用。
1.3 網(wǎng)站注入攻擊的流程
網(wǎng)站注入攻擊主要是通過構(gòu)建特殊的輸入,這些輸入往往是網(wǎng)站語法的一些組合。這些輸入將作為參數(shù)傳入Web應(yīng)用程序。通過執(zhí)行網(wǎng)站語句而執(zhí)行攻擊者想要的操作。其主要步驟分為:識別可注入?yún)?shù)→識別數(shù)據(jù)庫類型和版本→確定數(shù)據(jù)庫模式→提取數(shù)據(jù)→添加和修改數(shù)據(jù)→實現(xiàn)拒絕服務(wù)→逃避檢測→繞過驗證→執(zhí)行命令[2]。
一般流程都可歸納如下。
⑴ 尋找SQL注入點:在含有傳遞參數(shù)的動態(tài)網(wǎng)頁中,判斷是否存在SQL注入漏洞。
⑵ 判斷數(shù)據(jù)庫的類型:對于不同的數(shù)據(jù)庫管理系統(tǒng)其攻擊方式也不同。
⑶ 如果是Access數(shù)據(jù)庫:通過探測數(shù)據(jù)庫表名和列名,并探測列值(字段值)了解數(shù)據(jù)庫的相關(guān)信息。該攻擊實施的動機是確定數(shù)據(jù)庫的模式,主要通過不合法/邏輯錯誤查詢和推斷的攻擊方法實現(xiàn)。在得到數(shù)據(jù)庫的相關(guān)信息(確定數(shù)據(jù)庫模式)之后,就可以擴張權(quán)限。
⑷ 如果是MS SQL Server數(shù)據(jù)庫系統(tǒng):首先要判斷存在注入點的數(shù)據(jù)庫是否支持多句查詢、子查詢、數(shù)據(jù)庫用戶賬號、數(shù)據(jù)庫用戶權(quán)限等。如果用戶權(quán)限為sh,且數(shù)據(jù)庫中存在xp--cmdshll存儲過程,則可以直接轉(zhuǎn)⑹。如果用戶權(quán)限不是sh,則接下來可以有兩種方法擴張權(quán)限:一種是步驟⑶中給出的確定數(shù)據(jù)庫相關(guān)信息;另一種是利用系統(tǒng)表Sysobjeets得到數(shù)據(jù)庫表名和列名,通過不合法/邏輯錯誤查詢和推斷方法確定字段值。
⑸ 擴張權(quán)限:通過步驟⑶、⑷確定了數(shù)據(jù)庫模式之后就可以擴張權(quán)限。
⑹ 實施真正的攻擊:擁有相應(yīng)的權(quán)限,就可以實施攻擊。攻擊包括添加管理員賬號、開放3389遠(yuǎn)程終端服務(wù)、通過后臺的上傳功能上傳網(wǎng)頁木馬實施對服務(wù)器的控制等。
1.4 網(wǎng)站注入的實現(xiàn)原理
根據(jù)網(wǎng)站注入的原理不同,網(wǎng)站注入方式分為三類:常規(guī)注入、字典猜解注入和盲注入[3]。
常規(guī)注入 常規(guī)注入方法是根據(jù)攻擊者惡意構(gòu)造的SQL語句返回的錯誤信息的內(nèi)容獲取有用的信息。在實施真正的攻擊之前需要收集數(shù)據(jù)庫的相關(guān)信息,并以文字的形式分類對這些攻擊的依據(jù)和所能得到的信息等方面進(jìn)行分析。通過攻擊者惡意構(gòu)造的SQL語句返回的錯誤信息的內(nèi)容獲取了數(shù)據(jù)庫用戶的名字。運用同樣的原理,可以判斷網(wǎng)站是否存在漏洞,以及數(shù)據(jù)庫的類型、用戶權(quán)限、表名、列名和字段名。
字典猜解注入 當(dāng)前管理員和多數(shù)網(wǎng)絡(luò)用戶的安全意識不強,字段名稱都遵循某種特定方式,字典猜解將常用的字段名稱生成一部字典,用該字典中的數(shù)據(jù)探測數(shù)據(jù)庫的相關(guān)信息。
盲注入 盲注入方法是基于推理的。通過問服務(wù)器“真/假”問題,查看客戶端頁面反應(yīng)獲取信息。也就是說,在提交的數(shù)據(jù)中注入猜測的數(shù)據(jù),提交到數(shù)據(jù)庫中,如果正確返回結(jié)果,則該數(shù)據(jù)即為所要猜測的值,如果返回錯誤,則繼續(xù)問是否為其他數(shù)據(jù)。
2 防御網(wǎng)站注入攻擊方法
2.1 數(shù)據(jù)庫管理員角度
⑴ 數(shù)據(jù)庫管理員從數(shù)據(jù)庫服務(wù)器上移除所有數(shù)據(jù)庫的示例腳本,以便減少冗余腳本數(shù)據(jù)量。
⑵ 移除不需要用到的存儲過程,尤其是訪問注冊表的存儲過程。
⑶ 為每一個網(wǎng)站單獨分配一個專門的操作賬戶,盡可能減少使用sa等默認(rèn)賬戶登錄數(shù)據(jù)庫及系統(tǒng)。
2.2 應(yīng)用程序設(shè)計員角度
大部分Web應(yīng)用常見漏洞,均是由于在Web應(yīng)用開發(fā)中,開發(fā)者沒有對用戶輸入的參數(shù)進(jìn)行檢測或檢測不嚴(yán)格造成的。所以,Web應(yīng)用開發(fā)者應(yīng)該樹立強烈的安全意識,在開發(fā)中編寫安全代碼;對用戶提交的URL、查詢關(guān)鍵字、HTTP頭、POSE數(shù)據(jù)等進(jìn)行嚴(yán)格的檢測和限制,只接受一定長度范圍內(nèi)、采用適當(dāng)格式及編碼的字符,阻塞、過濾或者忽略其他的任何字符。
⑴ 對異常處理錯誤頁面跳轉(zhuǎn)到指定頁面,杜絕將異常處理信息過多的暴露給用戶。
⑵ 對于動態(tài)構(gòu)造SQL 查詢的場合,強烈建議使用以下技術(shù)以減少注入漏洞:
A. 替換單引號,即把所有單獨出現(xiàn)的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義[4];
B. 刪除用戶輸入內(nèi)容中的所有連字符,防止攻擊者構(gòu)造出類似“select*from tbuser where userName='admin1'-and passWord=''”之類的查詢,因為這類查詢的后半部分已經(jīng)被注釋掉,不再有效,攻擊者只要知道一個合法的用戶登錄名稱,根本不需要知道用戶的密碼就可以順利獲得訪問權(quán)限。對于用來執(zhí)行查詢的數(shù)據(jù)庫帳戶,限制其權(quán)限。用不同的帳戶執(zhí)行查詢、插入、更新、刪除操作。由于隔離了不同帳戶可執(zhí)行的操作,因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
⑶ 限制表單或查詢字符串輸入的長度。如果用戶的登錄名字最多只有10個字符,那么不要認(rèn)可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
⑷ 將用戶登錄名稱、密碼等數(shù)據(jù)加密保存。加密用戶輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫中保存的數(shù)據(jù)作比較,用戶輸入的數(shù)據(jù)不再對數(shù)據(jù)庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
2.3 系統(tǒng)管理員角度
作為負(fù)責(zé)網(wǎng)站日常維護(hù)管理工作的Web管理員,必須及時跟蹤并安裝最新的、支撐Web網(wǎng)站運行的各種軟件的安全補丁,確保攻擊者無法通過軟件漏洞對網(wǎng)站進(jìn)行攻擊。除了軟件本身的漏洞外,Web服務(wù)器、數(shù)據(jù)庫等不正確的配置也可能導(dǎo)致Web應(yīng)用安全問題。Web網(wǎng)站管理員應(yīng)該對網(wǎng)站各種軟件配置進(jìn)行仔細(xì)檢測,降低出現(xiàn)安全問題的概率。
此外,Web管理員還應(yīng)該定期審查Web服務(wù)器日志,檢測是否存在異常訪問,及早發(fā)現(xiàn)潛在的安全問題。
3 結(jié)束語
本文深入介紹并討論了SQL注入攻擊的途徑、分類和注入的流程、原理等,結(jié)合目前普遍采用的攻擊測試方法,提出了針對數(shù)據(jù)庫管理員、應(yīng)用程序設(shè)計員和系統(tǒng)管理員對防范注入攻擊方法,極大限度地減少網(wǎng)站注入攻擊的可能性,保護(hù)數(shù)據(jù)庫的安全。然而,通過人工的方法對網(wǎng)站存在的SQL注入式漏洞進(jìn)行檢測,容易出現(xiàn)遺漏,因此,下一步將重點研究注入式漏洞的自動檢測技術(shù)及其應(yīng)用。
參考文獻(xiàn):
[1] Anley C. Advanced SQL injection in SQL server applications[J].White paper, Next Generation Security Software Ltd,2002.
[2] Halfond W G, Viegas J, Orso A. A classification of SQL-injection attacks and countermeasures[C]//Proceedings of the IEEE International Symposium on Secure Software Engineering,Arlington,VA,USA,2006:13-15
[3] 張卓.SQL注入技術(shù)與防范措施研究[D].上海交通大學(xué),2007:50-51
[4] Yuki Kosuga, Kenji Kono, Miyuki Hanaoka, Miho Hishiyama, Yu Takahama. Sania:Syntactic and Semantic Analysis for Automated Testing against SQL injection. IEEE Computer Society 2007. Miami Beach,F(xiàn)lorida,USA.2007.USA.,IEEE 2007:107-117