天天看點

手動web應用程式滲透測試-模糊測試中的字尾與字首

介紹

本文重點講述采用模糊測試的方法測試目标Web應用程式時,可利用的字首和字尾文法。

句法

字尾文法- 字母字元+特殊字元(Suffix Syntax – AlphabeticsSpecialcharacters)指字母字元後加特殊字元。因其以特殊字元結尾,故而稱之為字尾。

例如:jonnybravo' (此處jonnybravo是一個字元串,而'是一個特殊字元。)

字首文法-特殊字元+ 字母字元(Prefix Syntax – SpecialcharactersAlphabetics)指特殊字元後跟字母字元。因其把特殊字元放在開始,故而稱之為字首。

例如:‘jonnybravo (此處‘是一個特殊字元,而jonnybravo是一個字元串)

分析

此處以一個字尾的例子做示範,驗證并觀察其結果。下圖顯示了在使用者名處輸入字尾文法的字元串jonnybravo'的結果。

輸入字元串jonnybravo’

GET /chintan/index.php?page=user-info.php&username=jonnybravo%27&password=&user-info-php-submit-button=View+Account+Details HTTP/1.1

Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateReferer: http://localhost/chintan/index.php?page=user-info.phpCookie: showhints=0; PHPSESSID=39hb01vtdib9sov8rmmfok7kn2Connection: keep-alive

URL中特殊字元的編碼

輸入該字元串後,截取該請求,可知浏覽器将此輸入作為URL的特定格式進行編碼解析。是以特殊字元“'”轉義為“%27”,然後通過浏覽器發送到伺服器。

以下列出了URL中特殊符号及對應的十六進制編碼(編碼的格式為:%加字元的ASCII碼,即一個百分号%,後面跟對應字元的ASCII(16進制)碼值):

! - 21% 

@ - 40% 

# - 23% 

$ - 24% 

^ - %5E

& - %26

* - %2A

( - 28% 

) - 29% 

{ - %7B

} - %7D

- 2D% 

+ - 2B

[ - %5B

】 - 5D% 

; - %3B

: - %3A

- %5C

| - %7C

, - %2C

< - %3C

。 - %2E

> - %3E

/ - %2F

? - %3F

轉發以上的GET請求,得到一個錯誤頁面,提示使用者名是不合法的,如下圖所示:

手動web應用程式滲透測試-模糊測試中的字尾與字首

首先從上面的錯誤頁面可以看出在消息框中的jonnybravo'是我們輸入的字元串。然後分析顯示在消息框中的SQL查詢語句。該查詢如下所示:

Query: SELECT username FROM accountsWHERE username=’jonnybravo”;

通過檢視這個SQL查詢語句,會立刻知道需要一個字尾和字首以完成查詢語句本身。通過以下這個格式的查詢語句來說明這個問題:

Query: SELECTusername FROM accounts WHERE username=’jonnybravo”;

這裡字尾'結尾該SQL語句,故而一旦輸入jonnybravo',那麼該文法中的字尾'和jonnybravo之前的 ‘組合起來已經完成了查詢文法。可以清楚地看到在開始和結束的特殊字元'是由伺服器查詢文法提供的,但此處輸入字元中增加的一個'完成了該語句查詢,在執行查詢時剩餘的一個‘導緻産出錯誤。因為有一個未用的'字元,這不符合SQL查詢文法的規則。簡而言之,輸入字元中jonnybravo的字尾和伺服器提供的字首配對完成了查詢語句,而伺服器提供的字尾未被采用故而導緻了SQL文法錯誤。

“如果不能正常關閉,那麼無論什麼輸入,它永遠不會正常完成,你會得到一個錯誤頁面。”

這是唯一的使用者名查詢頁面,是以可能會嘗試通過背景運作去送出該查詢。繼續到認證頁面進行測試,可能會看到查詢語句中的“使用者名”和“密碼”字段。此處将jonnybravo’作為使用者名并以momma作為密碼,在使用者名輸入字元串後添加了字尾’,并以簡單字元作為密碼。有時需要将兩者同時送出作為查詢語句。查詢文法如下所示。

Query: SELECT * FROM accounts WHERE username=’jonnybravo”AND password=’momma’

假設我們想要忽略執行上面查詢語句中的AND password=’momma’。那麼需要如何才能做到呢? 這裡将使用'作為字首并以(空格)-作為字尾。之是以用(空格)-是因為假設這是一個MYSQL伺服器,是以當輸入(空格) -時,它被解讀為一個注釋符号。在這種情況下無論這之後是什麼内容都将被視為注釋語句,注釋部分在伺服器執行查詢語句時會被忽略。

注入 – ' -

然後,在輸入字段中添加諸如 or 1 = 1' 這樣的載荷,如此一來,最終注入語句類似如下所示:

注入 – ' or 1 = 1' -

一旦将此語句注入到使用者名字段,會産生如下圖所示的錯誤。

手動web應用程式滲透測試-模糊測試中的字尾與字首

分析上述的注入語句,由送出字元串中的'來完成“username”使用者名字段,使用者名字段包括了來自伺服器的‘ ‘字元,但因為其中加入了注入語句,使其成為‘ ‘ or 1=1′ — ‘。進一步分析查詢語句:

Username=’ ‘ or 1=1′ — ‘ AND password=’ ‘.

之前已經提到,已假定這是MySQL伺服器,是以(空格)–後的任何語句都将作為注釋語句來解讀。 那麼重新分析這個查詢語句,可以看出,這個查詢語句中唯一執行了的部分隻剩下了1=1′。 是以,這是如何使用一個字尾和字尾進行SQL注入的方法 。 由于在1=1後添加一個'可以産出一個在頁面上産出一個錯誤,那麼如果删除了多餘的',那麼這個注入将正常完成,伺服器不會拒絕1 = 1這種正确的邏輯,是以伺服器将執行該查詢。 故而最終的注入語句變成了 'or 1 = 1 -,把這串字元送出給使用者名字段,将會看到如下圖所示的查詢結果:

手動web應用程式滲透測試-模糊測試中的字尾與字首

由顯示結果可知,伺服器成功被注入,頁面上顯示出了資料庫整個表中存儲的所有結果,包括使用者名、密碼及其他字段的資訊詳情。

結論

在這篇文章中,簡單介紹了字尾和字首,以及如何使用它們進行web程式的模糊測試,文中以MySQL伺服器為例,但這種方法和思路同樣适用于其他伺服器。

附注:

同作者曾發表了一系列關于手動web應用程式滲透測試的文章,其中與模糊測試方法相關的文章清單如下,如有興趣可點選以下連結進行閱讀:

  1. 手動web應用程式滲透測試:模糊測試 http://resources.infosecinstitute.com/manually-web-application-penetration-testing-fuzzing/
  2. 手動web應用程式滲透測試:使用Burp工具時的模糊測試參數 http://resources.infosecinstitute.com/web-services-penetration-testing-part-6-fuzzing-parameters-burp/
  3. 手動web應用程式滲透測試:更多與Burp工具相關的模糊測試 http://resources.infosecinstitute.com/web-services-penetration-testing-part-7-fuzzing-burp/