qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Web應用手工滲透測試—用SQLMap進行SQL盲注測試

           簡介
            本文主要關注SQL注入,假設讀者已經了解一般的SQL注入技術,在我之前的文章中有過介紹,即通過輸入不同的參數,等待服務器的反應,之后通過不同的前綴和后綴(suffix and prefix )注入到數據庫。本文將更進一步,討論SQL盲注,如果讀者沒有任何相關知識儲備,建議先去wikipedia學習一下。在繼續之前需要提醒一下,如果讀者也想要按本文的步驟進行,需要在NOWASP Mutillidae環境搭建好之后先注冊一個NOWASP Mutillidae帳號。
            SQL注入前言
            本文演示從web界面注入SQL命令的方法,但不會直接連接到數據庫,而是想辦法使后端數據庫處理程序將我們的查詢語句當作SQL命令去執行。本文先描述一些注入基礎知識,之后講解盲注的相關內容。
            Show Time
            這里我以用戶名“jonnybravo”和密碼“momma”登錄,之后進入用戶查看頁面,位于OWASP 2013 > A1 SQL Injection > Extract data > User Info。要查看用戶信息,需要輸入用戶ID與密碼登錄,之后就可以看到當前用戶的信息了。
            如我之前的文章所提到的那樣,這個頁面包含SQL注入漏洞,所以我會嘗試各種注入方法來操縱數據庫,需要使用我之前文章提到的后綴(suffix)與前綴(prefix)的混合。這里我使用的注入語句如下:
            Username: jonnybravo’ or 1=1; –
            該注入語句要做的就是從數據庫查詢用戶jonnybravo,獲取數據后立刻終止查詢(利用單引號),之后緊接著一條OR語句,由于這是一條“if狀態”查詢語句,而且這里給出 “or 1=1”,表示該查詢永遠為真。1=1表示獲取數據庫中的所有記錄,之后的;–表示結束查詢,告訴數據庫當前語句后面沒有其它查詢語句了。
            
          圖1 正常方式查看用戶信息
            將payload注入后,服務器泄露了數據庫中的所有用戶信息。如圖2所示:
            
          圖2 注入payload導致數據庫中所有數據泄露
            至此,本文向讀者演示了一種基本SQL注入,下面筆者用BackTrack和Samurai 等滲透測試發行版中自帶的SQLmap工具向讀者演示。要使用SQLmap,只需要打開終端,輸入SQLmap并回車,如下圖所示:
            如果讀者首次使用SQLmap,不需要什么預先操作。如果已經使用過該工具,需要使用—purge-output選項將之前的輸出文件刪除,如下圖所示:
            
          圖3 將SQLmap output目錄中的原輸出文件刪除
          本文會演示一些比較獨特的操作。通常人們使用SQLmap時會直接指定URL,筆者也是用該工具分析請求,但會先用Burp查看請求并將其保存到一個文本文件中,之后再用SQLmap工具調用該文本文件進行掃描。以上就是一些準備工作,下面首先就是先獲取一個請求,如下所示:
            GET /chintan/index.php?page=user-info.php&username=jonnybravo&password=
            momma&user-info-php-submit-button=View+Account+Details HTTP/1.1
            Host: localhost
            User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
            Accept-Language: en-US,en;q=0.5
            Accept-Encoding: gzip, deflate
            Referer: http://localhost/chintan/index.php?page=user-info.php
            Cookie: showhints=0; username=jonnybravo; uid=19; PHPSESSID=f01sonmub2j9aushull1bvh8b5
            Connection: keep-alive
            將該請求保存到一個文本文件中,之后發送到KALI linux中,用如下命令將該請求頭部傳給SQLmap:
            SQLmap –r ~/root/Desktop/header.txt
            命令中-r選項表示要讀取一個包含請求的文件,~/root/Desktop/header.txt表示文件的位置。如果讀者用VMware,例如在Windows上用虛擬機跑KALI,執行命令時可能產生如下圖所示的錯誤提示:
            這里必須在請求頭中指定一個IP地址,使KALI linux能與XP正常通信,修改如下圖所示:
            之后命令就能正常執行了,顯示結果如下圖所示:
            基本上該工具做的就是分析請求并確定請求中的第一個參數,之后對該參數進行各種測試,以確定服務器上運行的數據庫類型。對每個請求,SQLmap都會對請求中的第一個參數進行各種測試。
            GET /chintan/index.php?page=user-info.php&username=jonnybravo&password=momma&user-
            info-php-submit-button=View+Account+Details HTTP/1.1
            SQLmap可以檢測多種數據庫,如MySQL、Oracle SQL、PostgreSQL、Microsoft SQL Server等。
            下圖是筆者系統中SQLmap正在對指定的請求進行檢測時顯示的數據庫列表:
            首先它會確定給定的參數是否可注入。根據本文演示的情況,我們已經設置OWASP mutillidae的安全性為0,因此這里是可注入的,同時SQLmap也檢測到后臺數據庫DBMS可能為MYSQL。
            如上圖所示,工具識別后臺數據庫可能為MYSQL,因此提示用戶是否跳過其它類型數據庫的檢測。
            “由于本文在演示之前已經知道被檢測數據庫是MYSQL,因此這里選擇跳過對其它類型數據庫的檢測。”
            之后詢問用戶是否引入(include)測試MYSQL相關的所有payload,這里選擇“yes”選項:
            測試過一些payloads之后,工具已經識別出GET參數上一個由錯誤引起的注入問題和一個Boolean類型引起的盲注問題。
            之后顯示該GET參數username是一個基于MYSQL union(union-based)類型的查詢注入點,因此這里跳過其它測試,深入挖掘已經找出的漏洞。
            至此,工具已經識別出應該深入挖掘的可能的注入點:
            接下來,我把參數username傳遞給SQLmap工具,以對其進行深入挖掘。通過上文描述的所有注入點和payloads,我們將對username參數使用基于Boolean的SQL盲注技術,通過SQLmap中的–technique選項實現。其中選擇如下列表中不同的選項表示選用不同的技術:
            B : 基于Boolean的盲注(Boolean based blind)
            Q : 內聯查詢(Inline queries)
            T : 基于時間的盲注(time based blind)
            U : 基于聯合查詢(Union query based)
            E : 基于錯誤(error based)
            S : 棧查詢(stack queries)
            本例中也給出了參數名“username”,因此最后構造的命令如下:
            SQLmap –r ~root/Desktop/header.txt – -technique B – -p username – -current-user
           這里-p選項表示要注入的參數,“–current-user“選項表示強制SQLmap查詢并顯示登錄MYSQL數據庫系統的當前用戶。命令得到輸出如下圖所示:
            同時也可以看到工具也識別出了操作系統名,DBMS服務器以及程序使用的編程語言。
            “”當前我們所做的就是向服務器發送請求并接收來自服務器的響應,類似客戶端-服務器端模式的交互。我們沒有直接與數據庫管理系統DBMS交互,但SQLmap可以仍識別這些后臺信息。
            同時本次與之前演示的SQL注入是不同的。在前一次演示SQL注入中,我們使用的是前綴與后綴,本文不再使用這種方法。之前我們往輸入框中輸入內容并等待返回到客戶端的響應,這樣就可以根據這些信息得到切入點。本文我們往輸入框輸入永遠為真的內容,通過它判斷應用程序的響應,當作程序返回給我們的信息。“
            結果分析
            我們已經給出當前的用戶名,位于本機,下面看看它在后臺做了什么。前文已經說過,后臺是一個if判斷語句,它會分析該if查詢,檢查username為jonnybravo且7333=7333,之后SQLmap用不同的字符串代替7333,新的請求如下:
            page=user-info.php?username=’jonnybravo’ AND ‘a’='a’ etc..FALSE
            page=user-info.php?username=’jonnybravo’ AND ‘l’='l’ etc..TRUE
            page=user-info.php?username=’jonnybravo’ AND ‘s’='s’ etc..TRUE
            page=user-info.php?username=’jonnybravo’ AND ‘b’='b’ etc..FALSE
            如上所示,第一個和最后一個查詢請求結果為假,另兩個查詢請求結果為真,因為當前的username是root@localhost,包含字母l和s,因此這兩次查詢在查詢字母表時會給出包含這兩個字母的用戶名。
            “這就是用來與web服務器驗證的SQL server用戶名,這種情況在任何針對客戶端的攻擊中都不應該出現,但我們讓它發生了。”
            去掉了–current-user選項,使用另外兩個選項-U和–password代替。-U用來指定要查詢的用戶名,–password表示讓SQLmap去獲取指定用戶名對應的密碼,得到最后的命令如下:
            SQLmap -r ~root/Desktop/header.txt --technique B -p username -U root@localhost --passwords
            命令輸出如下圖所示:
            Self-Critical Evaluation
            有時可能沒有成功獲取到密碼,只得到一個NULL輸出,那是因為系統管理員可能沒有為指定的用戶設定認證信息。如果用戶是在本機測試,默認情況下用戶root@localhost是沒有密碼的,需要使用者自己為該用戶設置密碼,可以在MySQL的user數據表中看到用戶的列表,通過雙擊password區域來為其添加密碼。或者可以直接用下圖所示的命令直接更新指定用戶的密碼:
            這里將密碼設置為“sysadmin“,這樣SQLmap就可以獲取到該密碼了,如果不設置的話,得到的就是NULL。
            通過以上方法,我們不直接與數據庫服務器通信,通過SQL注入得到了管理員的登錄認證信息。
            總結
            本文描述的注入方法就是所謂的SQL盲注,這種方法更繁瑣,很多情況下比較難以檢測和利用。相信讀者已經了解傳統SQL注入與SQL盲注的不同。在本文所處的背景下,我們只是輸入參數,看其是否以傳統方式響應,之后憑運氣嘗試注入,與之前演示的注入完全是不同的方式。

          posted on 2014-10-30 10:38 順其自然EVO 閱讀(1005) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄數據庫

          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林州市| 吉水县| 赣州市| 芦山县| 股票| 和硕县| 新河县| 宣恩县| 盱眙县| 林芝县| 大名县| 左云县| 吉水县| 塔城市| 宣化县| 长岭县| 临汾市| 山阴县| 正定县| 淳化县| 永善县| 广州市| 云阳县| 桦南县| 天水市| 汶川县| 长沙县| 石景山区| 雷州市| 建阳市| 临潭县| 苏州市| 南岸区| 武邑县| 甘泉县| 呼图壁县| 夏邑县| 隆德县| 张家口市| 沂南县| 鲁甸县|