2013-10-04 32 views
17

昨晚,一位客戶叫得瘋狂,因爲Google已經緩存了私人員工信息的版本。除非您登錄,否則信息不可用。無害爬蟲如何繞過WebForms認證並劫持用戶的會話?

他們已經做了谷歌搜索自己的域名,例如:

​​

,發現谷歌搜索已爬,和緩存,一些內部網頁。在頁面的緩存版本

尋找自己:

這是https://example.com/(F(NSvQJ0SS3gYRJB4UUcDa1z7JWp7Qy7Kb76XGu8riAA1idys-nfR1mid8Qw7sZH0DYcL64GGiB6FK_TLBy3yr0KnARauyjjDL3Wdf1QcS-ivVwWrq-htW_qIeViQlz6CHtm0faD8qVOmAzdArbgngDfMMSg_N4u45UysZxTnL3d6mCX7pe2Ezj0F21g4w9VP57ZlXQ_6Rf-HhK8kMBxEdtlrEm2gBwBhOCcf_f71GdkI1))/ViewTransaction.aspx?transactionNumber=12345谷歌的緩存。它是頁面的快照,因爲它出現在2013年9月15日00:07:22 GMT

我很困惑的長網址。而不是:

https://example.com/ViewTransaction.aspx?transactionNumber=12345 

還有很長的字符串插入:

https://example.com/[...snip...]/ViewTransaction.aspx?transactionNumber=12345 

我花了幾分鐘,要記住:這可能是ASP.net的「無Cookie會話的症狀。如果您的瀏覽器不支持Set-Cookie,則該網站將在URL中嵌入一個cookie。

除我們的網站沒有使用它。

即使我們的網站確實有cookie的會話自動檢測,和谷歌成功地哄着網絡服務器到在url交給它的會話,它是怎麼接管其他用戶的會話?

是,谷歌 一個 非惡意殭屍劫持會話數年

該網站已經通過抓取機器人。而過去的5月29日也不例外。

谷歌通常通過檢查robots.txt文件(我們沒有一個)來開始爬取。但是,沒有人被允許在網站上準備好任何事情(包括robots.txt)沒有先進行身份驗證,因此它失敗:

Time  Uri      Port User Name   Status 
======== ======================= ==== ================ ====== 
1:33:04 GET /robots.txt   80      302 ;not authenticated, see /Account/Login.aspx 
1:33:04 GET /Account/Login.aspx 80      302 ;use https plesae 
1:33:04 GET /Account/Login.aspx 443      200 ;go ahead, try to login 

那段時間谷歌正在尋找一個robots.txt文件。它從來沒有一個。然後,它返回到嘗試抓取根:

Time  Uri      Port User Name   Status 
======== ======================= ==== ================ ====== 
1:33:04 GET/     80      302 ;not authenticated, see /Account/Login.aspx 
1:33:04 GET /Account/Login.aspx 80      302 ;use https plesae 
1:33:04 GET /Account/Login.aspx 443      200 ;go ahead, try to login 

而且在安全網站的robots.txt的另一種檢驗:

Time  Uri      Port User Name   Status 
======== ======================= ==== ================ ====== 
1:33:04 GET /robots.txt   443      302 ;not authenticated, see /Account/Login.aspx 
1:33:04 GET /Account/Login.aspx 443      200 ;go ahead, try to login 

然後在登錄頁面的樣式表:

Time  Uri      Port User Name   Status 
======== ======================= ==== ================ ====== 
1:33:04 GET /Styles/Site.css  443      200  

這就是GoogleBot,msnbot和BingBot每次抓取的工作原理。機器人,登錄,安全,登錄。從來沒有得到任何地方,因爲它不能通過WebForms身份驗證。世界一切都很好。

直到有一天;無處不在

直到有一天,GoogleBot出現了,會話cookie 在手

Time  Uri      Port User Name   Status 
======== ========================= ==== =================== ====== 
1:49:21 GET/     443 [email protected] 200 ;they showed up logged in! 
1:57:35 GET /ControlPanel.aspx  443 [email protected] 200 ;now they're crawling that user's stuff! 
1:57:35 GET /Defautl.aspx   443 [email protected] 200 ;back to the homepage 
2:07:21 GET /ViewTransaction.aspx 443 [email protected] 200 ;and here comes the private information 

用戶,[email protected]尚未登錄超過一天。 (我希望IIS能給兩位同時訪問者提供相同的會話標識符,並由應用程序回收分隔)。我們的網站(web.config)未配置爲啓用無會話cookie。而服務器(machine.config)未配置爲啓用無會話cookie。

所以:

  • 怎麼谷歌得到阿霍德一個無會話cookie的呢?
  • Google是如何獲得有效會話的cookie的?
  • Google是如何獲得有效屬於其他用戶的無會話Cookie的預測?

就在最近的10月1日(4天前),因爲Googlebot是仍然顯示出來,手裏拿着餅乾,以該用戶登錄,爬行,高速緩存和出版,他們的一些私人資料。

Google 如何繞過一個非惡意網絡爬蟲WebForms身份驗證?

IIS7,Windows Server 2008 R2,單臺服務器。

理論

服務器未配置爲發出無Cookie會話。但是忽略這一事實,Google如何繞過認證?

  • Googlebot已visting的網址,並試圖隨機用戶名和密碼(不太可能,日誌顯示沒有嘗試登陸)
  • Googlebot會決定插入隨機Cookie會話爲URL字符串,它發生到現有用戶(不太可能)
  • 用戶設法弄清楚如何使IIS的Web站點返回一個cookie的URL (不太可能)的會話匹配,然後粘貼該網址到另一個網站(不太可能),Google找到了無Cookie的網址並對其進行抓取
  • 用戶正在通過移動代理(他們不是)運行。代理服務器不支持cookie,因此IIS會創建一個無Cookie會話。 (例如Opera Mobile)緩存服務器被破壞(不太可能)以及所有緩存的鏈接都發布在黑客論壇上。 GoogleBot抓取黑客論壇,並開始關注所有鏈接;包括我們的[email protected]無Cookie會話網址。
  • 用戶有一個病毒,它設法哄騙任何IIS網絡服務器來回傳一個無cookie的url。那病毒然後報告給總部。這些網址被張貼到可公開訪問的資源上,即GoogleBot抓取。然後GoogleBot會在我們的服務器上顯示無Cookie的網址。

這些都不是真正可行的。

Google 如何繞過WebForms身份驗證並劫持用戶的現有會話?

你在問什麼?

我什至不知道如何一個ASP.net的網站,沒有配置爲發出無cookie的會話,可以發出無cookie會話。是否有可能將基於cookie的會話編號反向轉換爲 a 基於Cookie的會話編號?我可以引述web.configmachine.config相關<sessionState>部分,並顯示沒有的

<sessionState cookieless="true"> 

如何在Web服務器決定的瀏覽器不支持cookie的存在?我嘗試在Chrome中阻止Cookie,並且我從未獲得過無cookie的會話標識符。我是否可以模擬不支持Cookie的瀏覽器,以驗證我的服務器是否不提供無Cookie會話?

服務器是否通過用戶代理字符串來決定無Cookie會話?如果是這樣,我可以用欺騙性UA設置Internet Explorer。

ASP.net中的會話標識是否完全依賴於cookie?任何人都可以使用cookie-url從任何IP訪問該會話?默認情況下,ASP.net不是也考慮到了嗎?

如果ASP.net 與會話領帶的IP地址,那不是意味着會議不可能起源於在他們的家用電腦的員工?因爲當GoogleBot抓取工具試圖從Google IP使用它時,它會失敗?

有沒有任何實例(除了我鏈接的一個)的ASP.net提供無cookie會話,當它沒有配置?是否存在Microsoft Connect問題?

Web-Forms身份驗證是否已知存在問題,而不應該用於安全性?

獎金閱讀

編輯 谷歌 即繞過的特權,因爲人們對智障頭褲機器人移除名稱;令人困惑的 Google 其他的抓取工具的名稱。我使用 Google 這個抓取工具的名稱來提醒我們,這是一個非惡意的抓取工具,它能夠抓取它進入另一個用戶的WebForm會話。這是爲了將其與惡意爬蟲進行對比,該惡意爬蟲試圖闖入另一個用戶的會話。沒有什麼比文學家更能引起人們的憤慨。

+0

您遇到問題了。無論它是否是Google並不重要。您的網站顯然不安全。 與其向Google發佈投訴和(未經證實的)指責,爲什麼不告訴我們關於您的網站的一些信息,或許我們可以幫助您瞭解您做錯了什麼? –

+0

順便說一句,什麼是「[email protected]」在您的列表中?請不要告訴我這是會話ID! –

+0

看來,當您使用Chrome訪問網頁(或者其他瀏覽器添加了谷歌內容)時,您訪問的網址將傳遞給Google進行索引。我們與我們的公司服務器駐留在機密地址和端口上(當然,沒有到該服務器的外部鏈接)也是如此。儘管如此,你的問題在SO上是不合理的。 –

回答

9

雖然這個問題主要引用會話標識符,但是標識符的長度讓我覺得很不尋常。

至少有兩種類型的cookie /無cookie操作可以修改查詢字符串以包含ID。

  • Cookie會話
  • Cookie的Forms身份驗證令牌

他們是完全相互獨立的(只要我可以告訴)。

會話狀態

一個Cookie會話允許基於URL的唯一ID與在Cookie中的唯一ID服務器來訪問會話狀態數據。這通常被認爲是一種很好的做法,儘管ASP.Net重用會話ID,這使得它更容易發生會話固定嘗試(單獨的主題但值得了解)。

ASP.net中的會話標識是否完全依賴於cookie? 任何來自任何IP的人都可以使用cookie-url訪問該會話?默認情況下,ASP.net不是 嗎?

會話ID是所有必需的。

General Session Security Reading

窗體身份驗證

基於示例數據的長度,我猜你的URL實際上包含窗體身份驗證值,而不是一個會話ID。源代碼表明,無Cookie模式不是您必須明確啓用的。

/// <summary>ASP.NET determines whether to use cookies based on 
/// <see cref="T:System.Web.HttpBrowserCapabilities" /> setting. 
/// If the setting indicates that the browser or device supports cookies, 
/// cookies are used; otherwise, an identifier is used in the query string.</summary> 
UseDeviceProfile 

這裏的決定是怎麼做:

// System.Web.Security.CookielessHelperClass 
internal static bool UseCookieless(HttpContext context, bool doRedirect, HttpCookieMode cookieMode) 
{ 
    switch(cookieMode) 
    { 
     case HttpCookieMode.UseUri: 
      return true; 
     case HttpCookieMode.UseCookies: 
      return false; 
     case HttpCookieMode.AutoDetect: 
      { 
       // omitted for length 
       return false; 
      } 
     case HttpCookieMode.UseDeviceProfile: 
      if(context == null) 
      { 
       context = HttpContext.Current; 
      } 
      return context != null && (!context.Request.Browser.Cookies || !context.Request.Browser.SupportsRedirectWithCookie); 
     default: 
      return false; 
    } 
} 

你猜怎麼着默認的是什麼? HttpCookieMode.UseDeviceProfile。 ASP.Net維護設備和功能的列表。這個清單通常是一件非常糟糕的事情;對於example, IE11 gives a false positive for being a downlevel browser看齊與Netscape 4

原因

我認爲基因的解釋很可能; Google從某些用戶操作中找到了該網址並對其進行了檢索。

完全可以想象Google bot被認爲不支持cookies。但是,這並不能解釋網址的來源,即哪些用戶操作導致Google看到一個網址,其中已有一個ID?一個簡單的解釋可能是一個瀏覽器的用戶被認爲不支持cookies。根據瀏覽器的不同,其他一切都可能會讓用戶看起來很好。

時間,即有效期看起來很長,儘管我不太瞭解身份驗證票證的有效期以及在什麼情況下可以續訂。完全有可能ASP.Net繼續爲持續活躍的用戶重新發行/更新票據。

可能的解決方案

我做了很多假設,在這裏,但如果我是正確的:

  • 首先,複製您的環境中的行爲。
  • 使用HttpCookieMode.UseCookies明確禁用無Cookie行爲。

    的web.config

    <authentication mode="Forms"> 
        <forms loginUrl="~/Account/Login.aspx" name=".ASPXFORMSAUTH" timeout="26297438" 
          cookieless="UseCookies" /> 
    </authentication> 
    

雖然這應該解決的問題,您可能會延長調查窗體身份驗證HTTP模塊,並添加額外的驗證(或至少記錄/診斷)。

+0

使用Internet Explorer的「F12」工具,我將我的**用戶代理**字符串設置爲不支持cookie的已知瀏覽器。 (.NET數據庫包含一個有用的'Generic Downlevel'用戶代理字符串,它激發了這種失敗模式)。我登錄了客戶的面向互聯網的現場網站,並且**被給予*「cookie-in-url」*網址。我把這個長URL發給了一個同事。從他的(「通用低級」配置的IE),他立即登錄。鑑於我們有'無Cookie =虛假',這是令人發狂。你對單獨的* session * vs * asp.net表單狀態*的洞察可能是答案。 –

+5

而且做到了。 [''](http://msdn.microsoft.com/en-us/library/h6bb9cz9(v = vs.85).aspx),並且有[''](http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthentication.cookiemode.aspx)。一個是默認關閉的,另一個默認是**不關閉。而不是違約的那一個是重要的。 –

7

你問了想法,所以我會給一些。不作任何明示或暗示的保證。

放棄您的網站配置爲不對URI中的會話信息進行編碼的想法。它有很高的可能性。要麼你錯了配置,要麼(更可能)存在導致它這樣做的錯誤。

這留下了中心問題:Google如何獲得會話URI?

您沒有對客戶羣提出任何意見。下面是一個猜測:

一位顧客以一種產生會話的URI編碼的方式登錄系統,然後通過郵件將此郵件通過gmail賬戶發送給其他人。 Google掃描了電子郵件並將URI提供給爬蟲機器人。

還有其他類似的方式,客戶產生URI的客戶可能會無意中將其交給Google。 Google雲端硬盤文檔。 Google Plus發佈。等等

谷歌可能並不邪惡,但它們無處不在。他們的使用協議允許他們跨越產品邊界移動鏈接,在這種情況下,郵件(等)進行搜索。

你應該考慮的真正問題是爲什麼你的網站不受跨站請求僞造保護。 Rails人員explain this pretty nicely。 Rails protect_from_forgery機制可以防止報告的問題。

一個相關的問題是爲什麼編碼的cookie(顯然)永不過期。讓會話包含時間戳來實現這一點應該很容易。

+0

哇。這涉及到跨越產品邊界的URL。我打算建議安裝[Google網站管理員工具](http://www.google.com/webmasters/tools/)來追蹤抓取工具如何被引用到網站,但我想這可能會導致更多的Google泄漏。 –