以下的文章能主要是對Oracle Web Hacking 基本思路的描述,如果你是Oracle Web Hacking 基本思路方面的新手,你就可以通過以下的文章對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命令的完好環境:)
在確定目標數據庫為OracleWeb Hacking 基本思路並且可以注射的時候,就可以開始嘗試構造語句了。一般首先要進行的是判斷當前的權限,在Oracle數據庫裡權限比較高的是DBA權限,擁有Oracle數據庫的所有權限,另外如果當前用戶的權限授予不對的話,也可以實現跨庫查詢的效果,可以通過對dba_tables這樣的dba的表進行嘗試訪問來是否是dba。
在一般的注射中,分為select類型注射,insert類型注射以及update類型等。update和insert類型的注射可以根據上下文來更改數據庫中的數據,如利用update注射將表中某個重要字段更改成我們想要的值,即使這些數據庫無關緊要也沒關系,我們可以利用select子語句來將我們需要的數據查詢出來然後在另外某個地方將這個數據讀出來,只要遵循數據庫的語法,實現自己的目的就可以了。
在這裡主要說下select類型的注射,如果我們能控制select語句的一部分的話,就可能實現這種類型注射,如果查詢的結果可以返回到頁面中的時候,還可以嘗試使用union查詢出結果,直接將內容顯示在頁面當中,這是最方便的一種。事實上後面可以看到,無論是什麼注射,在Oracle的web環境下,都可以直接執行系統命令返回shell。
Oracle中獲得敏感數據,首先就是Oracle有系統表,任何有權限獲得數據都可以從這裡獲得,關鍵的系統表有all_tables,all_objects等,都是有權限能訪問的,包括別人賦予你權限的,所以如果你的權限是dba的話,這能看到系統中所有的表,注射中一個技巧就是如果你需要從後台登陸但是不知道密碼就可以在這裡使用了,譬如猜測列名含不含有passWord等方法,後面的例子中也有講述。
另外比較需要了解的就是union查詢,在Oracle union查詢中和其他數據庫類似,要求列數一樣,還要求類型完全一致,Oracle類型有很多,常見的有字符類型,數字類型以及日期類型等等,一般我們能用來做union查詢並且顯示的是字符類型,所以需要精確定位哪個字段符合我們的要求
1 會在頁面顯示,數據從進入到出來會有很多的流程,很多數據會在中間經過多次的處理,所以要想找到能顯示出來的數據,很多時候並不是那麼順利,這種顯示包括很多地方,包括返回的http頭,頁面正文甚至是cookIE等。
2 字符類型 因為我們出來的數據大部分都是字符類型,所以需要這個類型用來正確地匹配
3長度需要足夠 盡管我們可以用一些字符函數來解決這個問題,但是夠長的字段總是非常簡便 ),OracleWeb Hacking 基本思路並不會自己做數據類型轉換,但是Oracle中提供了一個NULL類型,可以匹配所有的數據類型,所以我們在定位完字段數之後就可以在union的各個字段填寫null來匹配,另外Oracle不支持select 1這樣的查詢,語法要求select必須有關鍵字,如果我們沒有表可以用。
可以用系統中默認誰都有權限的表dual。關於定位字段數其實也比較簡單,和其他數據庫一樣可以利用order by 1-- 這樣操作,如果字段個數存在就會正常,通常頁面的邏輯會讓這個參數 不只在一個地方出現,所以order by地方不一致,所以不能進行union查詢。在這裡可能會遇到目標語言不支持''的情況,所以可以使用chr這些函數來處理這些問題。
即使不支持union,Oracle的一些特性還是讓我們輕易拿到想要的信息,就是用系統的utl_http.request包,這個包你可以看做是一個普通的函數,所以我們完全可以自己監聽端口,然後通過這個函數用請求將需要的數據發送過來,這個時候我們還可以用來查看數據庫可不可以上網以及出口IP,是個非常重要的一點。
正是有了這些系統裡豐富的包和函數以及存儲過程,使得只要有一個注射點,就可以在OracleWeb Hacking 基本思路裡做任何事情,包括權限允許的和權限不允許的,記住,是任何事。