程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 解剖Oracle web環境注射技術

解剖Oracle web環境注射技術

編輯:Oracle數據庫基礎

Oracle是比較早出現的數據庫,但是它市場的占有率卻是非常大的,經常在一些比較大型數據庫上。它本身除了很好地支持各種SQL語句外,還提供了各種豐富的包,存儲過程,甚至支持Java和創建library等特性,如此強大的功能為Hacking提供了很好的便利。

Oracle自身有很多默認的帳戶,並且有很多的存儲過程,這些存儲過程是由系統建立的,很多默認都是對public開放的,在過去的幾年裡公布了很多Oracle的漏洞,包括溢出和SQL注射在內的許多漏洞。

在這裡面,SQL注射漏洞顯得格外嚴重,因為在Oracle裡,在不加其他關鍵字AUTHID CURRENT_USER的情況下,創建的存儲過程在運行時是以創建者身份運行的,而public對這些存儲過程都有權限調用,所以一旦自帶存儲過程存在注射的話,很容易讓普通用戶提升到Oracle系統權限。

Oracle本身內置了很多的帳戶,其中一些帳戶都有默認的密碼並且具有CONNECT的權限,這樣如果oralce的端口沒有受到防火牆的保護又可以被人遠程連接的話,就可以被人利用默認帳戶遠程登陸進系統然後利用系統裡的存儲過程的SQL注射漏洞,系統就會淪陷。

當然,登陸進oracle還需要sid,不過這也並不困難,oracle的tnslintener默認沒有設置密碼,完全可以用tnscmd.pl用services命令查出系統的sid(到比較新的版本,這個漏洞已經被修復了),這也是非常經典的入侵Oracle的方式。

Oracle Web Hacking 技術背景

oracle豐富的系統表。Oracle幾乎所有的信息都存儲系統表裡,當前數據庫運行的狀態,當前用戶的信息,當前數據庫的信息,用戶所能訪問的數據庫和表的信息......系統表就是整個數據庫的核心部分,通過恰當地查詢需要的系統表,幾乎可以獲得所有的信息。

如sys.v_$option就包含了當前數據庫的一些信息,如是否支持Java等,all_tables裡就包含了所有的表信息,all_tab_colmuns包含所有的列信息等等,為我們獲得信息提供了非常大的便利,後面將有關於如何利用系統表獲取敏感信息的描述。

在Oracle的各種漏洞裡,需要特別說下存儲過程的注射,其實也並沒有什麼神秘,存儲過程和函數一樣是接受用戶的輸入然後送到數據庫服務器解析執行,如果是采取的組裝成SQL字符串的形式執行的話,就很容易將數據和命令混淆,導致SQL注射。但是根據注射發生的點不同,一樣地注射漏洞的性質也不同。

Oracle使用的是PL/SQL,漏洞發生在select等DML語句的,因為不支持多語句的執行,所以如果想運行自己的語句如GRANT DBA TO LOVEHSELL這些DDL語句的話,就必須創建自己的函數或存儲過程,如果沒有這相關的權限還可以利用cursor注射,用dbms_sql包來饒過限制。

大多數的注射正是上面這些有限制的注射,必須依靠自己創建的一些其他包或者cursor來實現提升權限的目的,但是還是有些非常少見但是注射環境非常寬松的漏洞,就是用戶的輸入被放在begin和end之間的匿名pl/sql塊的注射,這種環境下的注射可以直接注射進多語句,幾乎沒有任何限制,而可以看到,正是這種閃光的漏洞為我們的web注射技術帶來了怎樣的輝煌。

好了,上面談到的都是Oracle的一些攻擊技術,但是現在很多的環境是,對外開放web服務,後台數據庫被防火牆保護著,無法得到數據庫的太多詳細信息,已經不能直接登陸進數據庫進行操作,這個時候就要考慮利用web下的漏洞來攻擊後台的數據庫了。

現在來看下如何進行Oracle web環境下注射吧!Oracle可以在各種web環境下良好地工作,各種web環境對我們注射的影響也並不是很大,在ASP,.net,JSP中對進入的參數基本沒做任何過濾,但是由於.Net,JSP語言是強類型語言,在數字類型的注射上即使sql語句沒有做過濾但是可能在接受參數的時候就出錯了,所以注射出現在字符串類型的參數上比較多一些。

在PHP環境下,所有的'會被轉義為\',在oracle環境裡\'並不會成為轉義(在Oracle環境裡的正確轉義應該為''),但是在我們自己的注射語句裡使用'會因為被轉成\'而遭到破壞,所以在注射時不能使用'。除此之外,web環境下就沒什麼限制了。

在數據庫方面,如果語句采取的是參數的方式執行,也不能夠被注射,除非使用的是字符串連接的方式(由於字符串連接的方式比較簡單,也因為一些歷史上的原因,很多程序員往往會偏向於這種方式,),字符串連接方式的話也會分為兩種,參數在select,update,insert這些DML語句之間,與參數在pl/sql匿名塊之間,如果web程序沒有捕獲錯誤,那麼我們很容易根據錯誤判斷出當前語句的類型,後面會提到。在pl/sql匿名塊之間的比較少見,但也不排除,這樣的注射基本也是沒有什麼限制的,可以執行多語句,做任何事,跟本地登陸沒有任何區別。

Oracle Web Hacking 基本思路

下面說說如何確定目標,注射參數的確定就由大家自己來了,主要是如何判斷數據庫屬於Oracle,根據數據庫的特性很容易判斷出來,oracle支持--類型注釋,但是不支持; 分隔執行多語句,oracle有很多系統表,譬如all_tables,通過對這些表的訪問也可以判斷出是否屬於Oracle。

另外在oracle裡的一些函數也可以用來判斷,譬如utl_http.request這些,語言上的小細節也可以用來區分系統,譬如在oracle裡||是連接符號,但是在其他數據庫裡就不是了,所以 and chr(123)||chr(123)=chr(123)||chr(123)這樣的,如果可以順利執行,那麼就基本應該是Oracle了,另外,一些腳本在出現數據庫查詢錯誤時,對錯誤信息沒有處理,也會洩露真實的後台數據庫,這個可以很明顯地看出來。

然後需要確定的是注射點的類型,一般的情況下,我們進入的參數不是數字類型就基本是字符類型(其他很多人所說的搜索型注射其實還是應該歸結於字符類型的),對於數字類型的基本不用考慮什麼,很容易添加--注釋字符就可以讓語句正確閉合了。

如果是字符類型的就要考慮如何讓整個語句正確,通常是添加'以及--這些注射字符來構造自己的注射環境。在一些復雜的情況下,如同一個參數在多個sql語句和邏輯裡出現,就要自己小心構造出符合環境的注射語句了,記住,我們只需要一個能便利插入自己sql命令的完好環境:)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved