CTF-WEB總結之SQL注入

簡介

SQL注入漏洞的原理是由於開發者在編寫操作數據庫代碼時,直接將外部可控的參數拼接到SQL語句中,沒有經過任何過濾或過濾不嚴謹,導致攻擊者可以使惡意語句在數據庫引擎中執行。在這裏插入圖片描述
Union注入
在這裏插入圖片描述
在這裏插入圖片描述
利用內置函數爆數據庫信息及相關信息
version()
database()
user()
current_user()
@@datadir數據庫路徑
@@basedir mysql安裝路徑
@@version_compile_os操作系統

mysql>5.0版本會有information_schema ,確切說是信息數據庫。其中保存着關於MySQL服務器所維護的所有其他數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權 限等。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。
information_schema數據庫表說明:

SCHEMATA表:提供了當前mysql實例中所有數據庫的信息。是show databases的結果取之此表。

TABLES表:提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪個schema,表類型,表引擎,創建時間等信息。是show tables from schemaname的結果取之此表。

COLUMNS表:提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。是show columns from schemaname.tablename的結果取之此表。

STATISTICS表:提供了關於表索引的信息。是show index from schemaname.tablename的結果取之此表。

USER_PRIVILEGES(用戶權限)表:給出了關於全程權限的信息。該信息源自mysql.user授權表。是非標準表。

SCHEMA_PRIVILEGES(方案權限)表:給出了關於方案(數據庫)權限的信息。該信息來自mysql.db授權表。是非標準表。

TABLE_PRIVILEGES(表權限)表:給出了關於表權限的信息。該信息源自mysql.tables_priv授權表。是非標準表。

COLUMN_PRIVILEGES(列權限)表:給出了關於列權限的信息。該信息源自mysql.columns_priv授權表。是非標準表。

CHARACTER_SETS(字符集)表:提供了mysql實例可用字符集的信息。是SHOW CHARACTER SET結果集取之此表。

COLLATIONS表:提供了關於各字符集的對照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明瞭可用於校對的字符集。這些列等效於SHOW COLLATION的前兩個顯示字段。

TABLE_CONSTRAINTS表:描述了存在約束的表。以及表的約束類型。

KEY_COLUMN_USAGE表:描述了具有約束的鍵列。

ROUTINES表:提供了關於存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名爲“mysql.proc name”的列指明瞭對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:給出了關於數據庫中的視圖的信息。需要有show views權限,否則無法查看視圖信息。

TRIGGERS表:提供了關於觸發程序的信息。必須有super權限才能查看該表

利用informations_schema獲取數據庫信息
在這裏插入圖片描述
放大一些:
在這裏插入圖片描述
獲取數據庫表的信息
上一步操作獲取的數據庫名稱爲:security,轉化爲16進制:0x7365637572697479
在這裏插入圖片描述
獲取數據庫列信息
在這裏插入圖片描述
獲取內容
在這裏插入圖片描述
limit2,3表示第2行開始的3列
%23是#的url編碼
在這裏插入圖片描述
在url中+就表示空格,有的情況下會過濾空格可使用+代替。有時也使用/**/繞過

SQL注入一般步驟

(這裏講最通用的 mysql>5.0)
獲取數據庫(非必要,因爲前面的database可以獲得)and 1=2 union select 1,2,schema_name from information_schema.schemata limit 0(開始的記錄,0爲第一個開始記錄),1(顯示1條
記錄) %23
獲取表 and 1=2 union select 1,2,table_name from information_schema.tables where table_schema = ‘數據庫名字’(最常用的是十六進制表示的數據庫,’容易被過濾) limit 0,1 %23
獲取列 and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=0x十六進制數據庫 and table_name=0x十六進制表 limit 0,1 %23
獲取內容 and 1=2 union select 1,2,concat_ws(char(32,58,32),username,password) from users(表 名) limit 0,1 %23

SQL注入中select 1,2,3…的作用

select語句在指明要查詢的內容屬性(如select id)後,要加from指明是從哪個數據庫表中獲得數據,在數據庫環境中我們一般會先寫一句use xxxdatabase,之後寫select from語句直接加當前數據庫中的表名就可以了。如果我們沒有聲明使用哪個數據庫,也可以直接寫 select xxxx from security.users(假設要從security數據庫的users表中獲取數據)。而select直接加數字串時,可以不寫後面的表名,那麼它輸出的內容就是我們select後的數字,這時我們寫的一串數字就是一個數組(或1個行向量),這時select實際上沒有向任何一個數據庫查詢數據,即查詢命令不指向任何數據庫的表。返回值就是我們輸入的這個數組,這時它是個1行n列的表,表的屬性名和值都是我們輸入的數組,如下圖:
在這裏插入圖片描述
那麼這個東西有什麼用呢?在SQL注入時,我們可以利用它來進行一個快速測試,在Union注入時,如果我們通過測試已經知道了前面語句的字段數,就可以寫入union 注入語句,但存在一個問題,我們雖然可以通過注入獲得想要的信息,但這些信息必須能夠返回到我們手中,對於網頁來說,如何能夠讓數據回顯是至關重要的。例如一個網站的參數傳遞執行的查詢有3個字段,很可能這些字段不是都顯示在網頁前端的,假如其中的1或2個字段的查詢結果是會返回到前端的,那麼我們就需要知道這3個字段中哪兩個結果會回顯,這個過程相當於找到數據庫與前端顯示的通道。如果我們直接輸入查詢字段進行查詢,語句會非常冗長,而且很可能還需要做很多次測試,這時候我們利用一個簡單的select 1,2,3,根據顯示在頁面上的數字就可以知道哪個數字是這個“通道”,那麼我們只需要把這個數字改成我們想查詢的內容(如id,password),當數據爆破成功後,就會在窗口顯示我們想要的結果。
這裏參考文章https://blog.csdn.net/weixin_44840696/article/details/89166154

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章