【问题标题】:Is facebook suddenly safe against JSON hijacking?facebook 突然对 JSON 劫持安全了吗?
【发布时间】:2019-08-07 22:22:48
【问题描述】:

众所周知Facebook uses javascript responses (JS,not json) 前缀是while(1) & for(;;); 是为了防止旧浏览器为being overloaded with their Array ctor & Object ctor.时脚本标签窃取json数据

但从最近的尝试来看,似乎不再是这种情况了(对于朋友列表,我确定它被使用过)

注意现在,内容类型是:

content-type: application/octet-stream

但是他们为什么要这样做呢?现在安全吗? (我知道它适用于旧版浏览器,但仍然......)。

我知道[..] 的 ctor 有问题。但是{..} 的 ctor 呢?

问题:

为什么 facebook 删除了无限循环?他们现在如何减轻 json 劫持?

我的意思是,如果<script> 标签会尝试获取“getFiriends”列表,现在会发生什么? (在非常旧的浏览器中)

注意

值得一提的是,还有其他响应{..} 无限循环!! :

也在这里(对象,无限循环)

【问题讨论】:

  • 这在 2011 年已在浏览器端修复...如果您使用的是以前的浏览器,那么我猜您遇到的问题比这更大
  • 安全方面,您的评论无法回答问题。因为很明显他们仍然在其他回复中使用它
  • @SeanKinsey 你能澄清一下 FB 是如何改变它的吗?我注意到有些服务现在确实返回无限循环,有些则没有。介意解释一下吗? :-)
  • 你刚刚 ping 我 :)(你无法 ping 线程外的人)

标签: javascript json facebook security cross-domain


【解决方案1】:

这种攻击(将 JSON 加载为 <script>)基于几个假设:

1) JSON 本身就是有效的 JS(这就是 for(;;) 的变化),这也意味着它可能不会以 { 开头,因为这是一个不包含键值对的块语句:

 { "a": 1 } // invalid JS, valid JSON *
 [{ "a": 1 }] // valid JS, valid JSON

2) 浏览器非常老旧 (< 1% of the total users),因为在较新的浏览器中使用字面量构造数组不会调用 Array 函数(ES5 支持是一个很好的估计)。

因此在这种情况下这种攻击是不可能的,因为您提到的 API 返回一个对象,因此 (1) 未完成。而且即使 API 会返回一个数组,理论上也只有极少数人会被劫持:

1) 浏览器必须很旧,然后浏览器本身风险可能更大,浏览器甚至必须支持JavaScript。

2) 客户端必须访问恶意站点,由于各级垃圾邮件过滤器/黑名单,这不太可能发生。

3) 用户在访问恶意网站时必须在 facebook 上登录。

值得一提的是,还有其他的无限循环响应

我想这通常已成为过去。所有 API 都被重构/迁移需要一段时间。如果您考虑 Facebook 的规模,我认为添加/删除这 5 个字符会导致大量开销。


*:如果您尝试加载{ a: 1 },您会发现它不会抛出 SyntaxError!但是,这既不是有效的 JSON,也不是创建对象(它是 blocn 语句中的标记 1)。

【讨论】:

  • 在我的第二张图片中,你可以清楚地看到他们确实仍然使用无限循环和{
  • @royi 我不知道他们的代码库是什么样子的。也许去除比保留更努力。
  • 我不同意你的第一个假设。请看here,因为它指出{a:1}也被使用
  • @royi 嗯,也许当时没有块声明?我将深入研究 ES 规范...
  • 没办法。不要搜索那里,因为那里有。请注意,不需要 js 有效。不要忘记 contenttype 应该是 json,然后 {a:1} 是一个有效的 json。然后他们黑了二传手。
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2012-05-19
  • 2013-04-23
  • 2020-10-21
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多