SQL注入的一般过程
SQL注入的一般過程
- 概述
- SQL注入的步驟
- 一道例題
- 總結
概述
??SQL注入是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。SQL注入大致可以分為兩類:數字型注入和字符型注入。
SQL注入的步驟
??這里介紹下SQL注入的基本流程,需要明確的是在實際注入中,我們都是無法看到具體的后端代碼的,也就是無法知曉具體的SQL拼接過程。一般SQL注入分為以下7個步驟,目的是通過一步一步的注入來猜測出查詢語句和數據庫結構,最終暴露出數據庫中表的信息,實際操作中大家可以根據需要來進行取舍。
1、判斷注入類型,數字型還是字符型:
??首先,我們需要確定目標是數字型還是字符型注入漏洞,以便我們進一步進行其它注入操作。如下面的php代碼片段所示,第一行代碼代表數字型的sql拼接,其中的變量在sql查詢語句拼接時并沒有用引號括起來;第二行代碼是字符型,其中的變量使用了引號進行拼接。
??下面介紹如何進行判斷,如下代碼所示,首先我們假設注入類型為數字型,分別輸入如下的語句。如果被測試對象是數字型,那么第一行測試語句會返回user_id為1的查詢結果,而第二行語句由于條件and 1=2不成立,所以查詢結果為空。如果被測試對象為字符型的話,將下面語句拼接到sql中,由于user_id的值都不匹配,所以應該是都不返回任何結果,但是注意如果user_id本身是int類型,實際查詢過程中是會返回結果的,這可能是因為對輸入的字符進行了截斷并轉換了類型,造成1 and 1=2在字符類型中會返回user_id為1的查詢結果。當然如果第二個語句返回了結果,我們也可以以此判斷出該注入類型是字符型。
1 and 1=1 1 and 1=2??對于字符型注入判斷,我們也可以這樣進行操作,如下面的兩條注入語句所示,如果是在數字型注入中,由于變量沒有加引號,所以拼接后sql語法錯誤,直接報錯,這和不回顯信息是有區別。因此如果下面的語句注入后提示sql語法錯誤,那么我們可以直接判斷測試對象為數字型注入。而對于字符型注入,第一行語句輸入后和原本的引號前后完全閉合,且邏輯成立,所以回顯出user_id為1的數據;第二行語句輸入后,前后引號也完全閉合,但邏輯不成立,所以返回結果為空。
1' and '1'='1 1' and '1'='2??最后展示一下直接在MySql數據庫中的操作,大家可以更加直觀的感受下結果。
2、猜解sql查詢語句中的字段數
??在這一步中,我們嘗試去猜測出查詢語句中的字段個數,如下注入語句所示,假設為字符型注入,先利用1'實現引號閉環,再利用or 1=1這樣可以暴露出表中所有的數據,最后利用order by num#去看是否報錯來明確查詢語句中的字段數,其中#號用于截斷sql查詢語句。
??當然也可以采用1' or 1=1 union select 1, 2, 3 #的方式,sql查詢截圖示意如下。
3、確定字段的顯示順序
??這里我們直接使用union就行,如下截圖和代碼所示,這里我們故意擾亂了first_name和last_name的兩個位置,查詢出來結果中的1,2會指明數據字段在查詢語句中的位置。
4、獲取當前數據庫
??通過前面的字段數確定以及顯示順序確定,我們就可以結合union操作來獲取數據庫中的信息了。如下代碼和截圖所示,展示了獲取數據庫名的操作,根據前面已經獲取到的字段數以及位置關系,假設有兩個字段,那么下面的查詢語句將會把數據庫的名稱放在第二個字段中。
5、獲取數據庫中的表
??在獲取到當前數據庫名后,我們可以進一步獲取其中表的信息。如下代碼和截圖所示,展示了獲取數據庫中表的信息,information_schema是MySql自帶的信息數據庫,用于存儲數據庫元數據(關于數據的數據),例如數據庫名、表名、列的數據類型、訪問權限等,其中的表實際上都是視圖。information_schema的tables表記錄了數據庫中表的信息,指定table_schema的名稱即可顯示對應數據庫中表的信息。
6.獲取表中的字段名
??進一步獲取其中的字段名,假設要獲取的表為users,如下面的代碼和截圖所示。information_schema的columns表存儲了表中列的信息,也就是表中字段信息,指定table_name表名,即可獲取到對應表的字段信息。
7、下載數據
??最后根據需要,我們獲取表中的信息。這里需要注意的是,我們假設原來的注入語句中只有兩個查詢字段,所以這里select后也只能跟兩個group_concat,想一次性看多余的信息,只能在一個group_concat中進行組合。
一道例題
??這里以2019年的極客大挑戰的LoveSQL為例題進行講解,遠程環境可以在BUUCTF上獲取。打開遠程環境,網站的頁面是這樣的,給了些許提示表明是sql注入,所以接下來我們直接按照sql注入的一般過程看看。
1、確定注入類型
??該題目中有兩個輸入框,也就是說有兩個可以拼接sql的地方,我們在其中任意一個地方進行注入即可。如下截圖所示,1' or 1=1 #,這是按照字符型注入的規則輸入的萬能密碼,也就是說后臺數據庫在查詢時,該sql語句的邏輯一定成立。
??如下圖所示,是嘗試字符型注入后的結果,數字型的注入大家可以自己嘗試一下,不會成功。
2、確定字段數和顯示順序
??在初步嘗試登錄成功后,回顯了一個奇怪的字符串,看起來很像flag,經過各種嘗試后發現并不是,所以接下來還是按照sql注入的步驟進行。我們注入1' union select 1, 2, 3 #,注入過程和效果如下圖所示,發現Hello處顯示了2,Your password is處顯示了3,再經過其它測試發現查詢的字段數只有3列。結合之前登錄成功的界面,可以猜到第2列對應的是用戶名,第3列對應的是密碼。
3、獲取數據庫以及表信息
??這里我將sql注入的步驟融合了,經過前面的注入類型確定和字段數確定,接下來的步驟才是真正尋找信息的過程。如下代碼和截圖所示,展示了泄露出數據庫表信息的過程。
??根據ctf獨特的命名風格,我們猜測大概率flag在表l0ve1ysq1中,接下來是泄露出表字段信息,如下代碼和截圖所示。
??最后看一下表中的數據到底是啥,可以發現flag在password字段中,由于數據太長,flag前半部分在右邊無法全部截圖。
??當然進一步確定flag所在id后,可以這樣打印出來。
總結
不忘初心,砥礪前行!
總結
以上是生活随笔為你收集整理的SQL注入的一般过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是SHA算法
- 下一篇: 建立自己的封装库(二)