programing

JSON Hijacking은 최신 브라우저에서 여전히 문제가 됩니까?

javamemo 2023. 3. 1. 08:48
반응형

JSON Hijacking은 최신 브라우저에서 여전히 문제가 됩니까?

Backbone.js와 Tornaid 웹 서버를 사용하고 있습니다.Backbone에서 수집 데이터를 수신하는 표준 동작은 JSON 어레이로 전송하는 것입니다.

한편, 토네이도의 표준 동작은 다음과 같은 취약성으로 인해 JSON 어레이를 허용하지 않는 것입니다.

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 하이잭'이 가능합니까?하지만 받아들여진 답변이 질문에 답하지 않는 것 같기 때문에 다시 물어보고 좀 더 명확한 설명을 들어야 할 때라고 생각했습니다.

아니요, 앞으로 전달된 값을 캡처할 수 없습니다.[]또는{}파이어폭스 21, 크롬 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에 세터를 추가합니다.Object.prototype.foo및 어레이와 오브젝트의 초기화를 짧은 형식과 긴 형식으로 테스트합니다.

섹션 1.5의 ES4 사양에서는 "객체와 어레이의 글로벌 표준 바인딩을 사용하여 오브젝트와 어레이 이니셜라이저의 새로운 오브젝트를 구축해야 한다"며 "Internet Explorer 6, Opera 9.20 및 Safari 3은 오브젝트와 어레이의 로컬 또는 글로벌 리바인딩을 존중하지 않지만 원래 오브젝트를 사용한다"고 기술하고 있습니다.nd 어레이 컨스트럭터"는 ES5, 섹션 11.1.4에 유지됩니다.

Allen Wirfs-Brock은 ES5가 DefineOwnProperty를 사용하기 때문에 오브젝트 초기화가 세터를 트리거하지 않도록 규정한다고 설명했다.MDN: 오브젝트 관련 작업에서는 "JavaScript 1.8.1부터 오브젝트 및 어레이 이니셜라이저에서 속성을 설정할 때 세터가 호출되지 않습니다."이 문제는 V8호 1015에서 해결되었습니다.

언급URL : https://stackoverflow.com/questions/16289894/is-json-hijacking-still-an-issue-in-modern-browsers

반응형