天天看點

SQL注入攻擊及其防範檢測技術研究SQL注入攻擊及其防範檢測技術研究

 轉載:http://safe.csdn.net/n/20081218/32.html

SQL注入攻擊及其防範檢測技術研究

本文簡要介紹了SQL注入攻擊的原理,SQL注入攻擊實作過程,并在此基礎上給出了一種SQL注入攻擊的自動防範模型。

1  SQL注入攻擊概述

1.1  SQL注入技術定義

SQL注入(SQL Injection)技術在國外最早出現在1999年,我國在2002年後開始大量出現,目前沒有對SQL注入技術的标準定義,微軟中國技術中心從2個方面進行了描述:

(1)腳本注入式的攻擊

(2)惡意使用者輸入用來影響被執行的SQL腳本

Chris Anley将SQL注入定義為,攻擊者通過在查詢操作中插入一系列的SQL語句到應用程式中來操作資料。Stephen Kost[3]給出了SQL注入的一個特征,“從一個資料庫獲得未經授權的通路和直接檢索”。利用SQL注入技術來實施網絡攻擊常稱為SQL注入攻擊,其 本質是利用Web應用程式中所輸入的SQL語句的文法處理,針對的是Web應用程式開發者程式設計過程中未對SQL語句傳入的參數做出嚴格的檢查和處理所造成 的。習慣上将存在SQL注入點的程式或者網站稱為SQL注入漏洞。實際上,SQL注入是存在于有資料庫連接配接的應用程式中的一種漏洞,攻擊者通過在應用程式 中預先定義好的查詢語句結尾加上額外的SQL語句元素,欺騙資料庫伺服器執行非授權的查詢。這類應用程式一般是基于Web的應用程式,它允許使用者輸入查詢 條件,并将查詢條件嵌入SQL請求語句中,發送到與該應用程式相關聯的資料庫伺服器中去執行。通過構造一些畸形的輸入,攻擊者能夠操作這種請求語句去擷取 預先未知的結果。

1.2  SQL注入攻擊特點

SQL注入攻擊是目前網絡攻擊的主要手段之一,在一定程度上其安全風險高于緩沖區溢出漏洞,目前防火牆不能對SQL注入漏洞進行有效地防範。防火牆 為了使合法使用者運作網絡應用程式通路伺服器端資料,必須允許從Internet到Web伺服器的正向連接配接,是以一旦網絡應用程式有注入漏洞,攻擊者就可以 直接通路資料庫進而甚至能夠獲得資料庫所在的伺服器的通路權,是以在某些情況下,SQL注入攻擊的風險要高于所有其他漏洞。SQL注入攻擊具有以下特點:

(1)廣泛性。SQL注入攻擊利用的是SQL文法,是以隻要是利用SQL文法的Web應用程式如果未對輸入的SQL語句做嚴格的處理都會存在SQL 注入漏洞,目前以Active/Java Server Pages、 Cold Fusion Management、 PHP、Perl等技術與SQL Server、Oracle、DB2、Sybase等資料庫相結合的Web應用程式均發現存在SQL注入漏洞。

(2)技術難度不高。SQL注入技術公布後,網絡上先後出現了多款SQL注入工具,例如教主的HDSI、NBSI、明小子的Domain等,利用這些工具軟體可以輕易地對存在SQL注入的網站或者Web應用程式實施攻擊,并最終擷取其電腦的控制權。

(3)危害性大,SQL注入攻擊成功後,輕者隻是更改網站首頁等資料,重者通過網絡滲透等攻擊技術,可以擷取公司或者企業機密資料資訊,産生重大經濟損失。

2  SQL注入攻擊的實作原理

2.1  SQL注入攻擊實作原理

結構化查詢語言(SQL)是一種用來和資料庫互動的文本語 言,SQL Injection就是利用某些資料庫的外部接口把使用者資料插入到實際的資料庫操作語言當中,進而達到入侵資料庫乃至作業系統的目的。它的産生主要是由于 程式對使用者輸入的資料沒有進行細緻的過濾,導緻非法資料的導入查詢。

SQL注入攻擊主要是通過建構特殊的輸入,這些輸入往往是SQL文法中的一些組合,這些輸入将作為參數傳入Web應用程式,通過執行SQL語句而執行入侵者的想要的操作,下面以登入驗證中的子產品為例,說明SQL注入攻擊的實作方法。

在Web應用程式的登入驗證程式中,一般有使用者名(username)和密碼(password)兩個參數,程式會通過使用者所送出輸入的使用者名和密 碼來執行授權操作。其原理是通過查找user表中的使用者名(username)和密碼(password)的結果來進行授權通路,典型的SQL查詢語句 為:

Select * from users where username='admin' and password='smith’ 

      

如果分别給username和password指派“admin' or 1=1--”和“aaa”。 那麼,SQL腳本解釋器中的上述語句就會變為:

select * from users where username=’admin’ or 1=1-- and password=’aaa’

      

該語句中進行了兩個判斷,隻要一個條件成立,則就會執行成功,而1=1在邏輯判斷上是恒成立的,後面的“--”表示注釋,即後面所有的語句為注釋語句。同理通過在輸入參數中建構SQL文法還可以删除資料庫中的表,查詢、插入和更新資料庫中的資料等危險操作:

(1)jo'; drop table authors—如果存在authors表則删除。

(2)' union select sum(username) from users—從users表中查詢出username的個數

(3)'; insert into users values( 666, 'attacker', 'foobar', 0xffff )—在user表中插入值

(4)' union select @@version,1,1,1--查詢資料庫的版本

(5)'exec master..xp_cmdshell 'dir' 通過xp_cmdshell來執行dir指令

2.2.  SQL注入攻擊實作過程

SQL注入攻擊可以手工進行,也可以通過SQL注入攻擊輔助軟體如HDSI、Domain、NBSI等,其實作過程可以歸納為以下幾個階段:

(1)尋找SQL注入點;尋找SQL注入點的經典查找方法是在有參數傳入的地方添加諸如“and  1=1”、“and 1=2”以及“’”等一些特殊字元,通過浏覽器所傳回的錯誤資訊來判斷是否存在SQL注入,如果傳回錯誤,則表明程式未對輸入的資料進行處理,絕大部分情 況下都能進行注入。

(2)擷取和驗證SQL注入點;找到SQL注入點以後,需要進行SQL注入點的判斷,常常采用2.1中的語句來進行驗證。

(3)擷取資訊;擷取資訊是SQL注入中一個關鍵的部分,SQL注入中首先需要判斷存在注入點的資料庫是否支援多句查詢、子查詢、資料庫使用者賬号、資料庫使用者權限。如果使用者權限為sa,且資料庫中存在xp_cmdshell存儲過程,則可以直接轉(4)。

(4)實施直接控制;以SQL Server 2000為例,如果實施注入攻擊的資料庫是SQL Server 2000,且資料庫使用者為sa,則可以直接添加管理者賬号、開放3389遠端終端服務、生成檔案等指令。

(5)間接進行控制。間接控制主要是指通過SQL注入點不能執行DOS等指令,隻能進行資料字段内容的猜測。在Web應用程式中,為了友善使用者的維 護,一般都提供了背景管理功能,其背景管理驗證使用者和密碼都會儲存在資料庫中,通過猜測可以擷取這些内容,如果擷取的是明文的密碼,則可以通過背景中的上 傳等功能上傳網頁木馬實施控制,如果密碼是明文的,則可以通過暴力破解其密碼。

3  SQL注入攻擊檢測方法與防範

3.1  SQL注入攻擊檢測方法

SQL注入攻擊檢測分為入侵前的檢測和入侵後的檢測,入侵前的檢測,可以通過手工方式,也可以使用SQL注入工具軟體。檢測的目的是為預防SQL注 入攻擊,而對于SQL注入攻擊後的檢測,主要是針對日志的檢測,SQL注入攻擊成功後,會在IIS日志和資料庫中留下“痕迹”。

(1)資料庫檢查

使用HDSI、NBSI和Domain等SQL注入攻擊軟體工具進行SQL注入攻擊後,都會在資料庫中生成一些臨時表。通過檢視資料庫中最近建立的表的結構和内容,可以判斷是否曾經發生過SQL注入攻擊。

(2)IIS日志檢查

在Web伺服器中如果啟用了日志記錄,則IIS日志會記錄通路者的IP位址,通路檔案等資訊,SQL注入攻擊往往會大量通路某一個頁面檔案(存在 SQL注入點的動态網頁),日志檔案會急劇增加,通過檢視日志檔案的大小以及日志檔案中的内容,也可以判斷是否發生過SQL注入攻擊。

(3)其它相關資訊判斷

SQL注入攻擊成功後,入侵者往往會添加使用者、開放3389遠端終端服務以及安裝木馬後門等,可以通過檢視系統管理者賬号、遠端終端伺服器開啟情況、系統最近日期産生的一些檔案等資訊來判斷是否發生過入侵。

3.2 一般的SQL注入攻擊防範方法

SQL注入攻擊防範方法目前已經有很多,總結起來有下面一些:

(1) 在服務端正式處理之前對送出資料的合法性進行檢查;

(2) 封裝用戶端送出資訊;

(3) 替換或删除敏感字元/字元串;

(4) 屏蔽出錯資訊。

(5)不要用字串連接配接建立SQL查詢,而使用SQL變量,因為變量不是可以執行的腳本;

(6)目錄最小化權限設定,給靜态網頁目錄和動态網頁目錄分别設定不同權限,盡量不給寫目錄權限;

(7)修改或者去掉Web伺服器上預設的一些危險指令,例如ftp、cmd、wscript等,需要時再複制到相應目錄;

(8)資料敏感資訊非正常加密,通過在程式中對密碼等敏感資訊加密都是采用md5函數進行加密,即密文=md5(明文),本文推薦在原來的加密的基礎上增加一些非正常的方式,即在md5加密的基礎上附帶一些值,如密文=md5(md5(明文)+123456);

4  SQL注入攻擊防範模型

4.1SQL注入攻擊防範模型

在前人提出的SQL 注入攻擊的檢測/防禦/備案模型基礎上[8][9], 我們進行了檢測過程的優化,提出了一種SQL自動防範模型如圖1所示,本模型中所有檢測都在伺服器端進行,首先對IP位址進行檢測,如果該IP位址在 SQL注入攻擊庫中,則禁止該使用者的通路,并再次将相關資訊添加到SQL注入攻擊庫中;如果使用者是首次通路,則對送出字元進行檢測,如果是非法字元,則檢 測是否達到規定的通路值,如果達到則禁止使用者通路,同時發送郵件給系統管理者。本模型可以防止攻擊者窮舉攻擊并可自由設定攻擊次數的上限,一旦到達上限, 系統将自動發送郵件給管理者,管理者收到郵件後可以進行相應的處理,如果條件允許,還可以增加短信發送,增強了SQL注入攻擊的自動防範能力。

本模型的最大特點是自動将攻擊資訊及時的傳遞給管理者,友善管理者及時做出響應。 

SQL注入攻擊及其防範檢測技術研究SQL注入攻擊及其防範檢測技術研究
圖1 SQL注入攻擊自動防範模型

核心代碼如下:

sub stopit()
response.write "存在禁止通路ip位址:"&rs("ip")
response.end
response.redirect "noright.asp"
end sub
dim attack_browser,attack_ip,attack_host
attack_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,3
if not rs1.eof then
call stopit()
end if
rs1.close
set rs1=nothing
'從系統防範設定中查出email位址和運作的通路次數
set rs2=server.createobject("adodb.recordset")
sql2="select * from D_setup"
rs2.open sql2,conn,1,3
if not rs2.eof then
session("email")=rs2("email")
session("ok_count")=rs2("ok_count")
end if
rs2.close
set rs2=nothing
url=Request.ServerVariables("Query_String")
call chk(url)
'從Attack_count表中擷取A_count的次數,如果A_count次數不小于預設的通路次數則禁止
if chk(url) then
set rs3=server.createobject("adodb.recordset")
sql3="select A_count from attack_count "
rs3.open sql3,conn,1,3
if not rs3.eof then
if 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 )
else
temp_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 if
end if
      

4.2使用方法

所有代碼均存入一個檔案sqlinject.asp,隻需要将該檔案包含在需要防範的頁面中即可;其中需要包含email.asp和 conn.asp二個檔案,前者主要通過Jmail元件來發送email郵件,後者是調用資料庫連接配接,本模型的所采用的資料庫是SQL Server 2000。

4.3實際應用效果分析

通過實際測試,當入侵者在網頁送出一些非法字元達到指定次數後,系統會自動屏蔽掉該IP位址對網站的通路并将攻擊IP位址、攻擊時間、攻擊者浏覽器 版本等資訊寫入到資料庫中。當本模型存在一個缺陷:當攻擊者在一個區域網路時,一旦系統自動記錄該位址後,其它使用該IP位址的非入侵使用者也無法通路網站。 本文采取的折衷辦法是,在禁止的網頁時留有email位址,如果發現是因為SQL入侵導緻某個區域網路(企業)不能通路網站,則可以通過删除資料庫中禁止訪 問的IP位址,即可恢複正常通路。

5 .結束語

本文對SQL注入攻擊的方法、原理以及攻擊實施過程進行了闡述和總結,并給出了常見的一些SQL注入攻擊防範方法。最後給出了一種SQL注入攻擊自動防範模型,通過在實際項目中的使用,能夠很好的進行主動防範,具有較高的實用價值。