尹向兵 周 婷
(1 安徽警官職業(yè)學(xué)院教務(wù)處,安徽 合肥 230031)(2 安徽城市管理職業(yè)學(xué)院國際商務(wù)系,安徽 合肥 230011)
在Web應(yīng)用程序架構(gòu)中,大部分都是配合數(shù)據(jù)庫來保存相關(guān)的數(shù)據(jù)。例如會員登錄、留言板、討論區(qū)的賬號、密碼、真實姓名、住址及聯(lián)系電話等個人信息,或是購物系統(tǒng)的商品與價格等數(shù)據(jù)記錄,都是動態(tài)存儲在數(shù)據(jù)庫中。
Web應(yīng)用程序使用SQL語句來操作數(shù)據(jù)庫。例如,select表達式用來讀取數(shù)據(jù)庫的記錄,insert表達式用來在數(shù)據(jù)庫中插入新的記錄,delete表達式用來刪除數(shù)據(jù)庫中的記錄。設(shè)置了SQL語句的字符串后,使用數(shù)據(jù)庫query這類的函數(shù)來將SQL語句傳遞給數(shù)據(jù)庫系統(tǒng)處理,數(shù)據(jù)庫處理完后,會返回Web應(yīng)用程序所需要的數(shù)據(jù)庫記錄。
SQL注入攻擊(SQL Injection)是利用在客戶端的網(wǎng)頁中輸入數(shù)據(jù),例如,在會員登錄文本框中輸入用戶的賬號和密碼,用戶在提交會員登錄文本框的數(shù)據(jù)后,Web應(yīng)用程序會將這些賬號和密碼與網(wǎng)站數(shù)據(jù)庫中的相關(guān)記錄相比較,或是插入到數(shù)據(jù)庫內(nèi)。
2.1 什么是SQL注入
一般來說,SQL注入是應(yīng)用SQL命令插入到Web網(wǎng)頁頁面表單中輸入查詢值,或者是輸入域名或頁面請求的值傳遞查詢字符串,從而完成欺騙服務(wù)器,在站點數(shù)據(jù)庫中執(zhí)行惡意的SQL命令。如前幾年很多娛樂網(wǎng)站和部分交易所站點泄露站點會員信息等情況,大多數(shù)就是利用動態(tài)網(wǎng)站表單遞交查詢字符暴出來的,這類表單特別容易受到SQL注入式攻擊[1]。
當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)SQL語句以訪問數(shù)據(jù)庫時,會發(fā)生SQL注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞,也會發(fā)生SQL注入。
2.2 SQL注入攻擊原理
當(dāng)客戶端訪問服務(wù)器數(shù)據(jù)庫時,有時產(chǎn)生錯誤信息,SQL注入攻擊需要利用服務(wù)器返回出錯信息判斷進行網(wǎng)絡(luò)攻擊。當(dāng)然,攻擊的網(wǎng)站是動態(tài)網(wǎng)站才有可能存在注入漏洞,如ASP、PHP、ASP.NET、JSP等服務(wù)端技術(shù)開發(fā)的網(wǎng)站。一般訪問地址存在參數(shù)傳遞,有時有一個參數(shù),有時有多個參數(shù), 形式如 http://www.sina.com.cn/abc.aspx?id=xx等,參數(shù)可以是整型或字符串??傊?,對于動態(tài)連接數(shù)據(jù)庫的網(wǎng)站都可能存在SQL注入漏洞[2]。
當(dāng)訪問帶參數(shù)地址連接時,SQL注入攻擊利用構(gòu)建特殊的值輸入,通過現(xiàn)有的SQL語句,再組合輸入的特殊字符,完成SQL語句組合,將輸入的值作為傳入服務(wù)器程序,當(dāng)服務(wù)器執(zhí)行到構(gòu)建的SQL語句從而執(zhí)行攻擊者語句,完成他們想要的操作。以應(yīng)該程序的用戶管理表中數(shù)據(jù)的查詢情況為例,說明SQL注入攻擊的一般原理。
用戶登錄后臺網(wǎng)站,首先應(yīng)進行登錄驗證,一般是用戶管理表一類,在此表中對用戶名和密碼兩個字段值進行查詢,通過SELECT語句完成查詢操作,在SELECT語句中通過比對用戶名和密碼,完成身份驗證進行授權(quán)訪問,一般使用的查詢語句為:
Select*from XXX where 用戶名=“tbxname.Text”and 密碼=“tbxpwd.Text”;
上述語句中,若我們給用戶名和密碼字段內(nèi)賦值“用戶名’or 1=1--”和”qqq”,則查詢分析器中顯示為select*from users where用戶名=’admin’or 1=1--and 密碼=’qqq’,這個查詢語句分別進行兩個判斷,我們都知道1=1在邏輯判斷上始終是恒成立的,完成萬能秘鑰輸入判斷[3]。
3.1 以明小子工具為例
本部分內(nèi)容是基于實驗室模擬沙盤實現(xiàn):某公司的web服務(wù)器IP為 192.168.72.81,, 存在SQL注入漏洞,明小子是專門檢測和入侵這樣的網(wǎng)站,在互聯(lián)網(wǎng)上用明小子等工具來攻擊這樣網(wǎng)站的方法大致如下:
步驟一:用明小子測試該 192.168.72.69(內(nèi)網(wǎng)沙盤服務(wù)器地址)網(wǎng)站是否存在這樣漏洞,如有繼續(xù)。否則重復(fù)步驟一;
步驟二:對表進行猜解;
步驟三:對表中的字段進行猜解;
步驟四:對表中的字段內(nèi)容進行猜解;
步驟五:對管理入口進行掃描;
步驟六:用剛才猜解得到的管理員賬號進行登錄,進入網(wǎng)站后臺;
步驟七:上傳文件即小馬;
最后上傳大馬獲取webshell,再慢慢提權(quán),這就是web滲透的全過程。
3.2 萬能密碼攻擊
本部分內(nèi)容是基于實驗室模擬沙盤實現(xiàn):某公司的 web 服務(wù)器 IP 為 192.168.72.81,端口號8080,存在SQL注入漏洞,萬能密碼就是攻擊方法之一,進入該公司web服務(wù)器的主頁面即為登錄頁面,我們知道該公司的登錄賬號是aaaaaa,但是不知道該賬號的密碼,現(xiàn)在我們用萬能密碼來進行攻擊,登錄成功后顯示該網(wǎng)站的賬號及密碼信息。
方法一:在賬號文本框中輸入用戶名和萬能密碼,密碼框為空,以本例題為例如:aaaaa’or’1’=’1;
方法二:在賬號框和密碼框都輸入萬能密碼,以本例題為例如:’or’1’=’1。進入網(wǎng)站后臺。
3.3 互聯(lián)網(wǎng)中實戰(zhàn)
步驟一:尋找互聯(lián)網(wǎng)中動態(tài)網(wǎng)站,復(fù)制帶參數(shù)的地址,如安徽某制藥有限公司新聞頁面地址http://XXXXXXX.20.sinchen.cn/news/shownews.asp?id=122,將地址拷貝到“旁注WEB綜合檢測程序Ver3.6專用版”軟件的注入點一欄中,然后點擊“開始檢測”,若網(wǎng)站存在漏洞,則提示“恭喜,改URL可以注入!數(shù)據(jù)庫類型:XXX數(shù)據(jù)庫”,本例結(jié)果如圖1所示,得出此網(wǎng)站存在SQL注入;
步驟二:根據(jù)在圖1界面,接著依次點擊“猜解表名—猜解列名—猜解內(nèi)容”,得出如圖2結(jié)果,根據(jù)此次操作猜解出網(wǎng)站后臺登錄用戶名和密碼值;
步驟三:將步驟一中網(wǎng)站地址復(fù)制到“管理入口掃描”界面的注入點中,再點擊“掃描后臺地址”,得到此網(wǎng)站后臺登錄地址列表,如圖3;
步驟四:根據(jù)步驟三掃描到的后臺地址,進入網(wǎng)站后臺登錄界面,再根據(jù)步驟二猜解的用戶名(kui)和密碼(admin)登錄進入后臺,此時進行后臺管理;
步驟五:找到后臺上傳界面,上傳事前設(shè)置好的大馬程序,獲取網(wǎng)站web shell,達到攻擊服務(wù)器IIS應(yīng)用程序目的。

圖1

圖2

圖3
基于腳本的SQL注入防范主要是利用網(wǎng)站的獲取參數(shù)的地方,要防止ASP.NET Web APP被SQL注入式攻擊并不是一件特別簡單的事情,主要的注入攻擊防范措施有如下幾個方面:
4.1 URL 傳值防范
對于普通id傳遞數(shù)值一般沒什么問題,當(dāng)傳遞的值是嵌套查詢時,那么sql查詢語句就變成了“select*from table1 where partid=(id delete from table2)”。一次提交多條語句,這個既方便了操作,同時給數(shù)據(jù)庫帶來很大的安全隱患,當(dāng)SQL語句執(zhí)行后,數(shù)據(jù)庫table2中的數(shù)據(jù)則就被刪除了。
解決辦法則是驗證傳遞過來值得數(shù)據(jù)類型,如果是整型值就不存在注入,反之則有注入的危險。通過TryParse、正則表達式或自己編寫代碼驗證。
4.2 防猜解
此方法就是根據(jù)個人的經(jīng)驗猜表名,一般來說,通過語句進行判斷,如 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*)from TestDB.dbo.表名)>0若表名存在,則abc.asp工作正常,否則異常。如此循環(huán),直到猜到系統(tǒng)帳號表的名稱。
數(shù)據(jù)庫表名稱、表和字段名稱命名既要見名知意又要添加特殊符號防猜解,特別對于用戶表,如 uersname,password,user_name,pwd 等如前面提及啊D和明小子工具,這些攻擊工具內(nèi)保存大量常用的已知表和字段名稱,很容易猜解出來。
4.3 替換單引號。 如 select*from Admin where username= ″or′1′=′1′AND password= ″or ′1′=′1′,將出現(xiàn)單引號的地方都替換為雙引號,防止注入攻擊。
4.4 限制表單或查詢字符串輸入的長度。如果用戶的登錄名字最多只有10個字符,那么不要認(rèn)可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度[4]。
4.5 數(shù)據(jù)庫中賬號類表數(shù)據(jù)加密。加密(如MD5加密)用戶輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫中保存的數(shù)據(jù)比較,這相當(dāng)于對用戶輸入的數(shù)據(jù)進行了“消毒”處理,用戶輸入的數(shù)據(jù)不再對數(shù)據(jù)庫有任何特殊的意義,從而也就防止了攻擊者注 入 SQL 命 令 。 System.Web.Security.FormsAuthentication類 有 一 個 HashPassword-ForStoringInConfigFile,非常適合于對輸入數(shù)據(jù)進行消毒處理[5]。
隨著Web應(yīng)用技術(shù)的普及,SQL注入攻擊被攻擊者廣泛地使用,人們對于SQL攻擊已經(jīng)越來越重視。本文對SQL注入攻擊的方法、原理以及攻擊實施過程進行闡述和總結(jié),并給出了常用攻擊方法。本文通過虛擬機在Server 2008+SQL Server 2008環(huán)境測試中通過。
[1]高明,辛陽.SQL注入攻擊防范方案的分析與設(shè)計[A].2011年通信與信息技術(shù)新進展——第八屆中國通信學(xué)會學(xué)術(shù)年會論文集[C].2011.
[2]盧俊.SQL注入與XSS攻擊防范方法的研究以及防范模型的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2011.
[3]褚龍現(xiàn).ASP.NET 應(yīng)用中 SQL 注入攻擊的分析與防范[J].計算機與現(xiàn)代化,2014,(3).
[4]陳智堅.數(shù)據(jù)庫 SQL 注入攻擊技術(shù)與防范[J].福建電腦,2013,(2).
[5]黃輝.基于SP防范SQL注入攻擊的三層信息系統(tǒng)安全設(shè)計研究[D].情報探索,2013,(10).