尹向兵 周 婷
(1 安徽警官職業(yè)學(xué)院教務(wù)處,安徽 合肥 230031)(2 安徽城市管理職業(yè)學(xué)院國(guó)際商務(wù)系,安徽 合肥 230011)
在Web應(yīng)用程序架構(gòu)中,大部分都是配合數(shù)據(jù)庫(kù)來(lái)保存相關(guān)的數(shù)據(jù)。例如會(huì)員登錄、留言板、討論區(qū)的賬號(hào)、密碼、真實(shí)姓名、住址及聯(lián)系電話等個(gè)人信息,或是購(gòu)物系統(tǒng)的商品與價(jià)格等數(shù)據(jù)記錄,都是動(dòng)態(tài)存儲(chǔ)在數(shù)據(jù)庫(kù)中。
Web應(yīng)用程序使用SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)。例如,select表達(dá)式用來(lái)讀取數(shù)據(jù)庫(kù)的記錄,insert表達(dá)式用來(lái)在數(shù)據(jù)庫(kù)中插入新的記錄,delete表達(dá)式用來(lái)刪除數(shù)據(jù)庫(kù)中的記錄。設(shè)置了SQL語(yǔ)句的字符串后,使用數(shù)據(jù)庫(kù)query這類的函數(shù)來(lái)將SQL語(yǔ)句傳遞給數(shù)據(jù)庫(kù)系統(tǒng)處理,數(shù)據(jù)庫(kù)處理完后,會(huì)返回Web應(yīng)用程序所需要的數(shù)據(jù)庫(kù)記錄。
SQL注入攻擊(SQL Injection)是利用在客戶端的網(wǎng)頁(yè)中輸入數(shù)據(jù),例如,在會(huì)員登錄文本框中輸入用戶的賬號(hào)和密碼,用戶在提交會(huì)員登錄文本框的數(shù)據(jù)后,Web應(yīng)用程序會(huì)將這些賬號(hào)和密碼與網(wǎng)站數(shù)據(jù)庫(kù)中的相關(guān)記錄相比較,或是插入到數(shù)據(jù)庫(kù)內(nèi)。
2.1 什么是SQL注入
一般來(lái)說(shuō),SQL注入是應(yīng)用SQL命令插入到Web網(wǎng)頁(yè)頁(yè)面表單中輸入查詢值,或者是輸入域名或頁(yè)面請(qǐng)求的值傳遞查詢字符串,從而完成欺騙服務(wù)器,在站點(diǎn)數(shù)據(jù)庫(kù)中執(zhí)行惡意的SQL命令。如前幾年很多娛樂(lè)網(wǎng)站和部分交易所站點(diǎn)泄露站點(diǎn)會(huì)員信息等情況,大多數(shù)就是利用動(dòng)態(tài)網(wǎng)站表單遞交查詢字符暴出來(lái)的,這類表單特別容易受到SQL注入式攻擊[1]。
當(dāng)應(yīng)用程序使用輸入內(nèi)容來(lái)構(gòu)造動(dòng)態(tài)SQL語(yǔ)句以訪問(wèn)數(shù)據(jù)庫(kù)時(shí),會(huì)發(fā)生SQL注入攻擊。如果代碼使用存儲(chǔ)過(guò)程,而這些存儲(chǔ)過(guò)程作為包含未篩選的用戶輸入的字符串來(lái)傳遞,也會(huì)發(fā)生SQL注入。
2.2 SQL注入攻擊原理
當(dāng)客戶端訪問(wèn)服務(wù)器數(shù)據(jù)庫(kù)時(shí),有時(shí)產(chǎn)生錯(cuò)誤信息,SQL注入攻擊需要利用服務(wù)器返回出錯(cuò)信息判斷進(jìn)行網(wǎng)絡(luò)攻擊。當(dāng)然,攻擊的網(wǎng)站是動(dòng)態(tài)網(wǎng)站才有可能存在注入漏洞,如ASP、PHP、ASP.NET、JSP等服務(wù)端技術(shù)開(kāi)發(fā)的網(wǎng)站。一般訪問(wèn)地址存在參數(shù)傳遞,有時(shí)有一個(gè)參數(shù),有時(shí)有多個(gè)參數(shù), 形式如 http://www.sina.com.cn/abc.aspx?id=xx等,參數(shù)可以是整型或字符串??傊?,對(duì)于動(dòng)態(tài)連接數(shù)據(jù)庫(kù)的網(wǎng)站都可能存在SQL注入漏洞[2]。
當(dāng)訪問(wèn)帶參數(shù)地址連接時(shí),SQL注入攻擊利用構(gòu)建特殊的值輸入,通過(guò)現(xiàn)有的SQL語(yǔ)句,再組合輸入的特殊字符,完成SQL語(yǔ)句組合,將輸入的值作為傳入服務(wù)器程序,當(dāng)服務(wù)器執(zhí)行到構(gòu)建的SQL語(yǔ)句從而執(zhí)行攻擊者語(yǔ)句,完成他們想要的操作。以應(yīng)該程序的用戶管理表中數(shù)據(jù)的查詢情況為例,說(shuō)明SQL注入攻擊的一般原理。
用戶登錄后臺(tái)網(wǎng)站,首先應(yīng)進(jìn)行登錄驗(yàn)證,一般是用戶管理表一類,在此表中對(duì)用戶名和密碼兩個(gè)字段值進(jìn)行查詢,通過(guò)SELECT語(yǔ)句完成查詢操作,在SELECT語(yǔ)句中通過(guò)比對(duì)用戶名和密碼,完成身份驗(yàn)證進(jìn)行授權(quán)訪問(wèn),一般使用的查詢語(yǔ)句為:
Select*from XXX where 用戶名=“tbxname.Text”and 密碼=“tbxpwd.Text”;
上述語(yǔ)句中,若我們給用戶名和密碼字段內(nèi)賦值“用戶名’or 1=1--”和”qqq”,則查詢分析器中顯示為select*from users where用戶名=’admin’or 1=1--and 密碼=’qqq’,這個(gè)查詢語(yǔ)句分別進(jìn)行兩個(gè)判斷,我們都知道1=1在邏輯判斷上始終是恒成立的,完成萬(wàn)能秘鑰輸入判斷[3]。
3.1 以明小子工具為例
本部分內(nèi)容是基于實(shí)驗(yàn)室模擬沙盤實(shí)現(xiàn):某公司的web服務(wù)器IP為 192.168.72.81,, 存在SQL注入漏洞,明小子是專門檢測(cè)和入侵這樣的網(wǎng)站,在互聯(lián)網(wǎng)上用明小子等工具來(lái)攻擊這樣網(wǎng)站的方法大致如下:
步驟一:用明小子測(cè)試該 192.168.72.69(內(nèi)網(wǎng)沙盤服務(wù)器地址)網(wǎng)站是否存在這樣漏洞,如有繼續(xù)。否則重復(fù)步驟一;
步驟二:對(duì)表進(jìn)行猜解;
步驟三:對(duì)表中的字段進(jìn)行猜解;
步驟四:對(duì)表中的字段內(nèi)容進(jìn)行猜解;
步驟五:對(duì)管理入口進(jìn)行掃描;
步驟六:用剛才猜解得到的管理員賬號(hào)進(jìn)行登錄,進(jìn)入網(wǎng)站后臺(tái);
步驟七:上傳文件即小馬;
最后上傳大馬獲取webshell,再慢慢提權(quán),這就是web滲透的全過(guò)程。
3.2 萬(wàn)能密碼攻擊
本部分內(nèi)容是基于實(shí)驗(yàn)室模擬沙盤實(shí)現(xiàn):某公司的 web 服務(wù)器 IP 為 192.168.72.81,端口號(hào)8080,存在SQL注入漏洞,萬(wàn)能密碼就是攻擊方法之一,進(jìn)入該公司web服務(wù)器的主頁(yè)面即為登錄頁(yè)面,我們知道該公司的登錄賬號(hào)是aaaaaa,但是不知道該賬號(hào)的密碼,現(xiàn)在我們用萬(wàn)能密碼來(lái)進(jìn)行攻擊,登錄成功后顯示該網(wǎng)站的賬號(hào)及密碼信息。
方法一:在賬號(hào)文本框中輸入用戶名和萬(wàn)能密碼,密碼框?yàn)榭?,以本例題為例如:aaaaa’or’1’=’1;
方法二:在賬號(hào)框和密碼框都輸入萬(wàn)能密碼,以本例題為例如:’or’1’=’1。進(jìn)入網(wǎng)站后臺(tái)。
3.3 互聯(lián)網(wǎng)中實(shí)戰(zhàn)
步驟一:尋找互聯(lián)網(wǎng)中動(dòng)態(tài)網(wǎng)站,復(fù)制帶參數(shù)的地址,如安徽某制藥有限公司新聞頁(yè)面地址http://XXXXXXX.20.sinchen.cn/news/shownews.asp?id=122,將地址拷貝到“旁注WEB綜合檢測(cè)程序Ver3.6專用版”軟件的注入點(diǎn)一欄中,然后點(diǎn)擊“開(kāi)始檢測(cè)”,若網(wǎng)站存在漏洞,則提示“恭喜,改URL可以注入!數(shù)據(jù)庫(kù)類型:XXX數(shù)據(jù)庫(kù)”,本例結(jié)果如圖1所示,得出此網(wǎng)站存在SQL注入;
步驟二:根據(jù)在圖1界面,接著依次點(diǎn)擊“猜解表名—猜解列名—猜解內(nèi)容”,得出如圖2結(jié)果,根據(jù)此次操作猜解出網(wǎng)站后臺(tái)登錄用戶名和密碼值;
步驟三:將步驟一中網(wǎng)站地址復(fù)制到“管理入口掃描”界面的注入點(diǎn)中,再點(diǎn)擊“掃描后臺(tái)地址”,得到此網(wǎng)站后臺(tái)登錄地址列表,如圖3;
步驟四:根據(jù)步驟三掃描到的后臺(tái)地址,進(jìn)入網(wǎng)站后臺(tái)登錄界面,再根據(jù)步驟二猜解的用戶名(kui)和密碼(admin)登錄進(jìn)入后臺(tái),此時(shí)進(jìn)行后臺(tái)管理;
步驟五:找到后臺(tái)上傳界面,上傳事前設(shè)置好的大馬程序,獲取網(wǎng)站web shell,達(dá)到攻擊服務(wù)器IIS應(yīng)用程序目的。
圖1
圖2
圖3
基于腳本的SQL注入防范主要是利用網(wǎng)站的獲取參數(shù)的地方,要防止ASP.NET Web APP被SQL注入式攻擊并不是一件特別簡(jiǎn)單的事情,主要的注入攻擊防范措施有如下幾個(gè)方面:
4.1 URL 傳值防范
對(duì)于普通id傳遞數(shù)值一般沒(méi)什么問(wèn)題,當(dāng)傳遞的值是嵌套查詢時(shí),那么sql查詢語(yǔ)句就變成了“select*from table1 where partid=(id delete from table2)”。一次提交多條語(yǔ)句,這個(gè)既方便了操作,同時(shí)給數(shù)據(jù)庫(kù)帶來(lái)很大的安全隱患,當(dāng)SQL語(yǔ)句執(zhí)行后,數(shù)據(jù)庫(kù)table2中的數(shù)據(jù)則就被刪除了。
解決辦法則是驗(yàn)證傳遞過(guò)來(lái)值得數(shù)據(jù)類型,如果是整型值就不存在注入,反之則有注入的危險(xiǎn)。通過(guò)TryParse、正則表達(dá)式或自己編寫代碼驗(yàn)證。
4.2 防猜解
此方法就是根據(jù)個(gè)人的經(jīng)驗(yàn)猜表名,一般來(lái)說(shuō),通過(guò)語(yǔ)句進(jìn)行判斷,如 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*)from TestDB.dbo.表名)>0若表名存在,則abc.asp工作正常,否則異常。如此循環(huán),直到猜到系統(tǒng)帳號(hào)表的名稱。
數(shù)據(jù)庫(kù)表名稱、表和字段名稱命名既要見(jiàn)名知意又要添加特殊符號(hào)防猜解,特別對(duì)于用戶表,如 uersname,password,user_name,pwd 等如前面提及啊D和明小子工具,這些攻擊工具內(nèi)保存大量常用的已知表和字段名稱,很容易猜解出來(lái)。
4.3 替換單引號(hào)。 如 select*from Admin where username= ″or′1′=′1′AND password= ″or ′1′=′1′,將出現(xiàn)單引號(hào)的地方都替換為雙引號(hào),防止注入攻擊。
4.4 限制表單或查詢字符串輸入的長(zhǎng)度。如果用戶的登錄名字最多只有10個(gè)字符,那么不要認(rèn)可表單中輸入的10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度[4]。
4.5 數(shù)據(jù)庫(kù)中賬號(hào)類表數(shù)據(jù)加密。加密(如MD5加密)用戶輸入的數(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類 有 一 個(gè) HashPassword-ForStoringInConfigFile,非常適合于對(duì)輸入數(shù)據(jù)進(jìn)行消毒處理[5]。
隨著Web應(yīng)用技術(shù)的普及,SQL注入攻擊被攻擊者廣泛地使用,人們對(duì)于SQL攻擊已經(jīng)越來(lái)越重視。本文對(duì)SQL注入攻擊的方法、原理以及攻擊實(shí)施過(guò)程進(jìn)行闡述和總結(jié),并給出了常用攻擊方法。本文通過(guò)虛擬機(jī)在Server 2008+SQL Server 2008環(huán)境測(cè)試中通過(guò)。
[1]高明,辛陽(yáng).SQL注入攻擊防范方案的分析與設(shè)計(jì)[A].2011年通信與信息技術(shù)新進(jìn)展——第八屆中國(guó)通信學(xué)會(huì)學(xué)術(shù)年會(huì)論文集[C].2011.
[2]盧俊.SQL注入與XSS攻擊防范方法的研究以及防范模型的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2011.
[3]褚龍現(xiàn).ASP.NET 應(yīng)用中 SQL 注入攻擊的分析與防范[J].計(jì)算機(jī)與現(xiàn)代化,2014,(3).
[4]陳智堅(jiān).數(shù)據(jù)庫(kù) SQL 注入攻擊技術(shù)與防范[J].福建電腦,2013,(2).
[5]黃輝.基于SP防范SQL注入攻擊的三層信息系統(tǒng)安全設(shè)計(jì)研究[D].情報(bào)探索,2013,(10).