sql注入之新手入門樣本詳解,sql新手入門樣本
前言
在學習這篇文章之前,至於要學習了SQL注入的前提知識,可以參考之前寫的一篇sql注入之必備的基礎知識。
認識SQL注入
最開始就從最簡單的開始,進入到less-1開始我們的SQL注入學習之旅。
通過改變http://localhost/sqlilabs/Less-1/?id=3
的id值,頁面上呈現不同的內容(username,password)。
那麼我們就可以猜測在後台中的SQL語句就是根據前台傳入的id值來去對應的資料。
那麼SQL語句的寫法為:
select username,password from table where id=input
判斷存在SQL語句
接下來進行做測試,使用以下的語句進行測試:
http://localhost/sqlilabs/Less-1/?id=3 and 1=1http://localhost/sqlilabs/Less-1/?id=3 and 1=2
這個時候頁面沒有任何的變化,這是不和符合我們預期的結果,因為當id=3 and 1=2
時,SQL語句變為select username,password from table where id=3 and 1=2
頁面應該不會有內容。
確定存在SQL語句
使用了之前的語句不行之後,我們使用如下的語句:
http://localhost/sqlilabs/Less-1/?id=3'
當URl是以上的SQL語句時,頁面上顯示SQL執行錯誤資訊You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''3'' LIMIT 0,1' at line 1
。
其中最關鍵的錯誤資訊是:
''3'' LIMIT 0,1'
最外層的引號是mysql出錯時自動加上的。那麼實際的SQL語句是 '3'' LIMIT 0,1
。我們發現在我們輸入的3'被引號包圍了,那麼我們之前猜測的select username,password from table where id=input
有誤,實際的背景SQL語句應該為:
select username,password from table where id='input'
SQL注入驗證
在確定存在了SQL注入之後,同時知道了後台SQL寫法,那麼此時我們就可以注入自己的SQL注入的代碼。
由於我們可以控制id的值,那麼最終輸入的SQL語句會變為:
select username,password from table where id='input 攻擊代碼'
此時我們就可以構造如下的payload來驗證我們的想法。由於我們的輸入是被一對單引號包裹的,所以我們輸入的語句必須要能夠不被單引號影響。要麼閉合單引號,要麼注釋掉單引號。(可以參考前面的文章)
#閉合單引號id=1 and '1' = '1 # #注釋單引號id=1 and 1=1 # 或者 id=1 and 1=1--+
當我們使用上面的這3個payload之後,頁面顯示的結果是符合預期的。那麼我們也可以確定id參數確實是存在SQL注入的。背景SQL語句的寫法也的確是select username,password from table where id='input'
。
在確定了SQL語句之後,接下裡就是注入SQL注入代碼了。
執行SQL注入
使用SQL語句來進行脫褲,這一點是十分關鍵的。如果僅僅是知道存在SQL注入但是無法脫褲,那麼實際上這個漏洞對於該網站的危害性還是很小的。如何構造正確的SQL語句進行脫褲,這一點也是十分重要的,在下一篇文章中將會詳細地講解SQL注入的詳細的步驟。
注入類型判斷
在本題中的SQL語句就稱之為字元型的SQL注入,因為我們的輸入在SQL語句執行的過程中被單引號所包括,其實在SQL語句執行中,這個id參數被當做是一個字元類型的資料。除了有字元型的SQL注入,當然還有數字型的SQL語句。那麼如何區分這兩者呢?
字元型SQL注入
在確定存在SQL語句這節中,當我們輸入id=3'
是頁面的出錯資訊是 '3'' LIMIT 0,1
。我們發現3'被引號所包圍,那麼說明這個就是一個字元型的SQL注入了。
數字型SQl注入
在less-2中,當我們同樣輸入id=3'
時,頁面的出錯資訊是 ' LIMIT 0,1
,那麼就說明是一個數字型的注入了同時還存在limit
關鍵字,那麼我們猜測less-2中的SQL注入為:
select username,password from table where id=input limit 0,1
以上都可以通過查看原始碼的方式來進行驗證。
SQL語句判斷
但是很多時候我們通過單引號的方式並不能返回sql執行語句的錯誤資訊,就無法通過錯誤資訊得到注入類型。因為很多時候在背景SQL語句會有各種千奇百怪的寫法。
在less-3和less-4中的寫法就是如下:
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"
在less-3中使用了括弧來包裹使用者的輸入
$id = '"' . $id . '"';$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
在less-4中使用了雙引號來包裹使用者的輸入,那麼當你即使加上了單引號進行測試的時候還是無法出發SQL語句執行錯誤。
所以說很多時候僅僅使用單一的符號進行判斷是完全不夠的,要多使用不同類型的符號來進行測試的判斷,使用包括',",\,(,=,&等等字元,甚至有時候還要使用其他的探查方法,因為你無法判斷背景SQL語句的寫法,而且目前很多的網站開發人員已經有了一定的安全意識,可能常規的SQL探查語句也無法使用。關於其他跟多SQL注入的探查語句,網上有很多的資料。
總結
SQL注入的判斷沒有萬能方法,只有不斷的進行嘗試,當你有了一定的經驗之後,就會對注入類型有了自覺,同時對於SQL注入的判斷也會更快。以上就是這篇文章的全部內容了,如果要對實際的網路中的網站進行安全性測試,以上的知識是遠遠不夠的。小編會繼續更新更多sql注入的文章,請繼續關注幫客之家。