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