2009-2-9 16:55 天極網(wǎng) 【天極網(wǎng)開發(fā)頻道】本文簡要介紹了SQL注入攻擊的原理,,SQL注入攻擊實現(xiàn)過程,,并在此基礎上給出了一種SQL注入攻擊的自動防范模型。 1 SQL注入攻擊概述 1.1 SQL注入技術定義 SQL注入(SQL Injection)技術在國外最早出現(xiàn)在1999年,,我國在2002年后開始大量出現(xiàn),,目前沒有對SQL注入技術的標準定義,微軟中國技術中心從2個方面進行了描述: (1)腳本注入式的攻擊 (2)惡意用戶輸入用來影響被執(zhí)行的SQL腳本 Chris Anley將SQL注入定義為,,攻擊者通過在查詢操作中插入一系列的SQL語句到應用程序中來操作數(shù)據(jù),。Stephen Kost[3]給出了SQL注入的一個特征,“從一個數(shù)據(jù)庫獲得未經授權的訪問和直接檢索”,。利用SQL注入技術來實施網(wǎng)絡攻擊常稱為SQL注入攻擊,,其本質是利用Web應用程序中所輸入的SQL語句的語法處理,針對的是Web應用程序開發(fā)者編程過程中未對SQL語句傳入的參數(shù)做出嚴格的檢查和處理所造成的,。習慣上將存在SQL注入點的程序或者網(wǎng)站稱為SQL注入漏洞,。實際上,SQL注入是存在于有數(shù)據(jù)庫連接的應用程序中的一種漏洞,,攻擊者通過在應用程序中預先定義好的查詢語句結尾加上額外的SQL語句元素,,欺騙數(shù)據(jù)庫服務器執(zhí)行非授權的查詢。這類應用程序一般是基于Web的應用程序,,它允許用戶輸入查詢條件,,并將查詢條件嵌入SQL請求語句中,發(fā)送到與該應用程序相關聯(lián)的數(shù)據(jù)庫服務器中去執(zhí)行,。通過構造一些畸形的輸入,,攻擊者能夠操作這種請求語句去獲取預先未知的結果。 1.2 SQL注入攻擊特點 SQL注入攻擊是目前網(wǎng)絡攻擊的主要手段之一,,在一定程度上其安全風險高于緩沖區(qū)溢出漏洞,,目前防火墻不能對SQL注入漏洞進行有效地防范,。防火墻為了使合法用戶運行網(wǎng)絡應用程序訪問服務器端數(shù)據(jù),,必須允許從Internet到Web服務器的正向連接,因此一旦網(wǎng)絡應用程序有注入漏洞,,攻擊者就可以直接訪問數(shù)據(jù)庫進而甚至能夠獲得數(shù)據(jù)庫所在的服務器的訪問權,,因此在某些情況下,,SQL注入攻擊的風險要高于所有其他漏洞。SQL注入攻擊具有以下特點: (1)廣泛性,。SQL注入攻擊利用的是SQL語法,,因此只要是利用SQL語法的Web應用程序如果未對輸入的SQL語句做嚴格的處理都會存在SQL注入漏洞,目前以Active/Java Server Pages,、 Cold Fusion Management,、 PHP、Perl等技術與SQL Server,、Oracle,、DB2、Sybase等數(shù)據(jù)庫相結合的Web應用程序均發(fā)現(xiàn)存在SQL注入漏洞,。 (2)技術難度不高,。SQL注入技術公布后,網(wǎng)絡上先后出現(xiàn)了多款SQL注入工具,,例如教主的HDSI,、NBSI、明小子的Domain等,,利用這些工具軟件可以輕易地對存在SQL注入的網(wǎng)站或者Web應用程序實施攻擊,,并最終獲取其計算器的控制權。 (3)危害性大,,SQL注入攻擊成功后,,輕者只是更改網(wǎng)站首頁等數(shù)據(jù),重者通過網(wǎng)絡滲透等攻擊技術,,可以獲取公司或者企業(yè)機密數(shù)據(jù)信息,,產生重大經濟損失。 2 SQL注入攻擊的實現(xiàn)原理 2.1 SQL注入攻擊實現(xiàn)原理 結構化查詢語言(SQL)是一種用來和數(shù)據(jù)庫交互的文本語言,,SQL Injection就是利用某些數(shù)據(jù)庫的外部接口把用戶數(shù)據(jù)插入到實際的數(shù)據(jù)庫操作語言當中,,從而達到入侵數(shù)據(jù)庫乃至操作系統(tǒng)的目的。它的產生主要是由于程序對用戶輸入的數(shù)據(jù)沒有進行細致的過濾,,導致非法數(shù)據(jù)的導入查詢,。 SQL注入攻擊主要是通過構建特殊的輸入,這些輸入往往是SQL語法中的一些組合,,這些輸入將作為參數(shù)傳入Web應用程序,,通過執(zhí)行SQL語句而執(zhí)行入侵者的想要的操作,下面以登錄驗證中的模塊為例,,說明SQL注入攻擊的實現(xiàn)方法,。 在Web應用程序的登錄驗證程序中,一般有用戶名(username)和密碼(password)兩個參數(shù),程序會通過用戶所提交輸入的用戶名和密碼來執(zhí)行授權操作,。其原理是通過查找user表中的用戶名(username)和密碼(password)的結果來進行授權訪問,,典型的SQL查詢語句為: Select * from users where username='admin' and password='smith’ 如果分別給username和password賦值“admin' or 1=1--”和“aaa”。 那么,,SQL腳本解釋器中的上述語句就會變?yōu)椋?/p> select * from users where username=’admin’ or 1=1-- and password=’aaa’ 該語句中進行了兩個判斷,,只要一個條件成立,則就會執(zhí)行成功,,而1=1在邏輯判斷上是恒成立的,,后面的“--”表示注釋,即后面所有的語句為注釋語句,。同理通過在輸入?yún)?shù)中構建SQL語法還可以刪除數(shù)據(jù)庫中的表,,查詢、插入和更新數(shù)據(jù)庫中的數(shù)據(jù)等危險操作: (1)jo'; drop table authors—如果存在authors表則刪除,。 (2)' union select sum(username) from users—從users表中查詢出username的個數(shù) (3)'; insert into users values( 666, 'attacker', 'foobar', 0xffff )—在user表中插入值 (4)' union select @@version,1,1,1--查詢數(shù)據(jù)庫的版本 (5)'exec master..xp_cmdshell 'dir' 通過xp_cmdshell來執(zhí)行dir命令 2.2. SQL注入攻擊實現(xiàn)過程 SQL注入攻擊可以手工進行,,也可以通過SQL注入攻擊輔助軟件如HDSI、Domain,、NBSI等,,其實現(xiàn)過程可以歸納為以下幾個階段: (1)尋找SQL注入點;尋找SQL注入點的經典查找方法是在有參數(shù)傳入的地方添加諸如“and 1=1”、“and 1=2”以及“’”等一些特殊字符,,通過瀏覽器所返回的錯誤信息來判斷是否存在SQL注入,,如果返回錯誤,則表明程序未對輸入的數(shù)據(jù)進行處理,,絕大部分情況下都能進行注入,。 (2)獲取和驗證SQL注入點;找到SQL注入點以后,需要進行SQL注入點的判斷,,常常采用2.1中的語句來進行驗證,。 (3)獲取信息;獲取信息是SQL注入中一個關鍵的部分,SQL注入中首先需要判斷存在注入點的數(shù)據(jù)庫是否支持多句查詢,、子查詢,、數(shù)據(jù)庫用戶賬號、數(shù)據(jù)庫用戶權限,。如果用戶權限為sa,,且數(shù)據(jù)庫中存在xp_cmdshell存儲過程,則可以直接轉(4),。 (4)實施直接控制;以SQL Server 2000為例,,如果實施注入攻擊的數(shù)據(jù)庫是SQL Server 2000,且數(shù)據(jù)庫用戶為sa,,則可以直接添加管理員賬號,、開放3389遠程終端服務,、生成文件等命令。 (5)間接進行控制,。間接控制主要是指通過SQL注入點不能執(zhí)行DOS等命令,只能進行數(shù)據(jù)字段內容的猜測,。在Web應用程序中,,為了方便用戶的維護,一般都提供了后臺管理功能,,其后臺管理驗證用戶和口令都會保存在數(shù)據(jù)庫中,,通過猜測可以獲取這些內容,如果獲取的是明文的口令,,則可以通過后臺中的上傳等功能上傳網(wǎng)頁木馬實施控制,,如果口令是明文的,則可以通過暴力破解其密碼,。 3 SQL注入攻擊檢測方法與防范 3.1 SQL注入攻擊檢測方法 SQL注入攻擊檢測分為入侵前的檢測和入侵后的檢測,,入侵前的檢測,可以通過手工方式,,也可以使用SQL注入工具軟件。檢測的目的是為預防SQL注入攻擊,而對于SQL注入攻擊后的檢測,,主要是針對日志的檢測,,SQL注入攻擊成功后,會在IIS日志和數(shù)據(jù)庫中留下“痕跡”,。 (1)數(shù)據(jù)庫檢查 使用HDSI,、NBSI和Domain等SQL注入攻擊軟件工具進行SQL注入攻擊后,都會在數(shù)據(jù)庫中生成一些臨時表,。通過查看數(shù)據(jù)庫中最近新建的表的結構和內容,,可以判斷是否曾經發(fā)生過SQL注入攻擊。 (2)IIS日志檢查 在Web服務器中如果啟用了日志記錄,,則IIS日志會記錄訪問者的IP地址,,訪問文件等信息,SQL注入攻擊往往會大量訪問某一個頁面文件(存在SQL注入點的動態(tài)網(wǎng)頁),,日志文件會急劇增加,,通過查看日志文件的大小以及日志文件中的內容,也可以判斷是否發(fā)生過SQL注入攻擊,。 (3)其它相關信息判斷 SQL注入攻擊成功后,,入侵者往往會添加用戶、開放3389遠程終端服務以及安裝木馬后門等,,可以通過查看系統(tǒng)管理員賬號,、遠程終端服務器開啟情況,、系統(tǒng)最近日期產生的一些文件等信息來判斷是否發(fā)生過入侵。 3.2 一般的SQL注入攻擊防范方法 SQL注入攻擊防范方法目前已經有很多,,總結起來有下面一些: (1) 在服務端正式處理之前對提交數(shù)據(jù)的合法性進行檢查; (2) 封裝客戶端提交信息; (3) 替換或刪除敏感字符/字符串; (4) 屏蔽出錯信息,。 (5)不要用字串連接建立SQL查詢,而使用SQL變量,,因為變量不是可以執(zhí)行的腳本; (6)目錄最小化權限設置,,給靜態(tài)網(wǎng)頁目錄和動態(tài)網(wǎng)頁目錄分別設置不同權限,盡量不給寫目錄權限; (7)修改或者去掉Web服務器上默認的一些危險命令,,例如ftp,、cmd、wscript等,,需要時再復制到相應目錄; (8)數(shù)據(jù)敏感信息非常規(guī)加密,,通過在程序中對口令等敏感信息加密都是采用md5函數(shù)進行加密,即密文=md5(明文),,本文推薦在原來的加密的基礎上增加一些非常規(guī)的方式,,即在md5加密的基礎上附帶一些值,如密文=md5(md5(明文)+123456); 4 SQL注入攻擊防范模型 4.1SQL注入攻擊防范模型 在前人提出的SQL 注入攻擊的檢測/防御/備案模型基礎上[8][9], 我們進行了檢測過程的優(yōu)化,,提出了一種SQL自動防范模型如圖1所示,,本模型中所有檢測都在服務器端進行,首先對IP地址進行檢測,,如果該IP地址在SQL注入攻擊庫中,,則禁止該用戶的訪問,并再次將相關信息添加到SQL注入攻擊庫中;如果用戶是首次訪問,,則對提交字符進行檢測,,如果是非法字符,則檢測是否達到規(guī)定的訪問值,,如果達到則禁止用戶訪問,,同時發(fā)送郵件給系統(tǒng)管理員。本模型可以防止攻擊者窮舉攻擊并可自由設置攻擊次數(shù)的上限,,一旦到達上限,,系統(tǒng)將自動發(fā)送郵件給管理員,管理員收到郵件后可以進行相應的處理,,如果條件允許,,還可以增加短信發(fā)送,增強了SQL注入攻擊的自動防范能力,。 本模型的最大特點是自動將攻擊信息及時的傳遞給管理員,,方便管理員及時做出響應。
圖1 SQL注入攻擊自動防范模型 核心代碼如下: sub stopit()response.write '存在禁止訪問ip地址:'&rs('ip')response.endresponse.redirect 'noright.asp'end subdim attack_browser,attack_ip,attack_hostattack_browser=Request.ServerVariables('Http_User_Agent')attack_ip=Request.ServerVariables('ReMote_Addr')attack_host=Request.ServerVariables('Remote_Host')set rs1=server.createobject('adodb.recordset')'從訪問禁止ip中查詢是否存在訪問者的IP地址,,如果存在則禁止其訪問sql1='select ip from prohibit_ip where ip=''&attack_ip&'''rs1.open sql1,conn,1,3if not rs1.eof thencall stopit()end ifrs1.closeset rs1=nothing'從系統(tǒng)防范設置中查出email地址和運行的訪問次數(shù)set rs2=server.createobject('adodb.recordset')sql2='select * from D_setup'rs2.open sql2,conn,1,3if not rs2.eof thensession('email')=rs2('email')session('ok_count')=rs2('ok_count')end ifrs2.closeset rs2=nothingurl=Request.ServerVariables('Query_String')call chk(url)'從Attack_count表中獲取A_count的次數(shù),,如果A_count次數(shù)不小于默認的訪問次數(shù)則禁止if chk(url) thenset rs3=server.createobject('adodb.recordset')sql3='select A_count from attack_count 'rs3.open sql3,conn,1,3if not rs3.eof thenif rs3('A_count')>=session('ok_count') then '插入攻擊記錄信息到attack_record表中 t1_sql1='insert into Attack_record(ip,Attacktime,,Host,Browser) value(''&attack_ip&'',now (),,''&attack_host&'',,''&attack_browser&'')'set rsdel=conn.execute(t1_sql1)call stopit()ok=Jmail(session('email'),'SQL注入攻擊告警!','攻擊者IP地址:'& attack_ip )elsetemp_a_count=rs3('a_count')+1'插入攻擊Ip和a_count信息到Attack_count表中t1_sql2='insert into Attack_count(ip,A_count) value(''&attack_ip&'',''&temp_a_count&'')'set rsdel=conn.execute(t1_sql2)end ifend if 4.2使用方法 所有代碼均存入一個文件sqlinject.asp,只需要將該文件包含在需要防范的頁面中即可;其中需要包含email.asp和conn.asp二個文件,,前者主要通過Jmail組件來發(fā)送email郵件,,后者是調用數(shù)據(jù)庫連接,本模型的所采用的數(shù)據(jù)庫是SQL Server 2000,。 4.3實際應用效果分析 通過實際測試,,當入侵者在網(wǎng)頁提交一些非法字符達到指定次數(shù)后,,系統(tǒng)會自動屏蔽掉該IP地址對網(wǎng)站的訪問并將攻擊IP地址,、攻擊時間、攻擊者瀏覽器版本等信息寫入到數(shù)據(jù)庫中,。當本模型存在一個缺陷:當攻擊者在一個局域網(wǎng)時,,一旦系統(tǒng)自動記錄該地址后,其它使用該IP地址的非入侵用戶也無法訪問網(wǎng)站,。本文采取的折衷辦法是,,在禁止的網(wǎng)頁時留有email地址,如果發(fā)現(xiàn)是因為SQL入侵導致某個局域網(wǎng)(企業(yè))不能訪問網(wǎng)站,,則可以通過刪除數(shù)據(jù)庫中禁止訪問的IP地址,,即可恢復正常訪問。 5 .結束語 本文對SQL注入攻擊的方法,、原理以及攻擊實施過程進行了闡述和總結,,并給出了常見的一些SQL注入攻擊防范方法。最后給出了一種SQL注入攻擊自動防范模型,,通過在實際項目中的使用,,能夠很好的進行主動防范,具有較高的實用價值,。
|
|