Less1-Error Based-Single quotes - Strings
第一關是基于字符串單引號的注入咒钟,有錯誤回顯.
正常的參數(shù)是id=1糙臼,這時我們就能看到正確的結果返回
而當我們輸入的是 id=1' 時,數(shù)據(jù)庫就會報錯禾怠,提示我們有錯誤返奉,這時我們就知道id這個參數(shù)存在sql注入漏洞
在箭頭所指的地方可以看到出錯的位置提示是
'' (1')' LIMIT 0,1 ' // 其中最前面和最后面的兩個單引號是顯示時添加的贝搁,并不在查詢語句中
其中括號括起來的是我們輸入的參數(shù),當我們數(shù)單引號的個數(shù)時可以發(fā)現(xiàn)是奇數(shù)個芽偏,說明有一個單引號沒有被閉合掉雷逆,因此數(shù)據(jù)庫報錯,也把錯誤回顯給我們.
因此我們可以猜測這里的sql查詢語句應該是
select * from table_name where id= ' x ' LIMIT 0,1
其中table_name是數(shù)據(jù)庫的名字哮针,x是我們輸入的參數(shù)关面,因此當我們輸入 id=1' 時,mysql就會報錯
這時如果我們輸入的是 id=1'' (后面是兩個單引號)時十厢,返回的結果變回了正常的頁面
其中 %27 是單引號的URL編碼等太,同樣地這時如果也有顯示信息,將會是
'' 1'' ' LIMIT 0,1'
這時去數(shù)單引號的個數(shù)蛮放,是偶數(shù)個則所有單引號都閉合了缩抡,因此不會報錯,頁面返回正常.
另外包颁,如果我們想要去掉多余的單引號 ' 瞻想,我們可以進行如下操作
后面的 ' --+ ' 作用是注釋后面的語句(其實在Mysql中注釋用的是'-- ',最后面有一個空格)娩嚼,這時整條查詢語句就是
select * from table_name where id = '1' or 1=1 --+ LIMIT 0,1
其中 ' or 1=1'這條語句是永真語句蘑险,那么整條語句的查詢結果是查詢id=1的數(shù)據(jù),并且因為注釋掉了后面的 'LIMIT 0,1',返回的不只是一條結果岳悟,但是網頁中只顯示一條佃迄,所以我們只能看到一條結果。(這句話的意思是贵少,數(shù)據(jù)庫返回了多條結果給服務器呵俏,但是服務器只從中選擇了一條結果顯示給用戶)
所以這時,我們就想查看多條結果滔灶,那么怎么辦呢普碎?
首先,我們使用order by n來獲取查詢語句中一共查詢了多少列录平,就是 select 中的是多少列
從n=1,2,3...一直嘗試到頁面出現(xiàn)報錯提示
對比上下兩張圖萄涯,可以說明一共有3列數(shù)據(jù)绪氛,則完善查詢語句有
select 1, 2, 3 from table_name where id = 'x'
接下來我們想知道哪一列數(shù)據(jù)顯示在網頁的哪一個位置,我們可以通過union查詢來構造語句
1'and 1=2 union select 1,2,3 --+
解釋一下為什么要這樣構造語句涝影,首先,我們把輸入的拼接到整個查詢語句中
select 1,2,3 from table_name where id = '1' and 1=2 union select 1,2,3 --+ LIMIT 0,1
其中union select 是把前后兩個select 語句查詢的結構拼接在一起争占,從前面的order by 查詢結果可以知道一共查詢了3列數(shù)據(jù)燃逻,因此后面的union select 也要查詢3列數(shù)據(jù)序目,不然數(shù)據(jù)庫會報錯.
接著我們看前面的 id='1' and 1=2,因為and需要前后都是真的時候才能返回結果伯襟,否則返回的是空結果猿涨,而 1=2永遠都是假,所以前面的select查詢是沒有結果的姆怪,而后面的union select查詢的結果是顯示 1,2,3.因此在頁面上我們可以看到2和3顯示出來叛赚,而不是之前id=1時用戶的名字和密碼。
為什么要讓前面的查詢結果是空呢稽揭?因為我們前面有提到過俺附,服務器返回給我們用戶的只有一條結果,而為了讓這條結果使我們預期的結果溪掀,也就是1,2,3. 那么我們讓前面查詢結果為空時事镣,返回我們想要的結果,這時我們就能判斷查詢的結果分別顯示在什么位置揪胃。當然我們也可以用 id=-1來使得前面的查詢結果為空.
接下來璃哟,我們就可以根據(jù)上一篇文章總結的流程:數(shù)據(jù)庫-數(shù)據(jù)表-列-數(shù)據(jù) 一層一層進行注入獲取到我們想要的數(shù)據(jù)
1. 獲取數(shù)據(jù)庫,構造語句
-1' union select 1, group_concat(schema_name),3 from information_schema.schemata --+
可以看到這時,我們把服務器上所有的數(shù)據(jù)庫名都列出來了喊递。方法就是查詢information_schema這個數(shù)據(jù)庫的schemata表中的schema_name這個字段的數(shù)據(jù)
2. 獲取數(shù)據(jù)表随闪,構造語句
-1' union select 1, group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
這條語句是查詢'security'這個數(shù)據(jù)庫的所有數(shù)據(jù)表,同樣是通過information_shcema這個數(shù)據(jù)庫,不同的是通過tables這個表
3. 獲取數(shù)據(jù)列骚勘,構造語句
-1' union select 1,group(column_name),3 from information_schema.columns where table_name='users' --+
4. 獲取數(shù)據(jù)
-1' union select 1,username,password from security.users where id=1 --+
通過這條語句的查詢結果铐伴,我們可以猜測到原始的查詢語句應該是
select username, password from users where id='x'
其中x是我們輸入的參數(shù)
這時我們去翻看網頁的源碼可以看到和我們猜測的一樣。
Less2 - Error Based - Intiger based
第二關是關于整數(shù)型數(shù)據(jù)的注入调鲸,和第一關類似盛杰,但是有一點小區(qū)別
可以看到區(qū)別在于對參數(shù)的使用上少了兩個單引號 ' ',也就是查詢的語句變成了
select * from table_name where id = x LIMIT 0,1
可以看到在后面輸入的參數(shù)x處沒有單引號包圍著藐石,所以此時我們也就不需要破壞原來的單引號即供,可以直接用union select。
翻看網頁的源碼檢查一下
其他的和第一關都是一樣的于微,我們可以利用第一關的方法和流程逗嫡,同樣對這關進行Sql注入的練習
Less3 - Error Based - Single quotes with twist - string
這一關和第一關一樣含有單引號,另外還用了括號把參數(shù)包圍了起來
當我們輸入 id=1'時可以看到異常頁面
可以看到報錯顯示了
'1'') LIMIT 0,1
結合我們前面第一關的報錯株依,我們可以猜測到這里用到查詢語句是
select * from table_name where id = (' x ') LIMIIT 0,1
這時我們要想像第一關用union select注入前驱证,我們必須自己閉合掉左括號,然后注釋右括號恋腕,也就是使用
1' ) union select 1,2,3--+
這樣的語句抹锄,當我們帶回到原來的語句可以看到查詢語句被我們修改成
select * from table_name where id=(' 1') union select 1,2,3 --+ ') LIMIT 0,1
在 '--+'后面的語句都被注釋,這樣我們就能成功注入到數(shù)據(jù)庫中,否則如果我們還是用第一關的
方法
' 1' union select 1,2,3 --+ '
時伙单,查詢語句就會變成
select * from table_name where id = (' 1' union select 1,2,3 --+ ') LIMIT 0,1
這時因為' --+ '注釋了后面的括號获高,所以數(shù)據(jù)庫就會報錯
當然閉合這里括號不只是這一種,還有很多其他的方法吻育,例如
') or '1'=('1'
念秧,接下來就和第一關的類似了
Less4 - Error Based - double quotes - string
這一關是關于雙引號的,而雙引號和單引號是類似的布疼,我們只需把第一關的單引號都換成雙引號就可以了
當我們輸入id=1"時
可以看到報錯顯示了
" 1 " ") LIMIT 0,1
摊趾,這意味著代碼當中對id參數(shù)進行了 " "和( )的包裝,翻看源碼可以看到那么我們就可以輸入id=1") union select 1,2,3 --+ 進行和第一關一樣的注入
總結
到目前為止游两,對Less1-Less4的注入學習的差不多了砾层,基本的注入流程我們也過了一遍,按照數(shù)據(jù)庫->數(shù)據(jù)表->數(shù)據(jù)列->數(shù)據(jù)的順序一層層獲取我們想要的數(shù)據(jù)器罐。Less1到Less4是最簡單的注入了梢为,沒有對用戶輸入的參數(shù)進行任何過濾,直接拼接到查詢語句中轰坊,這使得我們能很輕松的利用sql注入進入到數(shù)據(jù)庫獲取到我們想要的數(shù)據(jù).