Oracle數據庫注入基礎入門
Oracle數據庫注入基礎入門
前排摘要:此隨筆的案例取材大部分來自PortSwigger靶場
閱讀時間:大約10分鐘
學習原因
最近幾天在研究BurpSuite官方的TOP10靶場,發現里面不僅僅包含了MySQL數據庫的注入,還包含了其它數據庫的SQL注入。對于MySQL數據庫而言,相關的文章和教程可謂“百花齊放”。但Oracle數據庫的注入,并且講的相對于TOP10入門的新手而言,卻寥寥無幾。本篇作為個人學習隨筆,并不具備學術專業性,僅作為自己記載的前提下,能幫助更多的新人學習Oracle數據庫注入
資源共享
靶場地址:https://portswigger.net/web-security/all-labs
Burpsuite靶場SQL注入篇記載:http://www.rzrgm.cn/flyingfirework/articles/19103750
一、SQL注入的原理(會MySQL數據庫注入的佬,可以跳過)
SQL注入的本質是:將惡意的SQL代碼插入到應用程序的輸入參數中,欺騙后端數據庫執行非預期的SQL命令。
文字可能解釋得太籠統,不如來看示例
例一:SQL注入原理示例
假設這里有一個Web應用程序,主要功能是登錄。那么可以猜測其后臺代碼可能是
SELECT * FROM users WHERE username = ? AND password = ?【?處為用戶輸入的賬號密碼】
我們都知道,你輸入的東西,會被帶往后臺程序去執行。假如數據庫賬戶里面有:
username=admin;
password=123456;
那么正常登錄情況,應該是
SELECT * FROM users WHERE username = 'admin' AND password = '123456'
數據庫如果查詢到了賬戶名為admin,密碼為123456的賬戶,條件就會為真,即放行登錄請求
那么,如果我們加入一點小小的程序謊言呢?
SELECT * FROM users WHERE username = 'admin' or '1'='1' AND password = '123456'
PS:【admin' or '1'='1】為用戶輸入的內容
后端其實分不清楚哪些是程序員寫的,哪些是用戶輸入的。站在程序角度思考,你輸入的東西可以被當作命令語句執行,那我就當作命令語句執行
分析語句,可知 '1'='1'一定是成立的(恒真),這里采取了or運算,也就是單方面為真則整體為真,那么語句整體為真,就會放行登錄請求
這就是SQL注入產生的邏輯
二、Oracle數據庫注入與MySQL數據庫的區別
其實并沒有很大的區別
我們只需要記住Oracle數據庫的幾個特性與相關聯的表即可
在MySQL中,一個SELECT可以不用對應FROM。但在Oracle數據庫中,一個SELECT必須對應一個FROM
這句話理解起來其實并不難,還是用例子來解釋:
例二:Oracle數據庫SELECT函數對應FROM示例
假設我們的注入語句如下(基于MySQL的注入方式)
?category=Gifts' union select 1,2,3--+
這是一個很經典的測試返回位的注入語句,但是這樣寫,在Oracle數據庫中會報錯
Oracle數據庫有一個單行虛擬表【dual】,當你不打算獲取真實數據表的數據時,一般跟FROM dual
?category=Gifts' union select 1,2,3 from dual--+
這是Oracle的特性之一,當然還有第二個特性:
?category=Gifts' union select column_name,NULL from information_schema.columns where table_name='users_vhfyyn'--+
這是一個很經典的MySQL獲取字段名的SQL注入語句。其中information_schema表是用于描述數據庫中結構信息的表
說人話就是,information_schema數據表存放了數據庫名/數據表名/數據列名
但是,Oracle數據庫沒有information_schema表,那該如何代替進行注入?
只是換了個名字而已,Oracle數據庫也有類似的表:
all_tables:列出當前用戶可訪問的表(自己擁有的 + 被授權訪問的表)的信息
all_tab_columns:列出當前用戶可訪問的表的列信息(自己擁有 + 被授權訪問的表)
user_tables:列出當前用戶 自己擁有的表 的信息(只顯示自己 schema 下的表)
user_tab_columns:列出當前用戶 自己擁有的表的列信息。
dba_tables:顯示數據庫中 所有表 的信息,不論表屬于哪個用戶
dba_tab_columns:顯示數據庫中 所有表的列信息,不論屬于哪個 schema
做個表格,更方便閱讀:

那么,如果示例中的數據庫是Oracle數據庫,則我們應該改成:
?category=Gifts' union select column_name,NULL from all_tab_columns where table_name='USERS_ZLVTEV'--+
如果你能看到這,你就可以做一些基礎的Oracle數據庫注入的實驗了。

浙公網安備 33010602011771號