19

昨晚,一位客户发疯了,因为谷歌缓存了员工私人信息的版本。除非您登录,否则该信息不可用。

他们对自己的域名进行了谷歌搜索,例如:

site:example.com

并注意到 Google 已经抓取并缓存了一些内部页面。

自己查看页面的缓存版本:

This is Google's cache of 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 会话,并且 Google 设法诱使网络服务器在 url 中将会话交给它,它是如何接管另一个用户的会话的?

是的,Google一个非恶意机器人劫持了一个会话

该网站多年来一直被机器人抓取。过去的 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

Google 一直在寻找 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 Authentication。这个世界一切都很好。

直到有一天; 从哪儿冒出来

直到有一天,GoogleBot 出现了,手里拿着一个 Session cookie !

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

该用户jatwood@example.com已超过一天未登录。(我希望 IIS 将相同的会话标识符提供给两个同时访问的访问者,由应用程序回收分隔)。而且我们的站点 ( web.config) 未配置为启用无会话 cookie。并且服务器 ( machine.config) 未配置为启用无会话 cookie。

所以:

  • Google 是如何获得无会话 cookie 的?
  • Google 是如何获得有效的无会话 cookie 的?
  • Google 如何获得属于另一个用户的有效无会话 cookie?

就在 10 月 1 日(4 天前),GoogleBot仍然出现,手里拿着 cookie,以该用户身份登录,抓取、缓存和发布他们的一些私人详细信息。

Google是如何绕过WebForms身份验证的非恶意网络爬虫?

IIS7,Windows Server 2008 R2,单服务器。

理论

服务器未配置为发出无 cookie 会话。但忽略这一事实,谷歌如何绕过身份验证?

  • GoogleBot 正在访问该网站,并尝试随机输入用户名和密码(不太可能,日志显示未尝试登录)
  • GoogleBot 决定在 url 字符串中插入一个随机的无 cookie 会话,并且它恰好与现有用户的会话匹配(不太可能)
  • 用户设法弄清楚如何让 IIS 网站返回无 cookie 的 url (不太可能),然后将该 url 粘贴到另一个网站(不太可能),谷歌在该网站上找到了无 cookie 的 url 并对其进行了爬网
  • 用户正在通过移动代理运行(他们不是)。代理服务器不支持 cookie,因此 IIS 创建了一个无 cookie 会话。该(例如Opera Mobile)缓存服务器被破坏(不太可能)并且所有缓存的链接都发布在黑客论坛上。GoogleBot 爬取了黑客论坛,并开始跟踪所有链接;包括我们的jatwood@example.com无 cookie 会话 URL。
  • 用户感染了病毒,它设法诱使任何 IIS 网络服务器返回一个无 cookie 的 URL。然后该病毒向总部报告。这些 url 发布到 GoogleBot 抓取的可公开访问的资源上。然后,GoogleBot 会在我们的服务器上显示无 cookie 的 URL。

这些都不是真正合理的。

Google一个非恶意网络爬虫如何绕过 WebForms 身份验证,并劫持用户的现有会话?

你在问什么?

我什至不知道没有配置为发出无cookie会话的ASP.net网站如何发出无cookie会话。是否可以将基于cookie 的会话 id 反向转换为基于cookie的会话 id?我可以引用 and 的相关部分<sessionState>,并表明不存在web.configmachine.config

<sessionState cookieless="true">

Web 服务器如何确定浏览器不支持 cookie?我尝试在 Chrome 中阻止 cookie,但从未获得过无 cookie 会话标识符。我可以模拟一个不支持 cookie 的浏览器,以验证我的服务器没有发出无 cookie 会话吗?

服务器是否通过用户代理字符串决定无 cookie 会话?如果是这样,我可以将 Internet Explorer 设置为带有欺骗性的 UA。

ASP.net 中的会话标识是否仅取决于 cookie?任何 IP 的任何人都可以使用 cookie-url 访问该会话吗?默认情况下,ASP.net 是否也考虑在内?

如果 ASP.net确实将 IP 地址与会话绑定在一起,那是否意味着会话不可能来自员工在家中的计算机上?因为当 GoogleBot 爬虫尝试从 Google IP 使用它时,它会失败吗?

是否有任何实例(除了我链接的那个)ASP.net 在未配置时发出无 cookie 会话?是否存在 Microsoft Connect 问题?

是否已知 Web-Forms 身份验证存在问题,并且不应该用于安全性?

奖金阅读

编辑:删除了绕过特权的谷歌机器人的名称,因为人们是智障人士的裤子;将Google的爬虫名称与其他内容混淆。我使用Google爬虫的名称作为提醒,它是一个非恶意的网络爬虫,它设法将它爬入另一个用户的 WebForm 会话。这是为了将其与试图闯入另一个用户会话的恶意爬虫进行对比。没有什么比书呆子更能激怒了。

4

2 回答 2

10

虽然这个问题主要涉及会话标识符,但标识符的长度让我觉得很不寻常。

至少有两种类型的 cookie/cookieless 操作可以修改查询字符串以包含 ID。

  • 无 Cookie 会话
  • 无 Cookie 表单身份验证令牌

它们彼此完全独立(据我所知)。

会话状态

无 cookie 会话允许服务器基于 URL 中的唯一 ID 与 cookie 中的唯一 ID 访问会话状态数据。这通常被认为是一种很好的做法,尽管 ASP.Net 重用会话 ID,这使得它更容易发生会话固定尝试(单独的主题但值得了解)。

ASP.net 中的会话标识是否仅取决于 cookie?任何 IP 的任何人都可以使用 cookie-url 访问该会话吗?默认情况下,ASP.net 是否也考虑在内?

只需要会话 ID。

一般会话安全阅读

表单认证

根据示例数据的长度,我猜测您的 URL 实际上包含表单身份验证值,而不是会话 ID。源代码表明 cookieless 模式不是您必须明确启用的。

/// <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 维护设备和功能列表。这个列表通常是一件非常糟糕的事情;例如,IE11 误报为与 Netscape 4 相当的低级浏览器。

原因

我认为吉恩的解释很有可能;Google 从某些用户操作中找到了该 URL 并对其进行了抓取。

完全可以想象,Google bot 被认为不支持 cookie。但这并不能解释 URL 的来源,即是什么用户操作导致 Google 看到其中已经有 ID 的 URL?一个简单的解释可能是用户的浏览器被认为不支持 cookie。根据浏览器的不同,其他一切对用户来说可能看起来都很好。

时间,即有效期似乎很长,尽管我不太熟悉身份验证票的有效期以及在什么情况下可以续签。ASP.Net 完全有可能继续重新发行/更新票证,就像它对持续活跃的用户所做的那样。

可能的解决方案

我在这里做了很多假设,但如果我是正确的:

  • 首先,在您的环境中重现该行为。
  • 通过使用显式禁用无 cookie 行为HttpCookieMode.UseCookies

    网络配置

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

虽然这应该可以解决该行为,但您可能会调查扩展表单身份验证 HTTP 模块并添加额外的验证(或至少是日志记录/诊断)。

于 2013-10-12T03:32:04.493 回答
7

你问的想法,所以我会给一些。没有任何明示或暗示的保证。

放弃您的站点配置为不在 URI 中编码会话信息的想法。它这样做的可能性非常大。要么您对配置有误,要么(更有可能)有一个错误导致它这样做。

这就留下了核心问题:Google 是如何获得会话 URI 的?

你没有说任何关于客户群的事情。这是一个猜测:

客户以生成会话 URI 编码的方式登录系统,然后使用 gmail 帐户将其通过电子邮件发送给其他人。Google 扫描了电子邮件并将 URI 提供给爬虫机器人。

还有其他类似的方式,客户生成 URI 的客户可能会无意中将其交给 Google。谷歌云端硬盘文件。谷歌加发布。等等。

谷歌可能并不邪恶,但它们仍然无处不在。他们的使用协议允许他们跨产品边界移动链接,在这种情况下是邮件(等)进行搜索。

您应该考虑的真正问题是为什么您的网站不受跨站点请求伪造的保护。Rails 的人很好地解释了这一点。Railsprotect_from_forgery机制可以防止报告的问题。

一个相关的问题是为什么编码的 cookie(显然)永远不会过期。让会话包含时间戳应该很容易做到这一点。

于 2013-10-10T04:25:27.463 回答