作者:安華金和 思成 SQL注入是在信息安全領域一種常見的攻擊手段。但是大部分人理解的SQL注入就是通過把SQL命令插入到Web表單提交或在輸入域名、頁面請求時加入的查詢字符串,最終達到欺騙服務器執(zhí)行偏離預期的SQL命令。這種情況下的SQL注入,引發(fā)原因基本是網(wǎng)頁對用戶輸入的信息缺乏校驗而導致。 很多人認為只有網(wǎng)頁才可以進行 SQL 注入,才有注入點。這是一個普遍對SQL 注入的錯誤認識。SQL注入嚴格來講應該叫做數(shù)據(jù)庫SQL注入。SQL注入的最終目的是獲取數(shù)據(jù)庫中存儲的敏感信息。事實上,任何可以連接到數(shù)據(jù)庫并進行 SQL 操作的程序都可以實施數(shù)據(jù)庫SQL注入,比如數(shù)據(jù)庫客戶端、網(wǎng)頁、帶有數(shù)據(jù)庫操作的程序客戶端。在這三種程序中,網(wǎng)頁注入最為常見,這和網(wǎng)頁的開發(fā)途徑相對多元化、某些網(wǎng)頁開發(fā)人員安全經(jīng)驗低、網(wǎng)頁使用量大等相關。 網(wǎng)頁的SQL注入主要是通過改變網(wǎng)頁發(fā)給后臺數(shù)據(jù)庫的SQL查詢邏輯,查詢一些敏感信息。但往往網(wǎng)頁鏈接數(shù)據(jù)庫所用的用戶權限較低,并沒有查詢數(shù)據(jù)庫中的敏感信息的權限,只能獲取和網(wǎng)站相關的信息。攻擊者想要獲取目標數(shù)據(jù)庫中的敏感信息就要想辦法利用數(shù)據(jù)庫自身的SQL注入漏洞對網(wǎng)站所用的低權限用戶進行提權操作(低權限是針對數(shù)據(jù)庫權限來說的)。攻擊者拿到數(shù)據(jù)庫DBA權限后可以對數(shù)據(jù)庫中的敏感信息肆意獲取,給數(shù)戶帶來不可預知經(jīng)濟以及名譽上的損失。 網(wǎng)站漏洞給攻擊者入侵的機會,而數(shù)據(jù)庫漏洞則會真真切切的威脅您的數(shù)據(jù)安全。安華金和攻防實驗室綜合多年的數(shù)據(jù)庫攻防經(jīng)驗與積累將在下文中以目前市場份額最大的Oracle數(shù)據(jù)庫為例介紹Oracle存在的SQL注入威脅和一些防護建議。 Oracle數(shù)據(jù)庫SQL注入漏洞集中存在于PL/SQL編寫的函數(shù)、存儲過程、包、觸發(fā)器中。Oracle存在SQL注入漏洞的一個重要原因是PL/SQL定義的兩種調用權限導致(定義者權限和調用者權限)。定義者權限給了低權限用戶在特定時期擁有高權限的可能,這就給提權操作奠定了基礎。調用者權限給了低權限用戶創(chuàng)建的SQL被高權限執(zhí)行的可能。Oracle的SQL注入漏洞往往就是基于這兩種權限而被攻擊者所利用。 利用Oracle的SQL注入漏洞一般只進行兩類操作一類是越權操作,一類是提權操縱。提權操作是越權操作中的一種,由于可利用漏洞自身的限制,某些漏洞只支持越權操作。Oracle經(jīng)典的提權操作命令是GRANT DBA TO USER(給USER用戶DBA權限)。越權操作的經(jīng)典命令是select password from sys.user$ where name = ‘SYS’;(查詢DBA用戶的密碼哈希散列)獲得散列后可以通過orabf等軟件離線破解出散列對應密碼明文。 攻擊者在Oracle注入點采用何種注入方式和獲取的數(shù)據(jù)庫賬號具備的權限有直接關系。大體在SQL注入上數(shù)據(jù)庫賬號可以被分為三類: 1.被獲取賬號具有較高數(shù)據(jù)庫權限 2.被獲取賬號具有創(chuàng)建函數(shù)或存儲過程的權限 3.被獲取賬號只具有連接權限(最低權限的賬號) 細分如下圖所示: 對于第一種情況,多指入侵的攻擊者具備 CREATE ANY TRIGGER權限或CREATE ANY VIEW權限甚至EXECUTE ANT PROCEDURE權限等較高權限。攻擊者如果具備EXECUTE ANT PROCEDURE權限,則可以直接執(zhí)行許多SYS用戶以定義者模式創(chuàng)建的函數(shù)或存儲過程。只要利用SYS用戶創(chuàng)建的存儲過程執(zhí)行GRANT DBA TO USER則就完成了提權到DBA的過程。 例如:CALL SYS.INITJVMAUX.EXEC(‘GRANT DBA TO USER’,TRUE); 攻擊者具有CREATE ANY TRIGGER權限的賬號,也很容易提升到DBA。主要是因為具有CREATE ANY TRIGGER權限可以創(chuàng)建任意架構(schema)的觸發(fā)器,包括 SYS。唯一的限制就是攻擊者不能對 SYS 用戶所擁有的對象創(chuàng)建觸發(fā)器。這種情況下攻擊者提權具體步驟可以分為以下三步: 1.發(fā)現(xiàn)階段,攻擊者要確定數(shù)據(jù)庫中的 DBA 用戶(Oracle并非只有一個DBA賬號,例如SYSTEM也是個DBA),并且確定哪些表或視圖攻擊者擁有 INSERT,UPDATE,或 DELETE 權限(屬于public)。 2.構造階段,攻擊者構造一個調用者權限的含有提全語句的存儲過程,想辦法讓觸發(fā)器調用存儲過程。 3.實施階段,攻擊者針對目標DBA用戶創(chuàng)建觸發(fā)器,觸發(fā)這個事件。觸發(fā)器將以擁有者的權限執(zhí)行,讓觸發(fā)器使用一個調用者權限的存儲過程。執(zhí)行存儲過程中的提權語句。 攻擊者具有CREATE ANY VIEW權限的賬號,提升到DBA也不難。方法類似CREATE ANY TRIGGER。攻擊者只要以數(shù)據(jù)庫管理員的模式創(chuàng)建一個視圖,然后讓一個具有高權限的用戶訪問這個視圖就可以達到提權的目的。 高權限用戶提權的方式往往不被漏洞所限制,所以用戶一定注意WEB訪問數(shù)據(jù)庫的賬號權限,過高的權限會給你的數(shù)據(jù)庫安全帶來極大隱患。Oracle中,一個擁有CREATE ANY XXX權限的用戶很可能可以獲取數(shù)據(jù)庫DBA權限,所以除非業(yè)務必須否則絕不授予頁面鏈接數(shù)據(jù)庫用戶CREATE ANY XXX權限。 對于第二種情況,多指攻擊者具備的賬號具有創(chuàng)建存儲過程、函數(shù)等權限,那么攻擊者可以通過構造執(zhí)行提權命令的具有調用者權限的存儲過程或函數(shù),并通過具有 SYS(或其他高權限用戶)定義者權限的存儲過程或函數(shù)來調用它,從而實現(xiàn)提權。 攻擊者具有創(chuàng)建函數(shù)(create functions)的權限,那么等同于他們可以對數(shù)據(jù)庫進行任意操作。攻擊者可以將他們希望執(zhí)行的 PL/SQL 代碼寫入他們創(chuàng)建的自定義函數(shù)(例如在自定義函數(shù)中加入GRANT DBA TO USER),并將該函數(shù)放入 SQL 語句。攻擊者只需要將他們創(chuàng)造的函數(shù)設置為調用者權限(AUTHID CURRENT_USER),這樣當高權限用戶所定義的存儲過程或函數(shù)調用攻擊者創(chuàng)建的函數(shù)時,真正執(zhí)行攻擊者所創(chuàng)建的函數(shù)的人將是高權限用戶。同時攻擊者定義的函數(shù)必須使用AUTONOMOUS+TRANSACTION 的編譯指示。這個編譯可以向編譯器表明,該函數(shù)將執(zhí)行它子程序內部的事件,而與調用它的存儲過程或函數(shù)無關。最后只要在數(shù)據(jù)庫中尋找一個具有PUBLIC執(zhí)行權限的高權限存儲過程或函數(shù)即可。 對于第三種權限,同時也是最為普遍的情況,即當前數(shù)據(jù)庫用戶只具有較低的權限,并且不具備創(chuàng)建用戶自定義存儲過程或函數(shù)的權限。在該情況下,攻擊者主要有三種手段: 1.注入匿名PL/SQL塊 2.光標 snarf 攻擊 3.利用DBMS_JVM_EXP_PERMS邏輯漏洞,獲取JAVA執(zhí)行權限,進而控制整個數(shù)據(jù)庫或整個系統(tǒng) 第一種手段攻擊者雖然不能創(chuàng)建存儲過程或函數(shù),只能被限制執(zhí)行SELECT或DML操作但攻擊者可以注入執(zhí)行匿名塊的存儲過程或函數(shù)來達到提權的目的。匿名塊是特殊的存儲過程,存在內存中,只能被調用一次。攻擊者可以透過這種手法繞過普通存儲過程的限制,可執(zhí)行 SELECT、DML、DDL等。攻擊者需要的就是找到存在可以接納異常輸入的且不校驗用戶輸入的系統(tǒng)函數(shù)。 可能存在漏洞的函數(shù)基本具備以下4點特征:安全人員可以對具備以下特點的函數(shù)做一些調整(例如關閉public權限,防止低權限用戶調用) 1)問題函數(shù)中存在通過字符串連接符(||)連接函數(shù),從而使注入可能正確實現(xiàn)。 2)問題函數(shù)中不能包含 OUT 參數(shù),因為注入過程無法提供 OUT 類型參數(shù)。 3)問題函數(shù)中必須要返回一個簡單數(shù)據(jù)類型,復雜的數(shù)據(jù)類型可能會導致錯誤,因為復雜的數(shù)據(jù)類型在字符串拼接過程中不能被自動轉換成一個簡單的數(shù)據(jù)類型。 4)問題函數(shù)中必須要提供一種機制,使得攻擊者可以執(zhí)行一定長度的 PL/SQL 語句。 第二種手段是David Litchfield提出的通過snarf入侵Oracle.主要出現(xiàn)在如果高權限用戶未正?;蛑鲃雨P閉顯式游標,會導致安全隱患。高權限用戶創(chuàng)建的游標滯留在數(shù)據(jù)庫內存中,低權限用戶可以利用滯留的游標對Oracle發(fā)動攻擊。最常見的方式是攻擊者用loop循環(huán)猜測出懸掛游標。定位到懸掛游標后,回收它并重新綁上高權限用戶,然后執(zhí)行查詢,可以越權獲得高權限用戶才可訪問的敏感信息。 第三種手段是利用Oracle支持的JAVA。問題根源在于Oracle默認把DBMS_JVM_EXP_PERMS、DBMS_JAVA以及DBMS_JAVA_TEST等危險package的執(zhí)行權限直接授予了PUBLIC,導致任意用戶都可以執(zhí)行JAVA程序,進而控制整個數(shù)據(jù)庫乃至整個操作系統(tǒng)。這種類似問題不單出現(xiàn)在Oracle的JAVA服務中,在ORACLE 的其他服務中也存在類似漏洞。 如果業(yè)務不需要使用JAVA服務建議直接刪除即可。關閉無用服務是一種杜絕漏洞的好辦法。 無論是網(wǎng)站還是信息系統(tǒng)應用層都需要防SQL注入,與此同時數(shù)據(jù)庫更需要防SQL注入,數(shù)據(jù)的安全和數(shù)據(jù)庫的安全息息相關。面對數(shù)據(jù)庫SQL注入的威脅,安華金和數(shù)據(jù)庫攻防實驗室專家給出以下三點防護建議: 首先數(shù)據(jù)庫DBA限制住賬號權限是最關鍵的防范措施。攻擊者獲取不同級別的賬號進行后續(xù)的注入遇到的難度也不相同。賬號權限越低攻擊者越難利用其獲取數(shù)據(jù)庫中的敏感信息; 其次刪除不用的Oracle默認服務有助于減少能被攻擊者利用漏洞數(shù)量。 最后定期對數(shù)據(jù)庫進行升級也是非常必要的。定期升級有助于修復漏洞,減少漏洞數(shù)量。由于受穩(wěn)定性限制等原因約束無法及時升級的數(shù)據(jù)庫也應該在數(shù)據(jù)庫和應用之間架設具有VPATCH(虛擬補?。┕δ艿臄?shù)據(jù)庫防火墻。同時對敏感數(shù)據(jù)加密也是一種強化數(shù)據(jù)安全的有效手段。 |
|
來自: victor1208 > 《待分類》