一尘不染

人们为什么要输入“ throw 1; ”和“ for(;;);” 在json响应前面?[重复]

javascript

Google会像这样返回json:

throw 1; <dont be evil> { foo: bar}

和Facebook的ajax具有这样的json:

for(;;); {"error":0,"errorSummary": ""}
  • 他们为什么放置将停止执行并生成无效json的代码?
  • 如果它无效,他们将如何解析它;如果您尝试评估它,它将崩溃吗?
  • 他们只是将其从字符串中删除(似乎很昂贵)吗?
  • 这有什么安全优势吗?

出于安全考虑,对此:

如果刮板在另一个域上,则它们将不得不使用script标签来获取数据,因为XHR无法跨域工作。即使没有,for(;;);攻击者也将如何获取数据?它没有分配给变量,所以不会因为没有引用而被垃圾回收吗?

基本上要获得跨域数据,他们必须要做

<script src="http://target.com/json.js"></script>

但是,即使没有前置崩溃脚本,攻击者也无法使用任何Json数据,除非将其分配给可以全局访问的变量(在这些情况下不是)。崩溃代码实际上无能为力,因为即使没有崩溃代码,他们也必须使用服务器端脚本来使用其站点上的数据。


阅读 506

收藏
2020-05-01

共1个答案

一尘不染

即使没有,for(;;);攻击者也将如何获取数据?

攻击是基于改变行为的内置类型,特别是ObjectArray,通过改变它们的构造函数或其prototype。然后,当目标JSON使用{...}[...]构造时,它们将成为攻击者自己的那些对象版本,并且具有潜在的意外行为。

例如,您可以将setter-property侵入Object,这会出卖以对象常量编写的值:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

然后,当将a <script>指向使用该属性名称的JSON时:

{"x": "hello"}

该值"hello"将被泄漏。

数组和对象文字导致setter的调用方式是有争议的。Firefox删除了3.5版中的行为,以响应对备受瞩目的网站的公开攻击。但是,在撰写本文时,Safari(4)和Chrome(5)仍然容易受到此攻击。

所有浏览器现在禁止的另一种攻击是重新定义构造函数:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

目前,IE8的属性实现(基于ECMAScript第五版标准和Object.defineProperty)目前在Object.prototype或上不起作用Array.prototype

但是,除了保护过去的浏览器外,JavaScript的扩展可能会在将来引起更多类似的潜在泄漏,在这种情况下,谷壳应该也防止此类泄漏。

2020-05-01