什么是"顶级JSON阵列"以及为什么它们存在安全风险?

goo*_*ate 66 javascript security xss json

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

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

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

我该如何检查,看看我是否容易受到伤害?我从第三方购买了许多组件,并有外部供应商开发我的代码.

roo*_*ook 40

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

微软之所以谈论这个问题,是因为他们尚未修补他们的浏览器.(编辑: Edge和IE 10/11的最新版本已经解决了这个问题.)Mozilla认为这是json规范中的漏洞,因此他们在Firefox 3中修补了它.为了记录我完全同意Mozilla,不幸的是每个网络应用程序开发人员都必须为这个非常模糊的漏洞捍卫自己.

  • 2017年,在JSON阵列中发送敏感信息仍然存在安全风险吗? (7认同)

Poi*_*nty 12

我认为这是因为可以重新定义Array()构造函数.但是,这个问题对于数组来说并不是唯一的.

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

function Array(n) {
  var self = this;
  setTimeout(function() {
    sendToEvilHackers(self);
  }, 10);
  return this;
}
Run Code Online (Sandbox Code Playgroud)

浏览器(或某些浏览器)将该构造函数用于[n, n, n]数组表示法.因此,CSRF攻击可以利用您与银行的开放会话,点击带有<script>标记的已知JSON URL 来获取它,然后您拥有自己的权限.

  • 不对.JavaScript中一行开头的```被解释为代码块,而不是对象文字.因此,您的`{"d":[1,2,3]}`不是有效的脚本,不会被浏览器执行.就试一试吧 :) (36认同)
  • 我没有得到这个 - 将JSON中的数组向下移动到属性不会阻止这种类型的攻击.返回`{"d":[1,2,3]}`和返回`[1,2,3]`一样容易受到影响. (3认同)
  • 跟进:http://haacked.com/archive/2009/06/25/json-hijacking.aspx对我来说,这是对威胁的一个更好的解释,而不是格罗斯曼的2006年文章 (2认同)