Stackoverflow 使用本地存储进行授权似乎不安全。这是正确的,否则我们如何加强它?

2024-04-02

我一直在研究类似于 stackexchange 的身份验证和授权模块。现在我确信他们使用某种模型的 oAuth 或令牌生成服务器来授权使用他们的各个站点。我尝试了一个小实验。

登录 Stackoverflow 后,我会从开发者控制台删除所有 cookie。

我保持本地存储对象完好无损,其中包含一个密钥se:fkey xxxxxxxxxxxxxxxxxxxxxxxxx对于 stackoverflow 域。

stackauth 域还有另一个密钥GlobalLogin: xxxxxxxxxxxxxxxxxxxxxxx

如果我使用 se.fkey 进行会话劫持,则什么也没有发生。但是 GlobalLogin,我能够复制并劫持我的会话。因此,我的疑问是,S/O 如何处理每个站点的授权后身份验证。另外,有没有办法让全局登录在使用一次后失效?

{EDIT1}

所以,只需globalLogin独自一人就足够了。如果您可以获得该密钥,只需打开一个私人浏览实例即可。当您处于登录页面时,在 Stackauth 的 Localstorage 中,创建key-value映射并刷新页面。您将登录。

{EDIT2}

The globalLogin密钥在多个会话中似乎是一致的。已经一天了,我的没有刷新globalLogin钥匙。可以安全地假设,如果您的密钥被劫持,攻击者将可以无限期地访问您的个人资料。

{EDIT3}

对于所有正在投票并将投票支持此问题的人,因为它不是与编程相关的问题。让我这样说,我们如何使用 localstorage 安全地将 SSO 存储在 Web 浏览器上,并且由于它们很容易受到损害,我们需要采取什么措施来防止这种情况发生?我的一位同事很体贴地给了我他的 GlobalLogin 密钥,我能够从另一台计算机劫持他的会话,尽管它位于同一网络上。

PS:我这样做纯粹是为了理论上的理解。


好吧,让我们看看可能的攻击向量,而不是查看漏洞。我将在此处添加一个表作为 TL/DR

Attacker      | Vulnerable?
Eavesdropper  | Yes
MITM          | Yes
Local Attack  | Yes
Server Attack | Yes

所以是的,这是一个问题。

远程攻击者,可以观察流量,但无法修改流量

将此视为咖啡店中的被动攻击者。他们可以看到所有 TCP 级别的流量。

来回发送给 SO 的请求默认情况下不加密。您可以通过 HTTPS 浏览,但默认情况下仅使用 HTTP。

因此,攻击者可以看到任何经过的请求,并检查/窃取数据。

那么让我们看看是否GlobalLogin令牌曾经在请求中发送过...

事实上,确实如此。在登录页面上,请求通过 iframe 发送到以下 URL:

https://stackauth.com/auth/global/read?request=//snip//

该 URL 返回一个脚本:

var data = {
    "ReadSession":"https://stackauth.com/auth/global/read-session",      
    "Request":"//snip//",
    "Nonce":"//snip//",
    "Referrer":"//snip//",
    "StorageName":"GlobalLogin"
};

var toMsg = window.parent;
var obj = localStorage.getItem(data.StorageName);

if(obj != null) {
    var req = new XMLHttpRequest();
    req.open(
        'POST', 
            data.ReadSession+
            'request='+encodeURIComponent(data.Request)+
            '&nonce='+encodeURIComponent(data.Nonce)+
            '&seriesAndToken='+encodeURIComponent(obj), 
        false
    );
    req.send(null);

    if(req.status == 200){
        toMsg.postMessage(req.responseText, data.Referrer);
    }else{
        toMsg.postMessage('No Session', data.Referrer);
    }
}else{
    toMsg.postMessage('No Local Storage', data.Referrer);
}

现在,请注意GlobalLogin通过 HTTPS 发送到服务器。因此,可以读取流量的远程攻击者将无法获取GlobalLogin token.

So the GlobalLogin部分对于窃听者来说是安全的。

但是,请注意,它仍然很容易受到嗅探会话 cookie 的影响,因为它是通过 HTTP 发送的。

远程攻击者,可以修改流量(MITM)

好吧,这就是事情变得有趣的地方。

如果你可以修改流量,你就可以做一些非常有趣的事情。

初始页面创建一个 iframe,通过 HTTPS 引入上述 stackauth.com URL。好吧,如果您可以修改初始页面(也可以通过 XSS),您可以将请求降级为 HTTP。

StackAuth.com 对此也很满意。当它向 stackauth.com 发出请求时,您还需要拦截该请求,并更改其ReadSessionURL 也应为 HTTP。

但是,您所需要做的就是观看对ReadSessionURL,然后你就偷了GlobalLogin token.

但无论如何,流量都是 HTTP,所以这并不重要,因为您不需要经历这样的麻烦来窃取 cookie。那为什么还要麻烦呢?

本地攻击者

如果该人有权访问计算机来读取本地存储文件,他们可以执行以下操作FAR比窃取您的登录令牌更糟糕。

有一种攻击称为“中间浏览器”,其中浏览器的妥协允许攻击者为所欲为。

除了尝试保持浏览器安全之外,没有真正有效的保护措施(您对此无能为力)。

因此,如果攻击者能够获得计算机的本地访问权限,那么游戏就结束了。

基于服务器的攻击者

如果攻击者能够访问 StackOverflow 的服务器,那么游戏就结束了……

结论

只要允许 HTTP(因为 MITM 总是可以将连接降级到 HTTP),就没有什么需要保护的,因为会话秘密总是可以通过窃听窃取。

保护此信息的唯一方法是使用HSTS http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security并在所有地方强制使用 HTTPS。

值得注意的是,您可以保护GlobalLogin通过在 stackauth.com 上强制使用 HSTS,使主站点可通过 HTTP 进行访问。这不会阻止攻击(会话劫持)的影响。但它会保护一个载体。

但是,在任何地方仅通过 HSTS 使用 HTTPS 将是防止此类问题的最佳且唯一的方法。其他任何东西都只是枪伤上的创可贴。

Note:在发布此内容之前,我确实与 SO 讨论过此事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stackoverflow 使用本地存储进行授权似乎不安全。这是正确的,否则我们如何加强它? 的相关文章

  • 除了text/css之外还有其他样式类型吗? [复制]

    这个问题在这里已经有答案了 可能的重复 style type text css 还有什么 https stackoverflow com questions 6077905 style type text css what else is
  • html画布绘图显示出来

    我确信这个问题在我还找不到答案之前就已经被问过 我想通过在顶部绘制另一个白色矩形来擦除黑色矩形的一部分 但是许多原始黑色矩形显示出来 就像正在平均一样 canvas document getElementById canvas contex
  • 使用加权概率和值查找数组中的项目

    上周我正在做的一个简单程序遇到了一些问题 这里有人帮助了我 现在我遇到了另一个问题 我目前有这个代码 var findItem function desiredItem var items item rusty nail probabili
  • 调整大小时标题不响应

    我有一个表格 当我调整大小时它不会显示我的标题Steps在网络视图上 它确实显示得很完美 但是当我调整大小时 我看不到我的步骤标题 有没有办法使用 css 或 jstl jsf 标签在下面的代码中修复此问题 谢谢您的帮助 像这样的事情 ht
  • Javascript 中繁重计算的最佳实践?

    我正在处理客户端脚本 需要进行繁重的计算 例如将大量对象推送到数组中 这会导致 JavaScript 停止响应并且浏览器挂起并发出警报 是否有任何最佳实践或设计模式来处理这些计算 我搜索并找到许多不同的方法来处理这些情况 但解决方案很难实现
  • window.print() 仅打印屏幕的“可视”部分

    我有一个可滚动屏幕 上面有一个打印按钮 并且在其 onclick 事件上调用 window print 函数 我的问题是它只打印屏幕的 可见 部分 而不是整个屏幕 如果页面可滚动 则当内容无法容纳在 1 页中时 打印应扩展到 2 或更多 页
  • 为什么在 Javascript 中添加两位小数会产生错误的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 的数学有问题吗 https stackoverflow com questions 588004 is javascripts math broken 为什么 JS 搞砸了这个简
  • 返回 Web 浏览器中 HtmlElement 的所有属性

    我需要从我的网络浏览器获取所有属性 当前 我正在使用 GetAttribute 但这样 我需要知道属性的名称 想象一下我不知道我的网络浏览器中有什么 我的 C 代码 StringWriter strWriter new StringWrit
  • 元视口标签似乎被完全忽略或没有效果

    我把这个标签放在了头部一个网页 http www belovedobjects de 由于某种原因 它在我的 iPhone 上似乎被忽略了 甚至添加了user scalable no没有影响 我尝试了许多宽度 初始比例等值 似乎没有任何效果
  • 打开 Chrome 扩展程序时出现 Service Worker TypeError

    当我打开 WAVE Web 可访问性评估工具 扩展时 我的服务工作人员在 Chrome 中抛出此错误 未捕获 承诺中 类型错误 请求方案 chrome extension 是 不支持的 在 sw js 52 匿名 sw js 52 Prom
  • 检测“文件下载”弹出窗口何时关闭

    我有一个网页 用 JSF 制作 其中一些链接允许用户获取 PDF 文件 当用户点击这样的链接时 会显示一个等待弹出窗口 它是一个模式面板 因为 PDF 的生成可能很长 并且一旦创建文件 IE 就会显示 文件下载 弹出窗口 建议 打开 保存
  • Chrome 扩展 - 使用 javascript 定期运行并永久记录数据

    目前 我有一个脚本 当单击右上角托盘中的图像 仅适用于一个特定允许的网站 时 它会扫描 HTML 页面 然后输出一些值 此扫描和输出是单个 JS 文件中的函数 称为 checkData js 即使用户没有主动使用选项卡但它已打开 是否有可能
  • 将 WebApp 授权给 ADFS 以访问 Dynamics CRM Web API

    我有一个 Web 应用程序需要与 Dynamics CRM 365 Web API 通信 Dynamics CRM 配置为 ADFS 上的依赖方 服务器是 Windows Server 2016 一切都在本地 而不是在 Azure 上 我为
  • 窗口位置替换 - 超时帮助? JavaScript问题

    我曾尝试找到一种方法 在我的代码中添加超时 然后再重定向您 我用谷歌搜索并找到了一些帮助 但他们都没有达到我的预期 这会提示用户出生年份并计算年龄 大致 如果用户未满18岁 则带他们去迪士尼乐园 否则允许进入 函数年龄按钮 var AskD
  • JQuery 从 Div 中抓取文本减去子元素[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以从这个 div 中获取文本而不获取任何子元素 div strong Title Text Unwanted strong This is the text I need div 我知道我可
  • Ember JS 过渡到嵌套路由,其中​​所有路由都是视图中的动态段

    我们正在使用 EmberJS 编写一个应用程序 然而 我们对这个框架仍然陌生 我们很难解决一些看似简单的问题 模型非常简单 有 3 个模型 Queue Task 和 Image 我们对所有路由使用动态 URI 段 并且这些模型的路由嵌套在以
  • 为什么 JavaScript 原型属性在新对象上未定义?

    我对 JavaScript 原型概念还很陌生 考虑以下代码 var x function func x prototype log function console log 1 var b new x 据我了解 b log 应该返回 1 因
  • javascript 中的独立括号[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 为什么使用匿名函数包装器 https stackoverflow com questions 1643321 javascript why the anonymous funct
  • 使用 javascript 在字符串中查找电子邮件地址

    我想做的是从字符串中提取电子邮件地址SomeName First email protected cdn cgi l email protection 这是我已经尝试过的代码 var stringToSearchIn SomeName Fi
  • 将 JS 文件导入 Typescript

    我正在考虑转向 Typescript 目前正在考虑慢慢地 如果可能的话 逐个文件地执行此操作 现在我目前拥有的系统是用 Webpack 构建的 我想继续这个来构建我的整个包 我有一个用于定义的 d ts 文件 但我需要继续导入当前引发错误的

随机推荐