版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1期題目PAGE28第5期遼寧省電子信息產(chǎn)品監(jiān)督檢驗院年度論文2009年1月-PAGE7-SQL注入攻擊漏洞研究與防范措施StructuredQueryLanguageInjectionLeakStudyAndDefenseMeasure姜志坤摘要:在當今的數(shù)字世界中,人們發(fā)現(xiàn)在維持公開的Internet連接的同時,保護網(wǎng)絡(luò)和計算機系統(tǒng)的安全變得越來越困難。病毒、木馬、后門、蠕蟲等攻擊層出不窮,虛假網(wǎng)站的釣魚行為也讓警惕性不高的公眾深受其害。為了減輕信息泄露及系統(tǒng)被攻擊帶來的風險,企業(yè)和機構(gòu)開始對自己的系統(tǒng)進行滲透測試,找出其中存在的漏洞和薄弱環(huán)節(jié)。本文通過對目前最流行的SQL注入攻擊漏洞的攻擊方法做了逐一的分析,并提出了檢測和防范的措施。關(guān)鍵字:SQL注入攻擊腳本攻擊網(wǎng)絡(luò)安全攻擊防范模型有害代碼SQL注入(SQLInjection)攻擊是目前網(wǎng)上最流行最熱門的黑客腳本攻擊方法之一,那什么是SQL注入式攻擊呢?它是指黑客利用一些Web應用程序(論壇、留言本、文章發(fā)布系統(tǒng))中某些疏于防范的用戶可以提交或修改的數(shù)據(jù)的頁面,精心構(gòu)造SQL語句,把特殊的SQL指令語句插入到系統(tǒng)實際SQL語句中并執(zhí)行它,以獲得用戶名、密碼等敏感信息,從而達到獲取主機控制權(quán)限的攻擊方法。1.SQL注入攻擊原理1.1SQL注入攻擊實現(xiàn)原理結(jié)構(gòu)化查詢語言(SQL)是一種用來和數(shù)據(jù)庫交互的文本語言,SQLInjection就是利用某些數(shù)據(jù)庫的外部接口把用戶數(shù)據(jù)插入到實際的數(shù)據(jù)庫操作語言當中,從而達到入侵數(shù)據(jù)庫乃至操作系統(tǒng)的目的。它的產(chǎn)生主要是由于程序?qū)τ脩糨斎氲臄?shù)據(jù)沒有進行細致的過濾,導致非法數(shù)據(jù)的導入查詢。SQL注入攻擊主要是通過構(gòu)建特殊的輸入,這些輸入往往是SQL語法中的一些組合,這些輸入將作為參數(shù)傳入Web應用程序,通過執(zhí)行SQL語句而執(zhí)行入侵者想要的操作,下面以登錄驗證中的模塊為例,說明SQL注入攻擊的實現(xiàn)方法。在Web應用程序的登錄驗證程序中,一般有用戶名(username)和密碼(password)兩個參數(shù),程序會通過用戶所提交輸入的用戶名和密碼來執(zhí)行授權(quán)操作。其原理是通過查找user表中的用戶名(username)和密碼(password)的結(jié)果來進行授權(quán)訪問,典型的SQL查詢語句為:Select*fromuserswhereusername=′admin′andpassword=′smith′如果分別給username和password賦值“admin'or1=1--”和“aaa”。那么,SQL腳本解釋器中的上述語句就會變?yōu)?select*fromuserswhereusername=′admin′or1=1--andpassword=′aaa′該語句中進行了兩個判斷,只要一個條件成立,則就會執(zhí)行成功,而1=1在邏輯判斷上是恒成立的,后面的“--”表示注釋,即后面所有的語句為注釋語句。同理通過在輸入?yún)?shù)中構(gòu)建SQL語法還可以刪除數(shù)據(jù)庫中的表,查詢、插入和更新數(shù)據(jù)庫中的數(shù)據(jù)等危險操作:(1)droptableauthors—如果存在authors表則刪除。(2)unionselectsum(username)fromusers—從users表中查詢出username的個數(shù)。(3)insertintousersvalues(666,′attacker′,′foobar′,0xffff)—在user表中插入值。(4)unionselect@@version,1,1,1--查詢數(shù)據(jù)庫的版本。(5)execmaster.xp_cmdshell′dir′通過xp_cmdshell來執(zhí)行dir命令。1.2SQL注入攻擊分析SQL注入可以說是一種漏洞,也可以說是一種攻擊。當程序中的變量處理不當,對用戶提交的數(shù)據(jù)過濾不足,都可能產(chǎn)生這個漏洞。它的攻擊原理就是利用用戶提交或可修改的數(shù)據(jù),把想要的SQL語句插入到系統(tǒng)實際SQL語句中,輕則獲得敏感的信息,重則控制服務器。例如Web應用有一個登錄頁面,這個登錄頁面控制著用戶是否有權(quán)訪問應用,要求用戶輸入一個名稱和密碼。攻擊者在用戶名字和密碼輸入框中輸入1'or'1'='1之類的內(nèi)容。該內(nèi)容提交給服務器之后,服務器運行上面的代碼構(gòu)造出查詢用戶的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:“select*fromuserswhereusername=''or'1'='1'andpassword=''or'1'='1'”。服務器執(zhí)行查詢或存儲過程,將用戶輸入的身份信息和服務器中保存的身份信息進行對比,由于SQL命令實際上已被注入式攻擊修改,已經(jīng)不能真正驗證用戶身份,所以系統(tǒng)會錯誤地授權(quán)給攻擊者。SQL注入是通過目標服務器的80端口進行的,這和普通的Web頁面訪問沒什么兩樣,所以一般的防火墻不會對這種攻擊發(fā)出警告或攔截。這種攻擊可能引起的危害取決于該網(wǎng)站的軟件環(huán)境和配置。當Web服務器以操作員的身份訪問數(shù)據(jù)庫時,利用SQL注入攻擊就可能刪除所有表格,創(chuàng)建新表格。而當管理員以超級用戶的身份訪問數(shù)據(jù)庫時,利用SQL注入攻擊就可能控制整個SQL服務器,在某些配置下攻擊者甚至可以自行創(chuàng)建用戶賬號以完全操作數(shù)據(jù)庫所在的服務器。SQL注入的方法很多,而且在攻擊時會碰到各種各樣的SQL語句,所以一般攻擊者需要豐富的經(jīng)驗和耐心,才能繞過一些檢測和處理提交構(gòu)造的SQL語句,從而獲得想要的有用信息。這個過程需要花費很多的時間,如果僅以這種手動方式進行SQL注入攻擊的話,許多存在SQL注入漏洞的ASP網(wǎng)站會安全很多了,不是漏洞不存在了,而是利用這個漏洞入侵的成本太高了。但現(xiàn)在攻擊者可用一些現(xiàn)成的黑客工具來輔助SQL注入攻擊,加快入侵的速度。由于SQL注入攻擊利用的是SQL語法,使得這種攻擊具有廣泛性。理論上說,對于所有基于SQL語言標準的數(shù)據(jù)庫軟件都是有效的,包括MSSQLServer,Oracle,DB2,Sybase,MySQL等。當然,各種軟件有自身的特點,最終的攻擊代碼可能不盡相同。1.3SQL注入攻擊過程(1)繞過身份認證機制一個登錄界面,需要輸入用戶名和密碼,然后Post到另一個頁面,進行身份認證,因此攻擊者只需在用戶名和密碼的輸入框中都輸入"’or’1’=’1"的內(nèi)容,那么攻擊者就可以不經(jīng)過任何認證而直接進入下一個頁面,并擁有和正常登錄用戶一樣的全部特權(quán)。原因是什么呢?我們比較一下正常用戶登錄和攻擊者登錄時的兩種SQL語句:1)正常用戶(用戶名為grace,密碼為1111):SQL="select3fromadminwhereusername=’grace’andpassword=’1111’2)攻擊者(用戶名和密碼都為"’or’1’=’1"):SQL="select3fromadminwhereusername=’’or’1’=’1’andpassword=’’or’1’=’1’可以看到由and連接的兩個條件都被一個永遠成立的’1’=’1’所代替,執(zhí)行的結(jié)果為真,因此服務器也會認為條件成立,于是把login標志設(shè)為true,讓攻擊者以合法身份登錄進入下一個頁面。(2)對數(shù)據(jù)庫系統(tǒng)進行讀取、插入、修改等操作如一個商品查詢頁面findproduct.asp?id=1,程序設(shè)計者原本設(shè)計意圖是顯示id為1的商品信息,而攻擊者利用程序中沒有對id的內(nèi)容進行檢查之機,插入自己的代碼。從findproduct.asp中摘錄兩句最關(guān)鍵的語句:SQL="select3fromproductwhereproductid=’"&request("id")&"’"rs.openSQL,conn,0,3可以看到,id沒有進行任何的處理,直接構(gòu)成SQL語句并執(zhí)行,而攻擊者在知道該系統(tǒng)的數(shù)據(jù)庫中表及表中字段名稱的情況下(目前網(wǎng)上免費的論壇系統(tǒng)或是商業(yè)網(wǎng)站代碼非常多),利用SQL語句特性(分號是將兩句SQL語句分開的符號),直接向數(shù)據(jù)庫中添加記錄:findproduct.asp?id=1;Insertinto"admin"(’username’,’password’,’type’)values(’hacker’,’pass123456’,’管理員’),然后攻擊者就可以直接用剛才建立的帳戶進行登錄了。通過這樣的方法,攻擊者還可以對系統(tǒng)做任何的事情,包括增加、修改、刪除記錄。(3)執(zhí)行系統(tǒng)命令如果Web主機使用MSSQL數(shù)據(jù)庫系統(tǒng),而list.asp中存在注入點,那么攻擊者就可以用到xp_cmdshell這個擴展存儲過程,xp_cmdshell是一個非常有用的擴展存儲過程,用于執(zhí)行系統(tǒng)命令,比如dir,net等,攻擊者可以根據(jù)程序的不同,提交不同的語句:http://www.XXX.com?list.asp?id=1;?exec?master.dbo.xp_cmdshell?’dir’http://www.XXX.com?list.asp?id=1;?exec?master.xp_cmdshell?’dir’或者可以插入下面的語句netuserhacker/addnetlocalgroupadministratorshacker/add來向Web主機系統(tǒng)中加入一個非法的管理員帳號,不過這樣的做法必須同時滿足幾個條件,首先ASP使用的SQLSERVER帳號必須是管理員,其次請求的提交變量在整個SQL語句的最后,否則構(gòu)造出來的SQL語句在語法上是錯誤的,也就不可能執(zhí)行成功。2.SQL注入攻擊的檢測方式及方法2.1檢測方式SQL注入攻擊檢測分為入侵前的檢測和入侵后的檢測。入侵前的檢測,可以通過手工方式,也可以使用SQL注入工具軟件。檢測的目的是為預防SQL注入攻擊,而對于SQL注入攻擊后的檢測,主要是針對日志的檢測,SQL注入攻擊成功后,會在IIS日志和數(shù)據(jù)庫中留下“痕跡”。2.2檢測方法(1)輸入驗證檢查動態(tài)的SQL語句是一個進行數(shù)據(jù)庫查詢的強大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動態(tài)的SQL語句替換成預編譯的SQL或者存儲過程對大多數(shù)應用程序是可行的。預編譯的SQL或者存儲過程可以將用戶的輸入作為參數(shù)而不是SQL命令來接收,這樣就限制了入侵者的行動。當然,它不適用于存儲過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命令仍可能得到執(zhí)行,數(shù)據(jù)庫仍然有受SQL注入攻擊的危險。如果一個輸入框只可能包括數(shù)字,那么要通過驗證確保用戶輸入的都是數(shù)字。如果可以接受字母,那就要檢查是不是存在不可接受的字符。確保應用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關(guān)鍵字。(2)數(shù)據(jù)檢查使用HDSI、NBSI和Domain等SQL注入攻擊軟件工具進行SQL注入攻擊后,都會在數(shù)據(jù)庫中生成一些臨時表。通過查看數(shù)據(jù)庫中最近新建的表的結(jié)構(gòu)和內(nèi)容,可以判斷是否曾經(jīng)發(fā)生過SQL注入攻擊。(3)日志檢查在Web服務器中如果啟用了日志記錄,則IIS日志會記錄訪問者的IP地址,訪問文件等信息,SQL注入攻擊往往會大量訪問某一個頁面文件(存在SQL注入點的動態(tài)網(wǎng)頁),日志文件會急劇增加,通過查看日志文件的大小以及日志文件中的內(nèi)容,也可以判斷是否發(fā)生過SQL注入攻擊。(4)其他SQL注入攻擊成功后,入侵者往往會添加用戶、開放3389遠程終端服務以及安裝木馬后門等,可以通過查看系統(tǒng)管理員賬號、遠程終端服務器開啟情況、系統(tǒng)最近日期產(chǎn)生的一些文件等信息來判斷是否發(fā)生過入侵。3.SQL注入攻擊防范模型及措施3.1防范模型在前人提出的SQL注入攻擊的檢測/防御/備案模型基礎(chǔ)上,本人進行了檢測過程的優(yōu)化,提出了一種SQL自動防范模型如圖1所示,本模型中所有檢測都在服務器端進行。首先對IP地址進行檢測,如果該IP地址在SQL注入攻擊庫中,則禁止該用戶的訪問,并再次將相關(guān)信息添加到SQL注入攻擊庫中;如果用戶是首次訪問,則對提交字符進行檢測,如果是非法字符,則檢測是否達到規(guī)定的訪問值,如果達到則禁止用戶訪問,同時發(fā)送郵件給系統(tǒng)管理員。本模型可以防止攻擊者窮舉攻擊并可自由設(shè)置攻擊次數(shù)的上限,一旦到達上限,系統(tǒng)將自動發(fā)送郵件給管理員,管理員收到郵件后可以進行相應的處理,如果條件允許,還可以增加短信發(fā)送,增強SQL注入攻擊的自動防范能力。客戶端提交信息客戶端提交信息服務器檢測Sql注入庫中檢測IP地址是否存在服務器端字符串檢測檢測字符串是否合法正確訪問地址禁止訪問服務器進行備案是否超過指定訪問值發(fā)送Email是是是否否否圖1本模型的最大特點是自動將攻擊信息及時地傳遞給管理員,方便管理員及時做出響應。核心代碼如下:substopit()response.write"存在禁止訪問ip地址:"&rs("ip")response.endresponse.redirect"noright.asp"endsubdimattack_browser,attack_ip,attack_hostattack_browser=Request.ServerVariables("Http_User_Agent")attack_ip=Request.ServerVariables("ReMote_Addr")attack_host=Request.ServerVariables("Remote_Host")setrs1=server.createobject("adodb.recordset")'從訪問禁止ip中查詢是否存在訪問者的IP地址,如果存在則禁止其訪問SQL1="selectipfromprohibit_ipwhereip=′"&attack_ip&"′"rs1.openSQL1,conn,1,3ifnotrs1.eofthencallstopit()endifrs1.closesetrs1=nothing'從系統(tǒng)防范設(shè)置中查出email地址和運行的訪問次數(shù)setrs2=server.createobject("adodb.recordset")SQL2="select*fromD_setup"rs2.openSQL2,conn,1,3ifnotrs2.eofthensession("email")=rs2("email")session("ok_count")=rs2("ok_count")endifrs2.closesetrs2=nothingurl=Request.ServerVariables("Query_String")callchk(url)'從Attack_count表中獲取A_count的次數(shù),如果A_count次數(shù)不小于默認的訪問次數(shù)則禁止ifchk(url)thensetrs3=server.createobject("adodb.recordset")SQL3="selectA_countfromattack_count"rs3.openSQL3,conn,1,3ifnotrs3.eofthenifrs3("A_count")>=session("ok_count")then'插入攻擊記錄信息到attack_record表中t1_SQL1="insertintoAttack_record(ip,Attacktime,Host,Browser)value(′"&attack_ip&"′,now(),′"&attack_host&"′,′"&attack_browser&"′)"setrsdel=conn.execute(t1_SQL1)callstopit()ok=Jmail(session("email"),"SQL注入攻擊告警!","攻擊者IP地址:"&attack_ip)elsetemp_a_count=rs3("a_count")+1'插入攻擊ip和a_count信息到Attack_count表中t1_SQL2="insertintoAttack_count(ip,A_count)value(′"&attack_ip&"′,′"&temp_a_count&"′)"setrsdel=conn.execute(t1_SQL2)endifendif3.2防范措施SQL注入攻擊防范方法目前已經(jīng)有很多,總結(jié)起來有以下方法:(1)在服務端正式處理之前對提交數(shù)據(jù)的合法性進行檢查。如果一個輸入框只可能包括數(shù)字,那么要通過驗證確保用戶輸入的都是數(shù)字。如果可以接受字母,那就要檢查是不是存在不可接受的字符。確保應用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關(guān)鍵字。另外限制表單或查詢字符串輸入的長度也是一個好方法。如果用戶的登錄名字最多只有10個字符,那么不要認可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。(2)封裝客戶端提交信息;(3)替換或刪除敏感字符/字符串。使用雙引號替換掉所有用戶輸入的單引號,這個簡單的預防措施將在很大程度上預防SQL注射攻擊,單引號常常結(jié)束掉SQL語句,可能給予輸入者不必要的權(quán)力。用雙引號替換掉單引號可以使許多SQL注入攻擊失敗。如:“select*fromuserswhereusername=or1=1andpassword=or1=1”顯然會得到與“select*fromuserswhereusername=''or'1'='1'andpassword=''or'1'='1'”不同的結(jié)果。(4)屏蔽出錯信息。攻擊者有時從客戶端提交特殊的代碼,根據(jù)IIS給出的出錯提示信息來收集程序及服務器的信息,從而獲取想得到的資料。如果把IIS設(shè)置成不管出什么樣的ASP錯誤,只給出一種錯誤提示信息,那么攻擊者就沒辦法入侵了。(5)不要用字串連接建立SQL查詢,而使用SQL變量,因為變量不是可以執(zhí)行的腳本。動態(tài)的SQL語句是一個進行數(shù)據(jù)庫查詢的強大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動態(tài)的SQL語句替換成預編譯的SQL或者存儲過程對大多數(shù)應用程序是可行的。預編譯的SQL或者存儲過程可以將用戶的輸入作為參數(shù)而不是SQL命令來接收,這樣就限制了入侵者的行動。當然,它不適用于存儲過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育機構(gòu)綠化管理合約3篇
- 旅游休閑審計服務合同3篇
- 居民建議小區(qū)服務品質(zhì)改進3篇
- 招標文件邀請格式模板3篇
- 招標進行時裝修公司招募3篇
- 布草租賃合同范例3篇
- 房屋買賣合同的價格規(guī)定3篇
- 熱氣球基地景觀施工合同
- 水電站加固施工協(xié)議
- 玻璃制品噴漆裝飾合同
- 2024-2030年中國醋酸乙烯行業(yè)運營狀況與發(fā)展風險評估報告
- 2024年新能源汽車充電停車位租賃及維護服務合同3篇
- 廣東省廣州越秀區(qū)2023-2024學年八年級上學期期末數(shù)學試卷(含答案)
- 2023醫(yī)療質(zhì)量安全核心制度要點釋義(第二版)對比版
- 錨桿錨索鉆機操作規(guī)程
- 氣相色譜法分析(甲醇)原始記錄
- DB63∕T 2013-2022 公路養(yǎng)護工程預算定額
- InternationalSettlementsLecture3InternationalClearingSystems
- 小學一年級班會課教案匯編 全冊
- 汽車理論作業(yè)Matlab程序輕型貨車動力性能評價
- 長沙理工大學工程經(jīng)濟課程設(shè)計(共86頁)
評論
0/150
提交評論