天天看點

Hacking Oracle with Sql Injection

http://drops.wooyun.org/tips/57

0x0 前言

0x1 資訊刺探 

0x2 權限提升 

0x3 執行指令 

0x4 檔案系統 

0x5 通路網絡 

0x6 總結

0x7 參考文獻

本文主要讨論如何通過一個sql inject 來最大限度的取得各種資訊和權限,文章絕大多數技術都是前人提出,膜拜各位牛人 的同時,也非常感謝牛人們的分享,上帝與你們同在 :) 本文僅起着總結作用,測試資料庫分别為:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 和Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 ,預設是 Oracle Database 10g Enterprise

Edition Release 10.2.0.1.0最後,倘若您有更好的見解或者方法,請不吝賜教

0x1 資訊刺探

通常刷到一個sql inject 之後,一般步驟都是查找敏感資訊,oracle自帶了很多資料字典,可以很友善我們查找資訊

一般思路就是檢索schema->table->column ,然後就查詢相關資訊,進行下一步滲透,當然,倘若僅僅如此,這篇文章就 沒有存在的必要了,下面我們會介紹怎麼樣通過web來hack oracle,不過在此之前,還是請容許我簡單的描述一下在oracle 下如何高效的擷取資訊,下面這個是測試代碼,本文通用代碼

假定上面的代碼是http://www.hellove.net/hellove.php,變量id将會導緻注入. 在這裡很明顯的可以用union來擷取資訊,不過我們還是介紹一點oracle獨有的擷取資訊的方法吧 

utl_http.request,utl_inaddr.get_host_name,utl_inaddr.get_host_address由于11g的安全特性無法繼續使用,但是我們 可以在顯錯模式下利用ctxsys.drithsx.sn,或者自己搭建一個dnsserver,将一個域名的解析server指向該server,利用sys.dbms_ldap.init 還可以在11g下正常工作

0x2 權限提升

在這裡假設我們得到的這個注射點所在的使用者的擁有的權限很小,僅有create session或者其他權限,也假設我們并沒有足夠走運 能夠注射到pl/sql語句中,僅僅是一個普普通通的注射點,這個時候我們就要想想如何提權了,是以本小結的主題是如何讓我們現在 的使用者成為dba,let’s begin

DBMS_EXPORT_EXTENSION  現在我們來關注一下DBMS_EXPORT_EXTENSION這個包,這個包在06年7月之前存在3個危險函數,get_domain_index_metadata, get_v2_domain_index_tables,get_domain_index_tables,這三個函數sys定義,預設都是definer right ,oracle的初次 修複方案很友愛,前兩個函數都修得差不多了,但是第三個在10g r2未打更新檔的情況下,還存在着,讓我們看一下這個函數的代碼

我們可以看到當GET_TABLES=1時,這代碼無懈可擊,但是當GET_TABLES=0時,TYPE_SCHEMA和TYPE_NAME就是注入點啊!突然覺得oracle覺得好可愛,這裡我們就拿get_domain_index_tables示範

注射到第三參TYPE_NAME,熟悉pl/sql的都應該了解上面在幹嘛:) 不過這個包的三個函數在06年7月之後就被修複了,也就是說 oracle 11g就不能再用了

dbms_xmlquery.newcontext與dbms_xmlquery.getxml

我本來是還要寫hacking oracle with pl/sql的,不過被這兩個函數直接滅掉我這想法,這兩個函數使得之前我以為僅能在pl/sql環境下利用的 漏洞,在web下也能利用了

這三個函數都可以直接執行PL/SQL語句,定義為invoker right ,是以使得之前隻能在pl/sql環境中使用的漏洞,現在在web環境中也可以使用了,這三個函數應該都不算是存在漏洞,隻能說是特性而已,後期會經常使用,現在提及一下

DBMS_JVM_EXP_PERMS

DBMS_JVM_EXP_PERMS這個包比較好玩,純粹是邏輯型的漏洞,所需的權限非常小,隻要有create session就可以了,隻可惜DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS不能在web環境中直接調用,作者給的poc能使我們的使用者直接得到Java權限

個人PL/SQL程式設計技術有限,嘗試将上述poc用dbms_xmlquery.newcontext結合利用,不曉得為什麼oracle老是提示ORA-03113: end-of-file on communication channel ,隻能建立個函數,然後在通過函數進行利用,唉,結果又必須多一個create procedure權限才能利用 作者這個很厲害的漏洞,下面是我的代碼

由于The 11.2.0.1 April CPU patch fixes this,我的11g就沒有測試成功,至于這個java.io的權限有什麼用,後面再說, 反正先刷到一個權限再說

LT.FINDRICSET  first to first,看一下這個漏洞過程的代碼

粗略看一下似乎沒什麼問題,可是這個函數又調用了SYS.LTRIC.FINDRICSET,而SYS.LTRIC.FINDRICSET中存在注入,但是SYS.LTRIC.FINDRICSET 是不能被public角色調用,LT.FINDRICSET可以被public 角色調用,是以歸為LT.FINDRICSET漏洞,再讓我們看一下SYS.LTRIC.FINDRICSET的代碼

我們看到了IN_TABLE_NAME 和 IN_TABLE_OWNER 可以注入,但是IN_TABLE_NAME與IN_TABLE_OWNER都是由LT.FINDRICSET中的參數TABLE_NAME 所産生,是以我們可以用LT.FINDRICSET的第一參來進行注入,嘗試結合dbms_xmlquery.newcontext(這樣就無需create procedure),結果因為 字數限制而失敗了,下面給出利用方法,需要有create procedure的權限

上面兩行代碼是在web環境下使用的代碼,pl/sql中更為簡單,就不必示範了

MDSYS.SDO_DROP_USER_BEFORE

之前的DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES屬于函數注入,SYS.LTRIC.FINDRICSET屬于過程注入,DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS邏輯問題 現在我們要介紹一個更為好玩的MDSYS.SDO_DROP_USER_BEFORE觸發器,MDSYS模式下的SDO_DROP_USER_BEFORE,TRIGGER是以definer rigth來執行的,雖然MDSYS沒有多大的權限 但是先讓我們能夠在MDSYS下執行任意指令,先看MDSYS.SDO_DROP_USER_BEFORE的代碼

dictionary_obj_name處可以注入,我們可以嘗

相當無語,不過還是因為字數限制,不能利用dbms_xmlquery.getxml來實作無需create procedure,必須建立個過程,但是由于所在模式為MDSYS 不是dba,我們不能利用MDSYS直接擷取dba權限,但是MDSYS擁有create any trigger的權限,是以我們可以利用MDSYS在system下 建立一個trigger,trigger是authid current_user,是以我們要利用trigger來在system權限下執行指令,然後我們再觸發這個trigger,就可以 在system下執行代碼了,talk

is cheap,show me the code,直接放代碼吧

我們先建立一個過程g(名字要短),友善注射到MDSYS.SDO_DROP_USER_BEFORE中,然後将g的執行權限賦給public,在過程g中,我們建立 一個在system模式OL$的trigger,代碼如上

删除使用者将觸發觸發器MDSYS.sdo_drop_user_before,注入代碼以MDSYS模式下執行,而MDSYS可以create any trigger,是以我們利用MDSYS 建立system.OL$下的一個trigger,之是以是system.OL$,是因為public使用者可以往裡面插入資料而觸發觸發器,然後由于觸發器是以definer來 運作的,是以建立的system.evil_trigger就以sysem的權限下加使用者了,以上代碼還是可以結合dbms_xmlquery.getxml來使用,請自行構造

簡單分析了幾個漏洞,由于oracle類似的漏洞太多了,不大可能一一分析,是以本小結到這就結束了

0x3 執行指令

下面的章節都假定我們已經獲得了很高的權限,接下來我們的target就轉移到了os,下面我們來講一下如何在pl/sql中執行os指令

直接照這上面的操作是必定會失敗的,因為$ORACLE_HOME\bin\下壓根就沒msvcrt.dll,long long ago是可以用絕對位址”c:\windows\system32\msvcrt.dll”,或者用路徑回溯”……\windows\system32\msvcrt.dll”來執行command的,不過在oracle 10gr2已經不行了,是以測試這個 代碼的時候我是直接把msvcrt.dll複制到$ORACLE_HOME\bin\下,面對這種情況,我們可以利用PL/SQL來複制msvcrt.dll,或者用JAVA來執行命

令,我比較偏愛JAVA 

不過在執行這個MYJAVACMD之前必須将相應的JAVA權限賦予使用者,之前提到的DBMS_JVM_EXP_PERMS就可以給使用者賦予任意java權限,簡單起見,我們直接賦予

突然發現我的題目是hacking oracle with sql inject,不是with pl/sql...讓我們簡單結合dbms_xmlquery.newcontext來在web下使用

由于用了dbms_xmlquery.newcontext之後,代碼就慘不忍睹了,下面幾篇就不結合dbms_xmlquery.newcontext來使用了,反正都懂的 

0x4 檔案系統

下面我們将利用pl/sql來讀取檔案,其實擷取dba權限之後,怎麼樣對系統進行操作完全就是個人pl/sql或java水準的展現

上面是PL/SQL代碼來讀取檔案,下面是利用JAVA來讀取檔案内容

我們還是可以利用之前的那個DBMS_JVM_EXP_PERMS擷取java.io.FilePermission,可以簡單讀取檔案

0x5 通路網絡

在PL/SQL中我們可以利用oracle自帶的那幾個包(utl_tcp,utl_http…etc)來通路網絡,自我感覺不怎麼好用,比較喜歡用java, 下面我們來實作一個簡易的java版本反向後門

執行myjavasocket

這樣就可以得到了一個互動的shell了,不過有些不是exe檔案的比如dir就得輸入cmd.exe /c dir 來運作….

其實這篇文章主要都是在講10gr2,都是一些很老的東西,我也隻是稍微的總結了一下,我現在更比較關注大牛們是怎麼發現這些漏洞的, 這篇東西寫了我差不多兩周的時間,對oracle的了解從0到有了一點了解,從中學到了不少東西,本文參照了不少大牛的資料,再一次感謝和膜拜各位大牛

[1] Hacking Oracle From Web 2

[2] hacking Oracle From Web part2-2 

[3] HackingAurora 

[4] best of oracle security 2012 

[5] Integrigy Oracle SQL Injection Attacks 

[6] Oracle web環境注射技術