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