Ian*_*oyd 18 security webforms forms-authentication iis-7.5
昨晚,一位客户打来电话,因为谷歌已经缓存了私人员工信息的版本.除非您登录,否则无法获取相关信息.
他们对Google域名进行了搜索,例如:
site:example.com
Run Code Online (Sandbox Code Playgroud)
并注意到Googled已经抓取并缓存了一些内部页面.
自己查看页面的缓存版本:
这是谷歌的缓存https://example.com/(F(NSvQJ0SS3gYRJB4UUcDa1z7JWp7Qy7Kb76XGu8riAA1idys-nfR1mid8Qw7sZH0DYcL64GGiB6FK_TLBy3yr0KnARauyjjDL3Wdf1QcS-ivVwWrq-htW_qIeViQlz6CHtm0faD8qVOmAzdArbgngDfMMSg_N4u45UysZxTnL3d6mCX7pe2Ezj0F21g4w9VP57ZlXQ_6Rf-HhK8kMBxEdtlrEm2gBwBhOCcf_f71GdkI1))/ViewTransaction.aspx?transactionNumber=12345.它是2013年9月15日格林尼治标准时间00:07:22出现的页面快照
长网址让我很困惑.而不是:
https://example.com/ViewTransaction.aspx?transactionNumber=12345
Run Code Online (Sandbox Code Playgroud)
插入了一个长字符串:
https://example.com/[...snip...]/ViewTransaction.aspx?transactionNumber=12345
Run Code Online (Sandbox Code Playgroud)
我花了几分钟时间记住:这可能是ASP.net "无cookie会话"的症状.如果您的浏览器不支持Set-Cookie,则该网站会在URL中嵌入cookie.
除了我们的网站不使用它.
即使我们的网站确实自动检测到无cookie会话,并且Google设法将网络服务器哄骗在网址中交付会话,它是如何接管另一个用户的会话的呢?
该网站已被机器人抓取多年.而今年5月29日也没有什么不同.
Google通常会通过检查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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
另外检查安全网站上的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
Run Code Online (Sandbox Code Playgroud)
然后登录页面上的样式表:
Time Uri Port User Name Status
======== ======================= ==== ================ ======
1:33:04 GET /Styles/Site.css 443 200
Run Code Online (Sandbox Code Playgroud)
这就是来自GoogleBot,msnbot和BingBot的每次抓取工作的方式.机器人,登录,安全,登录.永远不会到达任何地方,因为它无法通过WebForms身份验证.一切都与世界很好.
直到有一天,GoogleBot出现了,手中有一个会话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
Run Code Online (Sandbox Code Playgroud)
该用户jatwood@example.com尚未登录超过一天.(我希望IIS为两个同时访问者提供相同的会话标识符,由应用程序回收分隔).我们的site(web.config)未配置为启用无会话cookie.并且server(machine.config)未配置为启用无会话cookie.
所以:
就在10月1日(4天前),GoogleBot 仍然出现,手头有cookie,以此用户身份登录,抓取,缓存和发布一些私人详细信息.
Google如何绕过WebForms身份验证成为非恶意网络抓取工具?
IIS7,Windows Server 2008 R2,单台服务器.
服务器未配置为发出无cookie会话.但忽略这一事实,Google如何绕过身份验证?
jatwood@example.comcookie会话网址.这些都不是真正可信的.
谷歌如何通过非恶意网络爬虫绕过WebForms身份验证,并劫持用户现有的会话?
我甚至不知道ASP.net网站如何配置为无cookie会话,可以发出无cookie会话.是否有可能回转换基于cookie的会话ID 为一个基于Cookie的会话ID?我可以引用相关<sessionState>部分web.config和machine.config,并显示没有存在
<sessionState cookieless="true">
Run Code Online (Sandbox Code Playgroud)
Web服务器如何确定浏览器不支持cookie?我尝试在Chrome中阻止Cookie,但我从未获得过无cookie的会话标识符.我可以模拟不支持cookie的浏览器,以验证我的服务器没有发出无cookie会话吗?
服务器是否通过User-Agent字符串决定无cookie会话?如果是这样,我可以使用欺骗性UA设置Internet Explorer.
ASP.net中的会话标识是否仅依赖于cookie?来自任何IP的任何人都可以使用cookie-url访问该会话吗?默认情况下,ASP.net是否也没有考虑到?
如果ASP.net 确实将IP地址与会话联系起来,那是否意味着会话不能来自其家庭计算机上的员工?因为当GoogleBot抓取工具尝试从Google IP使用它时,它会失败吗?
是否有任何实例(除了我链接的那个)ASP.net在没有配置时发出无cookie会话?是否存在Microsoft Connect问题?
Web表单身份验证是否存在问题,不应用于安全性?
编辑:删除了被绕过特权的机器人谷歌的名字,因为人们是头部迟钝的裤子; 将Google的抓取工具名称与其他东西混淆.我使用Google的抓取工具名称作为提示,它是一个非恶意网络抓取工具,可以将其抓取到另一个用户的WebForm会话中.这是为了与恶意爬虫进行对比,它试图闯入另一个用户的会话.没有什么能像迂腐一样带来恶化.
虽然问题主要是引用会话标识符,但标识符的长度让我觉得异常.
至少有两种类型的cookie/cookieless操作可以修改查询字符串以包含ID.
它们完全相互独立(据我所知).
无cookie会话允许服务器根据URL中的唯一ID与cookie中的唯一ID访问会话状态数据.这通常被认为是一种很好的做法,尽管ASP.Net重用会话ID,这使得它更容易进行会话固定尝试(单独的主题,但值得了解).
ASP.net中的会话标识是否仅依赖于cookie?来自任何IP的任何人都可以使用cookie-url访问该会话吗?默认情况下,ASP.net是否也没有考虑到?
会话ID就是所需要的.
根据示例数据的长度,我猜你的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
Run Code Online (Sandbox Code Playgroud)
以下是如何做出决定:
// 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;
}
}
Run Code Online (Sandbox Code Playgroud)
猜猜默认是什么?HttpCookieMode.UseDeviceProfile.ASP.Net维护一个设备和功能列表.这个清单通常是一件非常糟糕的事情; 为例如,IE11给出了作为一个下层浏览器中的假阳性看齐与Netscape 4.
我认为Gene的解释很可能; Google从某些用户操作中找到了该网址并对其进行了抓取.
完全可以想象,谷歌机器人被认为不支持cookie.但这并不能解释URL的来源,即用户操作导致Google看到其中已包含ID的URL?一个简单的解释可能是浏览器被认为不支持cookie的用户.根据浏览器的不同,其他所有内容对用户来说都很好.
时间,即有效期持续时间似乎很长,虽然我不熟悉身份验证票证的有效期,以及在什么情况下可以续订.完全可能ASP.Net继续重新发布/更新门票,就像它对持续活跃的用户所做的那样.
我在这里做了很多假设,但如果我是对的:
使用明确禁用cookieless行为HttpCookieMode.UseCookies.
web.config:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" name=".ASPXFORMSAUTH" timeout="26297438"
cookieless="UseCookies" />
</authentication>
Run Code Online (Sandbox Code Playgroud)虽然这应解决该问题,但您可以调查扩展表单身份验证HTTP模块并添加其他验证(或至少添加日志/诊断).
你问了想法,所以我会给你一些.没有明示或暗示的保证.
放弃将您的站点配置为不在URI中编码会话信息的想法.它的概率非常高.要么你的配置错了,要么(更有可能)有一个导致它这样做的错误.
这留下了一个核心问题:Google如何获得会话URI?
你没有说客户群.这是一个猜测:
客户以产生会话的URI编码的方式登录系统,然后使用gmail帐户通过电子邮件将其发送给其他人.Google扫描了该电子邮件,并将该URI提供给了爬虫机器人.
客户端生成URI的客户可能会无意中将其交给Google.Google云端硬盘文档.Google Plus发帖.等等.
谷歌可能并不邪恶,但它们无处不在.他们的使用协议允许他们跨产品边界移动链接,在这种情况下邮件(等)搜索.
您应该考虑的真正问题是,为什么您的网站不受跨站点请求伪造的保护.Rails的人很好地解释了这一点.Rails protect_from_forgery机制可以防止报告的问题.
一个相关的问题是为什么编码的cookie(显然)永不过期.应该很容易使会话包含时间戳来实现这一目标.
| 归档时间: |
|
| 查看次数: |
3028 次 |
| 最近记录: |