क्या JSON अपहरण अब भी आधुनिक ब्राउज़रों में एक समस्या है?


149

मैं Backbone.js और बवंडर वेब सर्वर का उपयोग कर रहा हूं। बैकबोन में संग्रह डेटा प्राप्त करने के लिए मानक व्यवहार एक JSON सरणी के रूप में भेजने के लिए है।

दूसरी ओर, टॉरनेडो का मानक व्यवहार निम्नलिखित भेद्यता के कारण 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 को किसी ऑब्जेक्ट में लपेटने की आवश्यकता नहीं है जब यह वास्तव में वस्तुओं की सूची है।

मैं आधुनिक ब्राउज़रों (यानी वर्तमान क्रोम, फ़ायरफ़ॉक्स, सफारी और IE9) में इन हमलों को पुन: पेश करने में असमर्थ था। उसी समय मैं कहीं भी पुष्टि करने में असमर्थ था कि आधुनिक ब्राउज़रों ने इन मुद्दों को संबोधित किया था।

यह सुनिश्चित करने के लिए कि मैं किसी भी संभावित खराब प्रोग्रामिंग-कौशल और न ही खराब googling- कौशल द्वारा न तो गुमराह कर रहा हूं:

क्या ये JSON अपहरण हमले आज भी आधुनिक ब्राउज़रों में एक मुद्दा है?

(नोट: संभव डुप्लिकेट के लिए क्षमा करें: क्या आधुनिक ब्राउज़र पर 'JSON अपहरण' करना संभव है? लेकिन चूंकि स्वीकृत उत्तर प्रश्न का उत्तर नहीं देता है - मुझे लगा कि इसे फिर से पूछने और कुछ स्पष्ट स्पष्टीकरण प्राप्त करने का समय है। ।)


eval का उपयोग कर रहे हैं? तब संभव है अन्यथा नहीं। यदि किसी भी तरह से कोई बदलाव नहीं किया गया है या बैकबोन पार्स प्रतिक्रिया का तरीका बदल गया है तो आपको सुरक्षित होना चाहिए
Deeptechtons

10
आम तौर पर, आपको कभी भी इस अनुमान के साथ वेब सुरक्षा से संपर्क नहीं करना चाहिए कि कोई "आधुनिक" ब्राउज़र का उपयोग करने जा रहा है।
ल्यूक

7
@ ल्यूक - नीचे टिप्पणी देखें रीड। सामान्य रूप से महान बिंदु - लेकिन मैं एक सामान्य सुरक्षा प्रश्न नहीं पूछ रहा हूं। (मेरे उपयोगकर्ता केवल तभी प्रमाणित कर पाएंगे जब वे पहली बार एक आधुनिक ब्राउज़र का उपयोग कर रहे हों।)
रॉकेटमेन

4
@ कभी-कभी, हमें आगे बढ़ना पड़ता है और हमें आधुनिक पैटर्न के साथ विकसित करने की अनुमति देता है (जैसे कि इस मामले में रीस्ट: डेटा प्राप्त करना एक जीईटी ऑपरेशन है और कुछ और नहीं होना चाहिए) पुराने खतरों से बचाव के बिना अगर वे अब केवल आवेदन करने के लिए दिखाई देते हैं एक छोटे से दर्शक के लिए। इसलिए यह प्रश्न वास्तव में मूल्यवान है, किसी को यह मूल्यांकन करने की अनुमति देने के लिए कि वह इस खतरे को अनदेखा कर सकता है या अपने आवेदन के मामले के लिए नहीं। कुछ बिंदु पर, बहुत अप्रचलित सॉफ़्टवेयर वाले उपयोगकर्ता को अन्य प्रकार के खतरे (मैलवेयर) होने की संभावना है, जिससे हम उन्हें वैसे भी संरक्षित नहीं कर पाएंगे।
Frédéric

2
@jpaugh, आप इस तरह की धारणाएं कहां देखते हैं? मैं केवल कुछ हद तक मानता हूं कि ऐसे अप्रचलित सॉफ़्टवेयर वाले लोग वैसे भी "असुरक्षित" हैं। (मेरे स्केट्स की लागत को सही ठहराने के बारे में, मुझे पहले से ही उनकी कीमत का एक तिहाई कार्बन स्पीड स्केट्स में लगाने के लिए इस्तेमाल किया गया था, जो कि एक तिहाई से भी कम समय में खराब हो गए थे, मुझे अपने वर्तमान स्केट्स को पहनने के लिए ले जा रहे हैं। और वैसे भी, मैं) लगता है कि वे इसके लायक हैं, बशर्ते आप उन्हें सवारी करना पसंद करें, जो मेरा मामला है।)
फ्रैडरिक

जवाबों:


112

नहीं, यह संभव नहीं है कि फ़ायरफ़ॉक्स 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छोटे और लंबे रूपों के माध्यम से सरणियों और वस्तुओं को आरम्भ करने के लिए एक सेटर जोड़ता है और परीक्षण करता है।

ES4 कल्पना , खंड 1.5 में, कार्यान्वयन मिसाल में और नोट्स "ऑब्जेक्ट और सरणी के वैश्विक, मानक बाइंडिंग वस्तु और सरणी initializers के लिए नई वस्तुओं का निर्माण करने के लिए इस्तेमाल किया जा करने की आवश्यकता है" है कि "इंटरनेट एक्सप्लोरर 6, ओपेरा 9.20, और सफ़ारी 3 करते ऑब्जेक्ट और एरे के स्थानीय या वैश्विक रिबंडिंग का सम्मान नहीं करते हैं, लेकिन मूल ऑब्जेक्ट और एरे बिल्डरों का उपयोग करते हैं। " इसे ES5, सेक्शन 11.1.4 में बरकरार रखा गया है ।

एलन विर्फ़्स-ब्रॉक ने बताया कि ES5 यह भी निर्दिष्ट करता है कि ऑब्जेक्ट इनिशियलाइज़ेशन को सेटर को ट्रिगर नहीं करना चाहिए, क्योंकि यह DefineOwnProperty का उपयोग करता है। MDN: ऑब्जेक्ट्स के साथ कार्य करना, जो "जावास्क्रिप्ट 1.8.1 में शुरू होता है, ऑब्जेक्ट और सरणी आरंभीजरों में गुण सेट करते समय बसने वालों को अब नहीं बुलाया जाता है।" यह वी 8 के मुद्दे 1015 में संबोधित किया गया था ।


28
2009 में वापस ब्रेंडन ईच ने सुझाव दिया कि ब्राउज़र एप्लिकेशन / json ( Bugzilla.mozilla.org/show_bug.cgi?id=376957#c75 ) के रूप में दी गई स्क्रिप्ट का मूल्यांकन नहीं करते हैं , जो अभी भी मेरे लिए एक अच्छा विचार लगता है।

2
ध्यान दें कि अंधे पोस्ट सीएसआरएफ अभी भी रूपों का उपयोग करना संभव है, विशेष रूप से पाठ / सादे एन्कोडिंग के साथ, और टोकन / नॉन का उपयोग करके हराया जाना चाहिए।

1
POST CSRF के लिए हाँ। यहाँ आपके सभी महान जानकारी के लिए धन्यवाद।
रॉकेट

5
आपका कथन सही है जब यह केवल ऐरे कंस्ट्रक्टर के ओवरराइटिंग को संदर्भित करता है। हालाँकि, माइक्रोसाफ्ट IE और एज अभी भी UTF-7 JSON अपहरण के लिए असुरक्षित हैं। हाल ही में इसका परीक्षण किया (और आज फिर से मनोरंजन के लिए), और यह अभी भी काम करता है।
user857990

2
UTF-16BE साथ ही, गैरेथ हेयस के लिए धन्यवाद, blog.portswigger.net/2016/11/json-hijacking-for-modern-web.html
eel ghEEz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.