什么是“顶级 JSON 数组”,为什么它们存在安全风险?

IT技术 javascript json security xss
2021-01-20 08:49:09

在下面的视频中,在时间标记 21:40,Microsoft PDC 演示者说重要的是所有 JSON 都被包装,因此它不是顶级数组:

https://channel9.msdn.com/Events/PDC/PDC09/FT12

未包装的顶级阵列的风险是什么?

我应该如何检查我是否易受攻击?我从 3rd 方购买了许多组件,并有外部供应商开发我的代码。

2个回答

这是因为几年前 Jeremiah Grossman 发现了一个影响 gmail的非常有趣的漏洞有些人通过使用无法解析的 cruft解决了这个漏洞(bobince 先生在此页面上的技术描述非常棒。)

微软之所以谈论这个是因为他们还没有修补他们的浏览器(还)。编辑: Edge 和 IE 10/11 的最新版本已经解决了这个问题。)Mozilla 认为这是 json 规范中的一个漏洞,因此他们在Firefox 3 中修补了它就记录而言,我完全同意 Mozilla,这很不幸,但每个 Web 应用程序开发人员都必须保护自己免受这个非常模糊的漏洞的影响。

@jrahhali 这个问题值得单独发表,也许 security.stackexchange.com 是个不错的地方。
2021-03-24 08:49:09
2017 年在 JSON 数组中发送敏感信息是否仍然存在安全风险?
2021-04-04 08:49:09

我认为这是因为可以重新定义 Array() 构造函数。然而,这个问题并不是数组独有的。

我认为攻击(或一种可能的方式)是这样的:

function Array(n) {
  var self = this;
  setTimeout(function() {
    sendToEvilHackers(self);
  }, 10);
  return this;
}

浏览器(或某些浏览器)使用该构造函数进行[n, n, n]数组表示法。因此,CSRF 攻击可以利用您与银行的公开会话,点击带有<script>标签的已知 JSON URL以获取它,然后便证明您拥有它。

我不明白 - 将 JSON 中的数组向下移动到一个属性中并不能阻止这种类型的攻击。Returning 和 Return{"d":[1,2,3]}一样容易受到影响[1,2,3]
2021-03-27 08:49:09
跟进:haacked.com/archive/2009/06/25/json-hijacking.aspx对我来说,这比 Grossman 2006 年的文章更好地解释了威胁
2021-03-29 08:49:09
我同意 - 这就是我所说的问题不仅仅是关于数组的意思。
2021-04-06 08:49:09
不对。{JavaScript 中一行开头的A被解释为代码块,而不是对象字面量。因此,您的{"d":[1,2,3]}脚本不是有效的脚本,并且不会被浏览器执行。去尝试一下 :)
2021-04-08 08:49:09