數(shù)據(jù)庫防火墻如何防范SQL注入行為
一、SQL注入簡介
什么是SQL注入
SQL注入是當(dāng)前針對數(shù)據(jù)庫安全進(jìn)行外部攻擊的一種常見手段?,F(xiàn)有主流應(yīng)用大多基于B/S架構(gòu)開發(fā),SQL注入的攻擊方式正是利用web層和通訊層的缺陷對數(shù)據(jù)庫進(jìn)行外部惡意攻擊。將SQL命令巧妙的插入通訊的交互過程中,如:Web表單的遞交、域名輸入、頁面請求等。通過硬性植入的查詢語句攻擊數(shù)據(jù)庫,以期利用服務(wù)器自身缺陷執(zhí)行惡意的SQL命令,從而入侵?jǐn)?shù)據(jù)庫。因此通過SQL注入攻擊方式產(chǎn)生的安全事件也在增多,對系統(tǒng)的危害性極大。
通過SQL注入可以遠(yuǎn)程獲取并利用應(yīng)用里的數(shù)據(jù),并且獲取未經(jīng)hashed加密的用戶秘鑰以及信用卡信息,甚至有以管理員身份登陸進(jìn)這些應(yīng)用的可能。下面通過一組常見的SQL注入攻擊方式,進(jìn)行說明:
首先,我們假設(shè)數(shù)據(jù)庫中有JOB表,模擬進(jìn)行攻擊,查詢表中數(shù)據(jù)量。
然后,應(yīng)用中調(diào)用惡意的攻擊性url向JOB表植入SQL語句:
http://localhost:port/webapp/Default.aspx?jobid=1'or 1=(select count(*) from job)—
那么,攻擊時等效的SQL語句如下:
- SELECT job_id, job_desc, min_lvl, max_lvl
- FROM jobs
- WHERE job_id='1'or 1=(select count(*) from jobs) --'
如果SQL注入的假設(shè)錯誤,web頁面如圖一:
圖一
如果SQL注入的假設(shè)成功,web界面如圖二:
圖二
攻擊說明:如果SQL注入的假設(shè)成功,即證明了數(shù)據(jù)庫中該表的表名是jobs,從而我們也就可以對該表進(jìn)行增刪改操作,從而對數(shù)據(jù)庫安全造成極其嚴(yán)重的危害。
SQL注入的8種攻擊行為
安全界有句名言“未知攻,焉知防”,想要預(yù)防SQL注入,需要進(jìn)一步剖析SQL注入都有哪些常見攻擊方式。
1. 猜測數(shù)據(jù)庫名,備份數(shù)據(jù)庫
2. 猜解字段名稱
3. 遍歷系統(tǒng)的目錄結(jié)構(gòu),分析結(jié)構(gòu)并發(fā)現(xiàn)WEB虛擬目錄,植入木馬
4. 查詢當(dāng)前用戶的數(shù)據(jù)庫權(quán)限
5. 設(shè)置新的數(shù)據(jù)庫帳戶提權(quán)得到數(shù)據(jù)庫管理員賬戶權(quán)限
6. 利用存儲過程獲取操作系統(tǒng)管理員賬戶
7. 客戶端腳本攻擊:通過正常的輸入提交方式將惡意腳本提交到數(shù)據(jù)庫中,當(dāng)其他用戶瀏覽此內(nèi)容時就會受到惡意腳本的攻擊。
8. 客戶端腳本攻擊:通過SQL注入方式將惡意腳本提交到數(shù)據(jù)庫中,直接使用SQL語法UPDATE數(shù)據(jù)庫,并將注入SQL經(jīng)過“HEX編碼”,然后通過exec執(zhí)行“動態(tài)”SQL的特性運(yùn)行腳本。
綜上可知,SQL注入對數(shù)據(jù)庫的攻擊方式日趨繁多,危害也日益嚴(yán)重,因此如何做好SQL注入的防護(hù)工作也就變成考量數(shù)據(jù)庫安全產(chǎn)品的一道標(biāo)桿。
SQL注入的5種防護(hù)方式
常規(guī)的SQL注入防護(hù)方式,包括以下幾個方面
1. 通過正則表達(dá)校驗(yàn)用戶輸入
2. 通過參數(shù)化存儲過程進(jìn)行數(shù)據(jù)查詢存取
3. 參數(shù)化SQL語句
4. 為數(shù)據(jù)庫添加新架構(gòu)
5. 利用LINQ to SQL查詢
針對以上SQL 5種注入防護(hù)方式,可以在一定程度上避免SQL注入對數(shù)據(jù)庫所帶來的入侵危害,但這些操作同步會使數(shù)據(jù)庫操作復(fù)雜化,在一定程度上提高了企業(yè)運(yùn)維成本,同時降低數(shù)據(jù)庫操作性能。因此,一種專門針對數(shù)據(jù)庫防護(hù)類產(chǎn)品——數(shù)據(jù)庫防火墻誕生,可以針對SQL注入攻擊行為進(jìn)行主動有效的防護(hù)。
二、數(shù)據(jù)庫防火墻如何防御SQL注入
數(shù)據(jù)庫防火墻作為專業(yè)的數(shù)據(jù)庫安全防護(hù)工具,而針對SQL注入等數(shù)據(jù)庫攻擊行為的防護(hù)能力如何,是衡量一款數(shù)據(jù)庫防火墻產(chǎn)品優(yōu)略的關(guān)鍵要素。
目前國內(nèi)數(shù)據(jù)庫安全的專業(yè)廠商安華金和,自主研發(fā)推出數(shù)據(jù)庫防火墻(DBFirewall)產(chǎn)品基于對數(shù)據(jù)庫協(xié)議的精準(zhǔn)解析,對SQL注入行為的分析更加精確,極大程度上避免了對SQL注入攻擊行為的漏防與誤防。
SQL注入的概念來自于Web系統(tǒng),數(shù)據(jù)庫防火墻在防止SQL注入時,針對已經(jīng)形成且即將到達(dá)數(shù)據(jù)庫的完整SQL,監(jiān)測是否有非法的操作,并有效阻止針對于數(shù)據(jù)庫的非法入侵行為。
圖三:DBFirewall SQL注入攻擊防護(hù)引擎
DBFirewall對于SQL注入行為的識別,可以分為以下三種:
1. 通過發(fā)送意外數(shù)據(jù)來觸發(fā)異常,利用獲取數(shù)據(jù)的GET操作,變更信息的POST操作,結(jié)合數(shù)據(jù)庫異常信息,從而判斷注入是否發(fā)生。
例如:
www.abc/show.php?category=bikes www.abc/show.php?category=bik’ ’es
如果以上兩句的執(zhí)行結(jié)果相同,則可能存在SQL注入。
2. 利用應(yīng)用程序試探。
如果應(yīng)用程序沒有對數(shù)據(jù)庫服務(wù)器返回的錯誤信息進(jìn)行處理,那么數(shù)據(jù)庫的錯誤信息將直接反饋到前臺,通過這些錯誤信息,不但可以識別出SQL注入的漏洞所在,甚至可能逐步探測出數(shù)據(jù)庫表信息。
3. 根據(jù)應(yīng)用響應(yīng)時間判斷
通過上述幾種方式可以初步判斷SQL注入行為的產(chǎn)生,但是為了提高準(zhǔn)確性,安華金和數(shù)據(jù)庫防火墻具有獨(dú)特的設(shè)計流程,通過構(gòu)建一條有效的SQL語句,幫助用戶確認(rèn)SQL注入行為:
1) SQL語句中區(qū)分?jǐn)?shù)值類型和字符串類型
2) 驗(yàn)證注入SQL代碼時,是否是通過注釋剩下的查詢來成功結(jié)束該語句。
3) 當(dāng)web應(yīng)用程序未顯示任何錯誤時,數(shù)據(jù)庫注入時間延遲。
可以檢測服務(wù)器響應(yīng)來確定注入
安華金和數(shù)據(jù)庫防火墻基于對SQL注入的各種攻擊行為,進(jìn)行有針對性的數(shù)據(jù)庫防護(hù),從而形成更加完備的防護(hù)體系。下面列舉幾種常見的SQL注入攻擊行為做分析說明,并具體描述一下DBFirewall是如何進(jìn)行防護(hù)的。
1) SQL注入識別數(shù)據(jù)庫
攻擊方法一:通過獲取數(shù)據(jù)庫異常信息,數(shù)據(jù)庫版本信息的方式進(jìn)行SQL注入攻擊
防御方法:利用DBFW的配置錯誤替換規(guī)則,對常見的錯誤信息進(jìn)行替換
攻擊方法二:獲取版本信息
SELECT banner FROM v$version或
SELECT banner FROM v$version WHERE rownum=1
防控方法:采用風(fēng)險評估中的系統(tǒng)表控制規(guī)則,或者通過訪問控制權(quán)限中,對不同的用戶控制對系統(tǒng)表的訪問權(quán)限。
2) 利用UNION語句提取數(shù)據(jù)
如果應(yīng)用返回第一個(原始)查詢得到的數(shù)據(jù),那么通過在第一個查詢后面注入一個UNION運(yùn)算符,并添加另外藝哥任意查詢,便可以讀取到數(shù)據(jù)庫用戶訪問過的任何一張表。
攻擊方法:多次使用各種數(shù)據(jù)類型替換null,直到系統(tǒng)不再報錯為止,例如
- select username,password from admin union select ‘test’,’test’ from dual
如果測試成功,可以替換為:
- select username,password from admin union select user, ’test’ from dual
獲得系統(tǒng)信息
防控方法:開啟DBFW的風(fēng)險評估union評測,以及系統(tǒng)表的評測
3) 利用條件語句
攻擊方法一:基于時間
對于oracle來說,可以使用sleep,或者UTL_HTTP、HTTPURITYPE向一個死的IP地址發(fā)送一個HTTP請求來實(shí)現(xiàn)相同的效果。如果指定一個不存在監(jiān)聽者的IP地址,那么下列查詢將一直等待連接知道超時:
- select utl_http.request(‘http://10.0.0.1’) from dual
- select HTTPURITYPE(‘http://10.0.0.1’).getclob() from dual
防控方法:開啟風(fēng)險評估里的暴力破解函數(shù)。
攻擊方法二:基于字符串轉(zhuǎn)換
對于傳入?yún)?shù)是字符串的,可以用char函數(shù)轉(zhuǎn)化其中一個字符,根基返回的結(jié)果可以實(shí)現(xiàn)SQL注入。
例如:
- select * from products where brand=’ac’+char(108+(case when system_user=’sa’ then else 0 end))+’e’
防控方法:將char作為暴力破解函數(shù)。
4) 提權(quán)行為
在Oracle中,通過Web應(yīng)用的SQL注入來提升權(quán)限非常困難。大多數(shù)權(quán)限提升方法均需要PL/SQL注入,而這種注入很少見。如果找到一種PL/SQL注入漏洞,可以通過注入PL/SQL代碼來提升權(quán)限或在數(shù)據(jù)庫服務(wù)器上啟動操作。
不需要PL/SQL注入的例子是:使用在Oracle的mod_plSQL組件中發(fā)現(xiàn)的一個漏洞。
防控方法:使用訪問控制或者風(fēng)險評估,加入用戶權(quán)限控制或高危操作
除了上述幾種常見的SQL注入行為之外,DBFW內(nèi)置可防護(hù)的SQL注入攻擊行為還包括:竊取hash口令、利用操作系統(tǒng)攻擊等。并且可以根據(jù):風(fēng)險級別、告警通知、SQL命令、命令特征、風(fēng)險函數(shù)、表達(dá)式、類型、操作人、操作等幾項(xiàng)元素自定義SQL注入防護(hù)規(guī)則。