天天看點

Web應用手工滲透測試—用SQLMap進行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表示擷取資料庫中的所有記錄,之後的;–表示結束查詢,告訴資料庫目前語句後面沒有其它查詢語句了。

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

圖1 正常方式檢視使用者資訊

  将payload注入後,伺服器洩露了資料庫中的所有使用者資訊。如圖2所示:

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

圖2 注入payload導緻資料庫中所有資料洩露

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

  如果讀者首次使用sqlmap,不需要什麼預先操作。如果已經使用過該工具,需要使用—purge-output選項将之前的輸出檔案删除,如下圖所示:

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

圖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,執行指令時可能産生如下圖所示的錯誤提示:

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

  這裡必須在請求頭中指定一個ip位址,使kali linux能與xp正常通信,修改如下圖所示:

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

  之後指令就能正常執行了,顯示結果如下圖所示:

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

  基本上該工具做的就是分析請求并确定請求中的第一個參數,之後對該參數進行各種測試,以确定伺服器上運作的資料庫類型。對每個請求,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正在對指定的請求進行檢測時顯示的資料庫清單:

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

  首先它會确定給定的參數是否可注入。根據本文示範的情況,我們已經設定owasp mutillidae的安全性為0,是以這裡是可注入的,同時sqlmap也檢測到背景資料庫dbms可能為mysql。

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

  如上圖所示,工具識别背景資料庫可能為mysql,是以提示使用者是否跳過其它類型資料庫的檢測。

  “由于本文在示範之前已經知道被檢測資料庫是mysql,是以這裡選擇跳過對其它類型資料庫的檢測。”

  之後詢問使用者是否引入(include)測試mysql相關的所有payload,這裡選擇“yes”選項:

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

  測試過一些payloads之後,工具已經識别出get參數上一個由錯誤引起的注入問題和一個boolean類型引起的盲注問題。

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

  之後顯示該get參數username是一個基于mysql union(union-based)類型的查詢注入點,是以這裡跳過其它測試,深入挖掘已經找出的漏洞。

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

  至此,工具已經識别出應該深入挖掘的可能的注入點:

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

  接下來,我把參數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資料庫系統的目前使用者。指令得到輸出如下圖所示:

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

  同時也可以看到工具也識别出了作業系統名,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

  指令輸出如下圖所示:

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

  self-critical evaluation

  有時可能沒有成功擷取到密碼,隻得到一個null輸出,那是因為系統管理者可能沒有為指定的使用者設定認證資訊。如果使用者是在本機測試,預設情況下使用者root@localhost是沒有密碼的,需要使用者自己為該使用者設定密碼,可以在mysql的user資料表中看到使用者的清單,通過輕按兩下password區域來為其添加密碼。或者可以直接用下圖所示的指令直接更新指定使用者的密碼:

  這裡将密碼設定為“sysadmin“,這樣sqlmap就可以擷取到該密碼了,如果不設定的話,得到的就是null。

  通過以上方法,我們不直接與資料庫伺服器通信,通過sql注入得到了管理者的登入認證資訊。

  總結

  本文描述的注入方法就是所謂的sql盲注,這種方法更繁瑣,很多情況下比較難以檢測和利用。相信讀者已經了解傳統sql注入與sql盲注的不同。在本文所處的背景下,我們隻是輸入參數,看其是否以傳統方式響應,之後憑運氣嘗試注入,與之前示範的注入完全是不同的方式。

最新内容請見作者的github頁:http://qaseven.github.io/