SQL攻擊的分析與防范_第1頁(yè)
SQL攻擊的分析與防范_第2頁(yè)
SQL攻擊的分析與防范_第3頁(yè)
SQL攻擊的分析與防范_第4頁(yè)
SQL攻擊的分析與防范_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、sql攻擊的分析與防范 摘 要 自進(jìn)入2008年以來(lái),網(wǎng)絡(luò)界經(jīng)受了前所未有的sql注入式攻擊,這些網(wǎng)站的頁(yè)面被修改、數(shù)據(jù)庫(kù)被刪除或程序被植入惡意代碼。給這些網(wǎng)站帶來(lái)巨大的損失。本文結(jié)合多年的網(wǎng)站程序設(shè)計(jì)與維護(hù)的經(jīng)驗(yàn)來(lái)談?wù)剆ql注入式攻擊的一般原理、注入方法及防范措施。關(guān)鍵字sql,注入,攻擊,方法,防范,安全近來(lái),當(dāng)打開(kāi)網(wǎng)站,查看網(wǎng)頁(yè)新聞時(shí),會(huì)看到一系列有關(guān)sql注入攻擊的新聞:1月,自動(dòng)sql注入攻擊了超過(guò)70,000個(gè)美國(guó)網(wǎng)站。4月,f-secure表示其發(fā)現(xiàn)超過(guò)五十萬(wàn)網(wǎng)頁(yè)都被惡意javascript代碼攻擊。7月,索尼游戲機(jī)playstation(ps)的美國(guó)網(wǎng)站遭到sql注入

2、攻擊。10月,adobe旗下網(wǎng)站遭受sql注入攻擊??梢?jiàn),sql注入攻擊的危害十分巨大。但sql注入攻擊也不是洪水猛獸,只要在開(kāi)發(fā)web程序時(shí)多加防范,就可以減少sql注入攻擊的威脅。本文從原理上分析實(shí)現(xiàn)sql注入的一般方法,并根據(jù)這些方法提出相應(yīng)的防范措施,為web程序的開(kāi)發(fā)提供一些幫助。一、sql注入原理?yè)?jù)統(tǒng)計(jì),目前國(guó)內(nèi)80%以上的網(wǎng)站都是采用web動(dòng)態(tài)網(wǎng)頁(yè)結(jié)合后臺(tái)數(shù)據(jù)庫(kù)架設(shè)而成的。網(wǎng)頁(yè)先從用戶(hù)的請(qǐng)求中得到某些參數(shù),然后動(dòng)態(tài)地生成sql語(yǔ)句請(qǐng)求發(fā)送給數(shù)據(jù)庫(kù),再把從數(shù)據(jù)庫(kù)中得到的結(jié)果返回給網(wǎng)頁(yè),從而完成網(wǎng)頁(yè)執(zhí)行的功能。然而,在許多web網(wǎng)站系統(tǒng)開(kāi)發(fā)過(guò)程中,由于程序員編寫(xiě)的代碼沒(méi)有對(duì)用戶(hù)輸入數(shù)

3、據(jù)的合法性進(jìn)行判斷,造成應(yīng)用程序存在安全隱患。惡意攻擊者可以利用用戶(hù)可提交或可修改的數(shù)據(jù),構(gòu)造出特殊目的sql語(yǔ)句,并將其插入到系統(tǒng)實(shí)際執(zhí)行的sql語(yǔ)句中,從而隨意獲取數(shù)據(jù)庫(kù)中的重要信息(如管理員用戶(hù)名和密碼等),修改、添加和刪除數(shù)據(jù)庫(kù),甚至控制整個(gè)網(wǎng)站服務(wù)器。這就是所謂的sql injection,即sql注入式攻擊,簡(jiǎn)稱(chēng)sql注入。簡(jiǎn)單地說(shuō),所謂sql注入漏洞就是用戶(hù)可提交構(gòu)造特殊的sql語(yǔ)句并得到執(zhí)行的情形。所謂sql注入攻擊,就是利用sql注入漏洞,非法獲取數(shù)據(jù)庫(kù)信息,或者入侵網(wǎng)站服務(wù)器的行為。安全專(zhuān)家提示:sql注入是從正常的www端口進(jìn)行訪問(wèn)網(wǎng)站,表面上看跟一般的web頁(yè)面訪問(wèn)沒(méi)什

4、么區(qū)別,所以目前市面上的防火墻都不會(huì)對(duì)sql注入發(fā)出警報(bào),如果管理員沒(méi)查看iis日志的習(xí)慣,可能被入侵很長(zhǎng)時(shí)間都不會(huì)察覺(jué),從而造成數(shù)據(jù)的泄漏,給網(wǎng)站帶來(lái)巨大損失。并且隨著web2.0功能得到增強(qiáng),sql注入漏洞的風(fēng)險(xiǎn)也隨之加大,黑客也在不斷優(yōu)化他們的攻擊手段和工具。二、sql注入方法1.收集程序及服務(wù)器信息。在沒(méi)有設(shè)置防注入的網(wǎng)站中,可以通過(guò)默認(rèn)鏈接正常打開(kāi)新的頁(yè)面(測(cè)試地址:./test1/news/show.asp?id=78),但是在這個(gè)地址后面加上單引號(hào)“'”,服務(wù)器將會(huì)返回下面的錯(cuò)誤提示:microsoft jet database engine 錯(cuò)誤 '80040e

5、14' 字符串的語(yǔ)法錯(cuò)誤 在查詢(xún)表達(dá)式 'id = 78'' 中。 /news/shown.asp,行 6 通過(guò)這個(gè)錯(cuò)誤提示,能獲取以下幾點(diǎn)信息:(1).該網(wǎng)站使用的是access數(shù)據(jù)庫(kù),通過(guò)jet引擎連接數(shù)據(jù)庫(kù),而不是通過(guò)odbc。(2).程序沒(méi)有判斷客戶(hù)端提交的數(shù)據(jù)是否符合程序要求。(3).該sql語(yǔ)句所查詢(xún)的表中有一名為id的字段。根據(jù)這些提示信息,就可以進(jìn)一步進(jìn)行sql注入測(cè)試。2獲取后繼頁(yè)面信息在asp程序中,往往利用querystring參數(shù)進(jìn)行不同頁(yè)面之間的數(shù)據(jù)傳遞,在要打開(kāi)新的鏈接時(shí),asp服務(wù)器先從url中提取出querystring參數(shù)中的i

6、d值,然后根據(jù)id值動(dòng)態(tài)生成后繼頁(yè)面。如有以下代碼:id = request("id")sql = "select * from news where id=" & idset rs = server.createobject("adodb.recordset")rs.open sql, "dsn=."do while not rs.eofresponse.write rs("content")rs.movenextloopset rs = nothin在一般情況下,此asp腳本能夠顯示

7、具有特定id值的文章的內(nèi)容( ./test1 /news/shown.asp?id=78),而 id 值是由url中的 querystring 參數(shù)指定的。然而此段代碼存在sql注入攻擊漏洞。某些惡意用戶(hù)可以把querystring中的id值偷換為“78 or 1=1”,則原url變?yōu)椋?/test1/news/shown.asp?id=78 or 1=1,從而誘使asp腳本生成不安全的sql指令如下:select * from news where id=0 or 1=1因1=1永遠(yuǎn)成立,所以原sql指令等效為:select * from news于是,數(shù)據(jù)庫(kù)將會(huì)返回所有文章的內(nèi)容。當(dāng)然,本

8、例中服務(wù)器所受的攻擊只是文章信息的泄漏,并不會(huì)引起很?chē)?yán)重后果。但是,如果攻擊者用同樣的手段發(fā)送delete等sql指令有可能把表里的內(nèi)容全部刪除。3非法成功提交表單sql注入攻擊除了可以通過(guò)url實(shí)現(xiàn)外,還可以通過(guò)頁(yè)面中的表單實(shí)現(xiàn),而且通過(guò)表單提交的sql注入攻擊在方式上更加靈活,危害也更大。比如在設(shè)計(jì)用戶(hù)登錄頁(yè)面時(shí),正常的做法是在登錄頁(yè)面中設(shè)計(jì)一表單,要求用戶(hù)在表單中提交用戶(hù)名(username)和密碼(password),只有當(dāng)用戶(hù)名和密碼均正確時(shí)才能通過(guò)驗(yàn)證。假定有兩個(gè)頁(yè)面:一個(gè)登錄頁(yè)面 (./test1/userlogin/index.asp) 用于登錄,另一個(gè)審核頁(yè)面(./test1

9、/userlogin/logincheck.asp) 用于驗(yàn)證用戶(hù)權(quán)限(即向數(shù)據(jù)庫(kù)查詢(xún)用戶(hù)名/密碼組合是否存在)。(1).登錄頁(yè)面<form action=" logincheck.asp " method="post"> username: <input type="text" name="username"><br>password: <input type="password" name="password"><br

10、><input type="submit"> </form> (2).審核頁(yè)面user = request ("username")psd = request ("password")sql = "select * from users where username='" & user & "' and password='" & psd & "'"set rs = server.c

11、reateobject("adodb.recordset")rs.open sql, "dsn=."if (rs.eof) thenresponse. .redirect "admin.asp"elseresponse.redirect "err.asp"end ifset rs = nothing初看,審核頁(yè)面的代碼似乎沒(méi)有任何安全漏洞,因?yàn)橛脩?hù)如果不給出有效的用戶(hù)名密碼組合就無(wú)法登錄。然而,正是這段代碼成了sql注入攻擊的理想目標(biāo)。攻擊者可以在表單的用戶(hù)名或密碼欄中輸入包含“or”和“=”等的特殊字符,于是,提

12、交給數(shù)據(jù)庫(kù)的sql指令就可能變成: sql = "select * from users where username=* or 1=1 and password =* or 1=1根據(jù)前述,可以知道,sql 服務(wù)器將返回包含users表格中的所有記錄的記錄集,但在此處設(shè)計(jì)者往往不會(huì)設(shè)計(jì)循環(huán)查詢(xún),所以asp腳本將會(huì)以u(píng)sers表中的第一條記錄的身份允許其登錄網(wǎng)站,而在很多網(wǎng)站中的第一條記錄的用戶(hù)名往往就是admin!因此,登錄后你便可以管理整個(gè)網(wǎng)站的資源。即在不知道用戶(hù)名和密碼的情況下,服務(wù)器通過(guò)驗(yàn)證。從而繞過(guò)服務(wù)器的條件審查而非法登錄網(wǎng)站,實(shí)現(xiàn)sql注入。例如:在網(wǎng)站的后臺(tái)管理用戶(hù)

13、登錄時(shí)(測(cè)試地址:./test1/userlogin/index.asp),將字符串“a' or 1=1 or '1”作為用戶(hù)名和密碼提交則成功繞過(guò)密碼審核而直接登錄。三、sql注入防范為了防止sql注入造成數(shù)據(jù)泄漏,可以采用相應(yīng)的措施來(lái)加強(qiáng)網(wǎng)站的安全。1.關(guān)閉錯(cuò)誤信息提示如在第一例中,只要在服務(wù)器上的iis管理器中做如下設(shè)置,右擊站點(diǎn),在彈出的菜單中選擇屬性,在彈出的對(duì)話(huà)框的主目錄選項(xiàng)卡中單擊配置,在應(yīng)用程序配置對(duì)話(huà)框的調(diào)試選項(xiàng)卡中的“腳本錯(cuò)誤的錯(cuò)誤信息”選項(xiàng)中選擇“向客戶(hù)端發(fā)送下列文本錯(cuò)誤消息(t):”并可設(shè)置簡(jiǎn)單的文本提示,也可以使用默認(rèn)的提示文本。這時(shí),別人就無(wú)法通過(guò)a

14、sp的錯(cuò)誤信息來(lái)獲得有關(guān)服務(wù)器及數(shù)據(jù)庫(kù)等的相關(guān)信息了。2.防止通過(guò)url注入對(duì)通過(guò)querystring參數(shù)進(jìn)行傳遞id時(shí),根據(jù)id是數(shù)字的特性,可以把querystring參數(shù)進(jìn)行限定:一是限定為數(shù)字字符(函數(shù):isnumeric),二是限定長(zhǎng)度。如果可以預(yù)見(jiàn)最大的記錄數(shù)(假定為9999),那么就可以把querystring參數(shù)的長(zhǎng)度限定在4位。對(duì)于需在不同頁(yè)面間進(jìn)行傳送用戶(hù)名、密碼及權(quán)限等其它信息時(shí),則不建議采用querystring參數(shù)在url中顯式傳送,而應(yīng)該采用cookif或session進(jìn)行隱式傳送。另外,session數(shù)據(jù)是不寫(xiě)入本地硬盤(pán)的,隨網(wǎng)頁(yè)的關(guān)閉而失效,因此安全性上高于c

15、ookie。3.防止構(gòu)造非法sql命令在網(wǎng)站中數(shù)據(jù)的提交往往是通過(guò)表單來(lái)進(jìn)行的,對(duì)于用戶(hù)名、密碼,可以指定用戶(hù)所使用的字符集及字符串長(zhǎng)度。但對(duì)于文章就無(wú)法指定用戶(hù)所使用的字符集及字符串長(zhǎng)度了??梢允褂锰鎿Q法替換掉一些特定的字符,使這些字符在html的頁(yè)面中可以正常顯示,但在sql命令中卻無(wú)法識(shí)別。如:if not isnull(htmlstr) then htmlstr = replace(htmlstr, ">", "&gt;") htmlstr = replace(htmlstr, "<", "&am

16、p;lt;") htmlstr = replace(htmlstr, chr(32), "<i></i>&nbsp;") htmlstr = replace(htmlstr, chr(9), "&nbsp;") htmlstr = replace(htmlstr, chr(34), "&quot;") htmlstr = replace(htmlstr, chr(39), "&#39;") htmlstr = replace(htmlstr, chr

17、(13), "") htmlstr = replace(htmlstr, chr(10) & chr(10), "</p><p> ") htmlstr = replace(htmlstr, chr(10), "<br> ") htmlcode = htmlstrend if4.杜絕sql注入在數(shù)據(jù)庫(kù)連接文件中加入防注入代碼,在連接數(shù)據(jù)庫(kù)文件之前就對(duì)一些特定的字符或字符串進(jìn)行攔截。http中的請(qǐng)求一般是通過(guò)get或者post來(lái)發(fā)送的,所以只要過(guò)濾掉get或者post請(qǐng)求參數(shù)信息中所有的非法字符

18、即可。(1). 定義非法字符串首先,要定義請(qǐng)求中不能包含字符串,各個(gè)字符串用"|"隔開(kāi):dim sql_injdatasql_injdata = "|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"sql_inj = split(sql_injdata,"|")(2).get的攔截:if request.querystring"" thenfor each sql_get in request.querystringfor sql_data=0 to ubound(sql_inj)if instr(request.querystring(sql_get),sql_inj(sql_data)0 then response.write "script language=”javascript”alert(sql防注入系統(tǒng)提示nn請(qǐng)不要在參數(shù)中包含非法字符嘗試注入!);history.back(-1)/script"response.endend ifnextnextend if(3).plst的攔截實(shí)現(xiàn)了get請(qǐng)求的注入攔截后,可以用同樣的方法來(lái)實(shí)現(xiàn)pos

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論