什么是“顶级JSON数组”,为什么会有安全风险?


73

在下面的视频中,Microsoft PDC演示者在时间标记21:40表示,包装所有JSON以使其不是顶级数组很重要:

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

解开顶层阵列的风险是什么?

我应该如何检查并确定自己是否脆弱?我从第三方购买了许多组件,并且有外部厂商来开发我的代码。

Answers:


46

这是因为几年前,耶利米·格罗斯曼(Jeremiah Grossman)发现了一个影响gmail的非常有趣的漏洞。有些人通过使用解决了这个vulnerabilty无法解析的克鲁夫特(此页上先生bobince的技术说明是太棒了。)

微软之所以这样说,是因为他们尚未修补浏览器。(编辑: Edge和IE 10/11的最新版本已解决了该问题。)Mozilla认为这是json规范中的漏洞,因此他们在Firefox 3中对其进行了修补。作为记录,我完全同意Mozilla,它的不幸之处在于,但每个Web应用程序开发人员都必须自我保护,以免受这种非常晦涩的漏洞的侵害。


8
在JSON数组中发送敏感信息是否仍然在2017年存在安全风险?
jrahhali'4

@jrahhali这个问题是值得发表的,也许security.stackexchange.com将是一个不错的选择。

14

我认为这是因为Array()构造函数可以重新定义。但是,这个问题并不是数组真正的唯一问题。

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

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

浏览器(或某些浏览器)使用该构造函数来[n, n, n]表示数组。因此,CSRF攻击可以利用您与银行的公开会话,用<script>标签击中已知的JSON URL来获取它,然后欺骗您的所有权。


3
我不明白这一点-将JSON中的数组移到一个属性中不会阻止这种类型的攻击。返回{"d":[1,2,3]}将只是为返回的易感[1,2,3]
彼得·贝利

我同意-这就是我说的问题不仅仅是数组时的意思。
尖尖的

38
不对。{JavaScript行的开始处的A被解释为代码块,而不是对象文字。因此,您的{"d":[1,2,3]}脚本不是有效的脚本,因此不会被浏览器执行。只需尝试一下:)
fletom 2012年

3
跟进:haacked.com/archive/2009/06/25/json-hijacking.aspx对我来说,比起Grossman
Sebas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.