好吧,让我们看看可能的攻击向量,而不是查看漏洞。我将在此处添加一个表作为 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 发出请求时,您还需要拦截该请求,并更改其ReadSession
URL 也应为 HTTP。
但是,您所需要做的就是观看对ReadSession
URL,然后你就偷了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 讨论过此事。