簡體   English   中英

如何安全地獲取正在運行的ASP.NET站點的域名

[英]How do I securely get the domain name of the running ASP.NET site

我在HTTP事務中遇到了欺騙Host值的一些問題。 為了關閉與這些類型的攻擊相關的安全漏洞,我需要安全地檢測正在運行的ASP.NET站點的域。 不幸的是, 我發現的所有引用都建議您使用Request.ServerVariables["HTTP_HOST"]Request.Url.Host 通過提交無效的HTTP數據包,我能夠設置無效的主機值,並觀察它們在兩個函數調用中引起的行為。 我看到的行為是不同的取決於我使用的.NET環境的類型。

在IIS 6中,無論我是直接在MVC Controller操作中訪問請求,還是在需要我通過HttpContext.Current.Request訪問值的位置,注入的值總是顯示出來。

在Visual Studio 2012 ASP.Net開發服務器中,我只看到我們通過NuGet包部署到項目的庫代碼中的注入值。 在NuGet包中,我必須使用HttpContext.Current因為代碼在Web應用程序范圍之外運行。 當我保持在Web應用程序命名空間的范圍內時,即使我必須調用HttpContext.Current ,它也會提供正確的非默認值。

對於所有這些測試,我一直在使用ASP.NET 4.0。 ASP.NET 4.5和IIS 8中是否更改了此行為? 有沒有辦法安全地獲取域名? 也可以對PHP進行相同的攻擊 ,但Apache有一種方法可以防止這些類型的攻擊 IIS?

我遇到問題的代碼示例:

string siteName1 = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
string siteName2 = HttpContext.Current.Request.Url.Host;

無效HTTP數據包的示例:

GET:  https://sampledomain.com/Items/Index
Host: fakedomain
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.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
Connection: keep-alive
Cache-Control: max-age=0

我已經使用Firefox擴展Live HTTP標頭進行了測試,這使我能夠快速記錄並重放我對Web服務器的請求。

在IIS中,您可以設置站點的綁定,以便它只獲取與特定主機頭值匹配的請求。

這樣,如果有人試圖欺騙主機標頭值,您的網站甚至不會看到請求。

不完全是您的問題的答案,但可能是您的問題的解決方案。

目前還不清楚“安全”是什么意思,但主機標題的整個要點是允許瀏覽器指定它打算與之交談的主機。

RFC 2616Request-URIHost頭有幾點要說:

為了允許在將來的HTTP版本中的所有請求中轉換為absoluteURI ,所有HTTP / 1.1服務器必須接受請求中的absoluteURI表單,即使HTTP / 1.1客戶端只會在對代理的請求中生成它們。

...

Request-URI的最常見形式是用於標識源服務器或網關上的資源。 在這種情況下,URI的絕對路徑必須作為Request-URI傳輸(參見第3.2.1節, abs_path ),並且URI(權限)的網絡位置必須在Host頭字段中傳輸。

...

  1. 如果Request-URIabsoluteURI ,則主機是Request-URI 必須忽略請求中的任何Host頭字段值。

...

Host字段值必須表示原始URL給出的源服務器或網關的命名權限。 這允許源服務器或網關區分內部不明確的URL,例如單個IP地址上的多個主機名的服務器的根“/”URL。

...

客戶端必須在所有HTTP / 1.1請求消息中包含Host頭字段。 如果請求的URI不包含所請求服務的Internet主機名,則必須為Host頭字段指定一個空值。

...

客戶端和服務器支持Host請求標頭的要求,如果HTTP / 1.1請求中缺少Host請求標頭(第14.23節),並且接受絕對URI(第5.1.2節),則報告錯誤是最重要的本規范定義的更改。

...

  • 客戶端和服務器都必須支持Host請求標頭。
  • 發送HTTP / 1.1請求的客戶端必須發送Host頭。
  • 如果HTTP / 1.1請求不包含Host請求標頭,服務器必須報告400(錯誤請求)錯誤。
  • 服務器必須接受絕對URI。

總之,符合HTTP的客戶端無法發送請求

GET https://example.com/ HTTP/1.1
Host: fakedomain.invalid

到原始服務器,一個HTTP / 1.1服務器被要求接受它,使用example.com作為主機,和“忽略”的Host首部。 Request.Url.Host絕對應該是example.com ; 如果不是,它是IIS中的一個錯誤。 我不太確定Request.ServerVariables["HTTP_HOST"] ,但是對“忽略”主機頭的合理解釋是將其重寫為example.com

(順便提一下,我剛剛測試過的另外兩個服務器也沒有遵循規范:Apache 2.4.3假設對absoluteURI的請求必須是一個代理並且在此基礎上拒絕它,而lighttpd 1.4.28允許GET http://example.com/ HTTP/1.1沒有Host標頭的情況下GET http://example.com/ HTTP/1.1 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM