当前位置:  开发笔记 > 编程语言 > 正文

为什么人们把代码放在"抛出1; <不要是邪恶的>"和"for(;;);"之类的代码中.在json面前回应?

如何解决《为什么人们把代码放在"抛出1;<不要是邪恶的>"和"for(;;);"之类的代码中.在json面前回应?》经验,为你挑选了4个好方法。

考虑一下,在检查您的GMail帐户后,您将访问我的恶意页面:



现在会发生的是,来自谷歌的Javascript代码 - 提问者认为是良性的并且立即超出范围 - 实际上将被发布到我的邪恶网站.假设脚本标记中请求的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发布的那个.



1> bobince..:

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

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

例如,你可以破解一个setter-property Object,它会背叛用对象文字写的值:

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

然后,当

现在会发生的是,来自谷歌的Javascript代码 - 提问者认为是良性的并且立即超出范围 - 实际上将被发布到我的邪恶网站.假设脚本标记中请求的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发布的那个.


目标受众是程序员的网站存在的问题是,每隔一段时间您就会遇到{希望,指向,使用}不那么迂腐的人.试试这个:a)这是一个例子,说明这种攻击是如何起作用的,而不是完整的黑客对Gmail进行攻击的参考,b)正如已经指出这个问题的另一个答案,针对Gmail的类似攻击,允许攻击者访问用户的联系人列表.

3> rook..:

编辑

这些字符串通常被称为"不可解析的cruft",它们用于修补影响JSON规范的信息泄漏漏洞.这次攻击是现实世界,Jeremiah Grossman发现了gmail中的漏洞.Mozilla还认为这是JSON规范中的漏洞,并且已在Firefox 3中进行了修补.但是因为这个问题仍然影响其他浏览器,所以这是"不可解析的",因为它是一个兼容的补丁.

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


@Jesse Dhillon看看我写的这个漏洞(http://www.exploit-db.com/exploits/7922/).如果你能告诉我这个XHR攻击是如何与一个不可解析的弯曲相关的,我会接受它的CSRF相关.因为安全机制是用JS编写的,所以我很确定是与xss相关的.

4> dan04..:

如果它无效,它们如何解析它,如果你试图评估它会崩溃?

它是一个功能,如果你尝试它会崩溃eval. eval允许任意JavaScript代码,可用于跨站点脚本攻击.

他们只是从字符串中删除它(看起来很贵)?

我想是这样的.可能是这样的:

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

"不要做坏事"会阻止开发人员eval直接使用而不是更安全的替代方案.


如果你不介意的话,我想看看那个正则表达式.提示 - 不要浪费时间尝试写它`:)`
这是为了防止使用`eval`.不要试图回避它,而是使用专用的JSON解析器!
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有