Web服務器指紋識別是滲透測試儀的關鍵任務。瞭解正在運行的Web服務器的版本和類型容許測試人員肯定已知的漏洞以及在測試期間使用的相應漏洞。php
目前市場上有幾種不一樣的供應商和Web服務器版本。瞭解正在測試的Web服務器的類型對測試過程有很大幫助,也能夠改變測試過程。能夠經過發送web服務器特定命令並分析輸出來導出該信息,由於每一個版本的web服務器軟件能夠對這些命令做出不一樣的響應。經過了解每種類型的Web服務器如何響應特定命令並將此信息保存在Web服務器指紋數據庫中,滲透測試人員能夠將這些命令發送到Web服務器,分析響應,並將其與已知簽名的數據庫進行比較。請注意,一般須要幾個不一樣的命令來準確識別Web服務器,由於不一樣的版本可能會對同一命令作出相似的反應。不多有不一樣版本對全部HTTP命令做出相同的反應。所以,經過發送幾個不一樣的命令,測試人員能夠提升猜想的準確性。html
查找正在運行的Web服務器的版本和類型,以肯定已知漏洞以及在測試期間使用的相應漏洞。web
識別Web服務器的最簡單和最基本的形式是查看HTTP響應頭中的Server字段。Netcat用於此實驗。數據庫
請考慮如下HTTP請求 - 響應:apache
$ nc 202.41.76.251 80 HEAD / HTTP / 1.0 HTTP / 1.1 200好的 日期:2003年6月16日星期一02:53:29 GMT 服務器:Apache / 1.3.3(Unix)(Red Hat / Linux) 最後修改時間:1998年10月7日星期三,格林威治標準時間11:18:14 ETag:「1813-49b-361b4df6」 Accept-Ranges:字節 內容長度:1179 鏈接:關閉 內容類型:text / html
從Server字段中,能夠理解服務器多是Apache,版本1.3.3,在Linux操做系統上運行。瀏覽器
HTTP響應頭的四個示例以下所示。安全
從Apache 1.3.23服務器:服務器
HTTP / 1.1 200好的 日期:2003年6月15日星期日17:10:49 GMT 服務器:Apache / 1.3.23 最後修改:2003年2月27日星期四03:48:19 GMT ETag:32417-c4-3e5d8a83 Accept-Ranges:字節 內容長度:196 鏈接:關閉 內容類型:文本/ HTML
從Microsoft IIS 5.0服務器:網絡
HTTP / 1.1 200好的 服務器:Microsoft-IIS / 5.0 到期:你的,2003年6月17日01:41:33 GMT 日期:2003年6月16日星期一01:41:33格林尼治標準時間 內容類型:文本/ HTML Accept-Ranges:字節 最後修改時間:2003年5月28日星期三格林尼治標準時間15:32:21 ETag:b0aac0542e25c31:89d 內容長度:7369
從Netscape Enterprise 4.1服務器:工具
HTTP / 1.1 200好的 服務器:Netscape-Enterprise / 4.1 日期:星期一,2003年6月16日06:19:04 GMT 內容類型:文本/ HTML 最後修改日期:2002年7月31日星期三15:37:56 GMT 內容長度:57 接受範圍:字節 鏈接:關閉
從SunONE 6.1服務器:
HTTP / 1.1 200好的 服務器:Sun-ONE-Web-Server / 6.1 日期:2007年1月16日星期二14:53:45 GMT 內容長度:1186 內容類型:text / html 日期:2007年1月16日星期二14:50:31格林尼治標準時間 最後修改時間:2007年1月10日星期三09:58:26 GMT Accept-Ranges:字節 鏈接:關閉
可是,這種測試方法的準確性有限。有幾種技術容許網站對服務器橫幅字符串進行模糊處理或修改。例如,能夠得到如下答案:
403 HTTP / 1.1禁止 日期:星期一,2003年6月16日02:41:27 GMT 服務器:未知 - Webserver / 1.0 鏈接:關閉 內容類型:文本/ HTML; 字符集= ISO-8859-1
在這種狀況下,該響應的服務器字段被混淆。測試人員沒法根據這些信息知道正在運行的Web服務器類型。
更精細的技術考慮了市場上可用的幾種網絡服務器的各類特徵。下面是一些容許測試人員推斷出正在使用的Web服務器類型的方法列表。
HTTP頭字段排序
第一種方法包括觀察響應中幾個頭的排序。每一個Web服務器都有標頭的內部排序。如下面的答案爲例:
來自Apache 1.3.23的迴應
$ nc apache.example.com 80 HEAD / HTTP / 1.0 HTTP / 1.1 200好的 日期:2003年6月15日星期日17:10:49 GMT 服務器:Apache / 1.3.23 最後修改:2003年2月27日星期四03:48:19 GMT ETag:32417-c4-3e5d8a83 Accept-Ranges:字節 內容長度:196 鏈接:關閉 內容類型:文本/ HTML
來自IIS 5.0的響應
$ nc iis.example.com 80 HEAD / HTTP / 1.0 HTTP / 1.1 200好的 服務器:Microsoft-IIS / 5.0 內容位置:http://iis.example.com/Default.htm 日期:1999年1月1日星期五20:13:52 GMT 內容類型:文本/ HTML Accept-Ranges:字節 最後修改時間:1999年1月1日星期五20:13:55 GMT ETag:W / e0d362a4c335be1:ae1 內容長度:133
來自Netscape Enterprise 4.1的回覆
$ nc netscape.example.com 80 HEAD / HTTP / 1.0 HTTP / 1.1 200好的 服務器:Netscape-Enterprise / 4.1 日期:星期一,2003年6月16日06:01:40 GMT 內容類型:文本/ HTML 最後修改日期:2002年7月31日星期三15:37:56 GMT 內容長度:57 接受範圍:字節 鏈接:關閉
響應來自SunONE 6.1
$ nc sunone.example.com 80 HEAD / HTTP / 1.0 HTTP / 1.1 200好的 服務器:Sun-ONE-Web-Server / 6.1 日期:2007年1月16日星期二15:23:37 GMT 內容長度:0 內容類型:text / html 日期:2007年1月16日星期二,格林尼治標準時間15:20:26 最後修改時間:2007年1月10日星期三09:58:26 GMT 鏈接:關閉
咱們能夠注意到,Date,Netscape Enterprise和IIS之間的Date字段和Server字段的順序不一樣。
格式錯誤的請求測試
另外一個有用的執行測試包括將錯誤的請求或不存在的頁面請求發送到服務器。請考慮如下HTTP響應。
來自Apache 1.3.23的迴應
$ nc apache.example.com 80 GET / HTTP / 3.0 HTTP / 1.1 400錯誤請求 日期:2003年6月15日星期日17:12:37 GMT 服務器:Apache / 1.3.23 鏈接:關閉 轉移:分塊 內容類型:文本/ HTML; 字符集= ISO-8859-1
來自IIS 5.0的響應
$ nc iis.example.com 80 GET / HTTP / 3.0 HTTP / 1.1 200好的 服務器:Microsoft-IIS / 5.0 內容位置:http://iis.example.com/Default.htm 日期:1999年1月1日星期五20:14:02 GMT 內容類型:文本/ HTML Accept-Ranges:字節 最後修改時間:1999年1月1日星期五20:14:02 GMT ETag:W / e0d362a4c335be1:ae1 內容長度:133
來自Netscape Enterprise 4.1的回覆
$ nc netscape.example.com 80 GET / HTTP / 3.0 不支持HTTP / 1.1 505 HTTP版本 服務器:Netscape-Enterprise / 4.1 日期:星期一,2003年6月16日06:04:04 GMT 內容長度:140 內容類型:文本/ HTML 鏈接:關閉
響應來自SunONE 6.1
$ nc sunone.example.com 80 GET / HTTP / 3.0 HTTP / 1.1 400錯誤請求 服務器:Sun-ONE-Web-Server / 6.1 日期:2007年1月16日星期二15:25:00 GMT 內容長度:0 內容類型:text / html 鏈接:關閉
咱們注意到每一個服務器都以不一樣的方式回答。答案在服務器版本上也有所不一樣。咱們可使用不存在的HTTP方法/動詞建立請求,從而能夠進行相似的觀察。請考慮如下回復:
來自Apache 1.3.23的迴應
$ nc apache.example.com 80 GET / JUNK / 1.0 HTTP / 1.1 200好的 日期:2003年6月15日星期日17:17:47 GMT 服務器:Apache / 1.3.23 最後修改:2003年2月27日星期四03:48:19 GMT ETag:32417-c4-3e5d8a83 Accept-Ranges:字節 內容長度:196 鏈接:關閉 內容類型:文本/ HTML
來自IIS 5.0的響應
$ nc iis.example.com 80 GET / JUNK / 1.0 HTTP / 1.1 400錯誤請求 服務器:Microsoft-IIS / 5.0 日期:1999年1月1日星期五20:14:34 GMT 內容類型:文本/ HTML 內容長度:87
來自Netscape Enterprise 4.1的回覆
$ nc netscape.example.com 80 GET / JUNK / 1.0 <HTML> <HEAD> <TITLE>錯誤請求</ TITLE> </ HEAD> <BODY> <H1>錯誤請求</ H1> 您的瀏覽器發送到查詢此服務器沒法理解。 </ BODY> </ HTML>
響應來自SunONE 6.1
$ nc sunone.example.com 80 GET / JUNK / 1.0 <HTML> <HEAD> <TITLE>錯誤請求</ TITLE> </ HEAD> <BODY> <H1>錯誤請求</ H1> 您的瀏覽器發送了此服務器沒法理解的查詢。 </ BODY> </ HTML>
測試人員可使用自動化工具來得到相同的結果,而不是依靠手動橫幅抓取和分析Web服務器頭。爲了準確地指紋Web服務器,須要執行許多測試。幸運的是,有一些工具能夠自動完成這些測試。「 httprint 」就是這樣的工具之一。httprint使用簽名字典,容許它識別正在使用的Web服務器的類型和版本。
運行httprint的示例以下所示:
若是測試人員但願更隱蔽地測試而且不但願直接鏈接到目標網站,則可使用在線工具。Netcraft是一個在線工具的例子,它常常提供有關目標Web服務器的大量信息。使用此工具,咱們能夠檢索有關操做系統,使用的Web服務器,服務器正常運行時間,Netblock全部者,與Web服務器和OS相關的更改歷史記錄
的信息示例以下所示:
OWASP Unmaskme項目有望成爲另外一個在線工具,可對任何網站進行指紋識別,並對所提取的全部Web元數據進行全面解釋。這個項目背後的想法是,任何負責網站的人均可以測試網站向全世界展現的元數據,並從安全的角度對其進行評估。