为了账号安全,请及时绑定邮箱和手机立即绑定

JSON劫持仍然是现代浏览器中的问题吗?

/ 猿问

JSON劫持仍然是现代浏览器中的问题吗?

繁花如伊 2019-11-07 12:41:41

我正在使用Backbone.js和Tornado Web服务器。在Backbone中接收收集数据的标准行为是作为JSON数组发送。


另一方面,由于以下漏洞,Tornado的标准行为是不允许JSON Array:


http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx


一个相关的是:http : //haacked.com/archive/2009/06/25/json-hijacking.aspx


对于我来说,当它确实是一个对象列表时,不必将JSON包装在一个对象中就变得更加自然。


我无法在现代浏览器(即当前的Chrome,Firefox,Safari和IE9)中重现这些攻击。同时,我无法证实现代浏览器已经解决了这些问题。


为确保我不会被任何可能的编程技巧和谷歌搜索技巧所误导:


这些JSON劫持攻击是否在当今的浏览器中仍然是一个问题?


(注意:很抱歉,可能存在以下重复项:是否可以在现代浏览器中进行“ JSON劫持”? 但是由于接受的答案似乎无法回答问题-我认为是时候再次提出问题并获得一些更清晰的解释)


查看完整描述

3 回答

?
慕村225694

不,不再可能捕获在Firefox 21,Chrome 27或IE 10中传递给[]或{}构造函数的值。这是一个小测试页,基于http://www.thespanner.co.uk中所述的主要攻击/ 2011/05/30 / json-hijacking /:


(http://jsfiddle.net/ph3Uv/2/)


var capture = function() {

    var ta = document.querySelector('textarea')

ta.innerHTML = '';

ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));

return arguments;

}

var original = Array;


var toggle = document.body.querySelector('input[type="checkbox"]');

var toggleCapture = function() {

    var isOn = toggle.checked;

    window.Array = isOn ? capture : original;

    if (isOn) {

        Object.defineProperty(Object.prototype, 'foo', {set: capture});    

    } else {

        delete Object.prototype.foo;

    }

};

toggle.addEventListener('click', toggleCapture);

toggleCapture();


[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {

    el.addEventListener('click', function() {

        document.querySelector('textarea').innerHTML = 'Safe.';

        eval(this.value);

    });

});

<div><label><input type="checkbox" checked="checked"> Capture</label></div>

<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>

<div><textarea></textarea></div>

它重写window.Array和添加一个setter Object.prototype.foo并通过短和长格式测试初始化数组和对象。


的ES4规范,在第1.5节,“需要的对象和阵列的全球性的,标准绑定到被用于构建用于对象和数组的初始化新对象”在实施先例与指出,“Internet Explorer 6中,歌剧9.20,和Safari 3执行不尊重Object和Array的本地或全局重新绑定,而是使用原始的Object和Array构造函数。” ES5第11.1.4节中保留了该内容。


Allen Wirfs-Brock解释说,ES5还指定对象初始化不应该触发设置程序,因为它使用DefineOwnProperty。MDN:使用对象指出“从JavaScript 1.8.1开始,在对象和数组初始化程序中设置属性时不再调用setter。” V8版本1015中已解决此问题。


查看完整回答
反对 回复 2019-11-07
?
偶然的你

早在2009年,Brendan Eich建议浏览器不要评估用作application / json(bugzilla.mozilla.org/show_bug.cgi?id=376957#c75)的脚本,对我来说,这似乎仍然是一个好主意。

查看完整回答
反对 回复 2019-11-07
?
拉莫斯之舞

当您的语句仅涉及数组构造函数的覆盖时,您的语句是正确的。但是,Microsoft的IE和Edge仍然容易受到UTF-7 JSON劫持的攻击。最近对其进行了测试(今天又很有趣),并且仍然有效。

查看完整回答
反对 回复 2019-11-07

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信