Google प्रीपेंड क्यों करता है (1); उनके JSON प्रतिक्रियाओं के लिए?


4074

Google while(1);उनकी (निजी) JSON प्रतिक्रियाओं के बारे में क्यों बताता है ?

उदाहरण के लिए, Google कैलेंडर में कैलेंडर चालू और बंद करते समय यहां एक प्रतिक्रिया है :

while (1);
[
  ['u', [
    ['smsSentFlag', 'false'],
    ['hideInvitations', 'false'],
    ['remindOnRespondedEventsOnly', 'true'],
    ['hideInvitations_remindOnRespondedEventsOnly', 'false_true'],
    ['Calendar ID stripped for privacy', 'false'],
    ['smsVerifiedFlag', 'true']
  ]]
]

मुझे लगता है कि यह लोगों को इस पर करने से रोकने के लिए eval()है, लेकिन आपको बस इतना करना होगा कि इसे बदल दिया जाए whileऔर फिर आपको सेट कर दिया जाएगा। मुझे लगता है कि लोगों को सुरक्षित JSON पार्सिंग कोड लिखना सुनिश्चित करने के लिए eval की रोकथाम है।

मैंने इसे अन्य स्थानों के एक जोड़े में भी उपयोग किया है, लेकिन Google (मेल, कैलेंडर, संपर्क आदि) के साथ बहुत अधिक, अजीब तरह से पर्याप्त, Google डॉक्स&&&START&&& इसके बजाय शुरू होता है , और Google संपर्कों के साथ शुरू होता है while(1); &&&START&&&

यहाँ क्या चल रहा है?


45
मेरा मानना ​​है कि आपकी पहली धारणा सही है। यदि आप कोड की तलाश शुरू करते हैं और स्रोत के आधार पर इनपुट स्ट्रीम को ट्रिम करने का प्रयास करते हैं, तो आप पुनर्विचार करेंगे और इसे सुरक्षित (और Google के कार्यों के कारण, आसान) तरीके से करेंगे।
एस्टेबन कुबर

34
शायद एक फॉलो-अप सवाल: )]}'अब Google इसके बजाय प्रीपेंड क्यों करता है while(1);? क्या उत्तर समान होंगे?
Gizmo

3
निष्कासन को रोकना होगा, लेकिन अनंत लूप के साथ नहीं।
मर्डोक्स

9
यह )]}'बाइट्स को बचाने के लिए भी हो सकता है, जैसे facebook का इस्तेमाल किया गया है for(;;);जो एक बाइट बचाता है :)
ग्रास डबल

3
JSON hijacking
जोंस के

जवाबों:


4293

यह JSON अपहरण से बचाता है , एक प्रमुख JSON सुरक्षा मुद्दा जो 2011 से ECMAScript 5 के साथ सभी प्रमुख ब्राउज़रों में औपचारिक रूप से तय किया गया है ।

दिए गए उदाहरण: कहते हैं कि Google के पास एक URL है, mail.google.com/json?action=inboxजो JSON प्रारूप में आपके इनबॉक्स के पहले 50 संदेशों को लौटाता है। अन्य डोमेन पर ईविल वेबसाइट एक ही मूल नीति के कारण इस डेटा को प्राप्त करने के लिए AJAX अनुरोध नहीं कर सकती हैं, लेकिन वे URL को एक <script>टैग के माध्यम से शामिल कर सकते हैं । URL को आपके कुकीज़ के साथ देखा जाता है , और वैश्विक सरणी निर्माणकर्ता या एक्सेसर विधियों को ओवरराइड करके, जब भी कोई ऑब्जेक्ट (सरणी या हैश) विशेषता सेट की जाती है, तो उन्हें JSON सामग्री पढ़ने की अनुमति देता है।

while(1);या &&&BLAH&&&रोकता है इस: एक AJAX अनुरोध mail.google.comपाठ्य सामग्री के लिए पूरा उपयोग करना होगा, और इसे दूर पट्टी कर सकते हैं। लेकिन एक <script>टैग प्रविष्टि आँख बंद करके जावास्क्रिप्ट को किसी भी प्रसंस्करण के बिना निष्पादित करता है, जिसके परिणामस्वरूप या तो एक अनंत लूप या एक सिंटैक्स त्रुटि होती है।

यह क्रॉस-साइट अनुरोध जालसाजी के मुद्दे को संबोधित नहीं करता है ।


228
इस डेटा को प्राप्त करने के अनुरोध के बजाय CSRF-token की आवश्यकता क्यों नहीं है?
याकूब पी।

235
क्या for(;;);वही काम करता है? मैंने इसे फेसबुक की अजाक्स प्रतिक्रियाओं में देखा है।
राजा जूलियन

183
@JakubP। Google के पैमाने पर CSRF-tokens को संग्रहीत और बनाए रखने के लिए बड़ी मात्रा में बुनियादी ढांचे और लागत की आवश्यकता होती है।
अब्राहम

127
@JakubP। एंटी-सीएसआरएफ टोकन कैशिंग के साथ गड़बड़ करते हैं, और क्रिप्टोग्राफिक मूल्यांकन सर्वर-साइड की कुछ राशि की आवश्यकता होती है। Google पैमाने पर, इसके लिए बहुत अधिक CPU की आवश्यकता होगी। इस तरह से यह क्लाइंट को लोड करता है।
ब्लूसमून

96
मुझे लगता है कि सही हेडर सेट होने पर सर्वर को केवल JSON भेजना बेहतर तरीका होगा। आप ऐसा AJAX कॉल में कर सकते हैं, लेकिन स्क्रिप्ट टैग के साथ नहीं। इस तरह, संवेदनशील जानकारी कभी भी नहीं भेजी जाती है, और आपको ब्राउज़र-साइड सुरक्षा पर भरोसा करने की आवश्यकता नहीं है।
एमसीवी

574

यह JSON अपहरण के माध्यम से प्रतिक्रिया के प्रकटीकरण को रोकता है।

सिद्धांत रूप में, HTTP प्रतिसादों की सामग्री समान उत्पत्ति नीति द्वारा सुरक्षित है: एक डोमेन के पृष्ठों को दूसरे डोमेन पर पृष्ठों से जानकारी का कोई भी टुकड़ा नहीं मिल सकता है (जब तक कि स्पष्ट रूप से अनुमति नहीं दी जाती है)।

एक हमलावर एक का उपयोग करके अपनी ओर से, जैसे पर अन्य डोमेन पर पृष्ठों का अनुरोध कर सकते <script src=...>या <img>टैग, लेकिन यह परिणाम (हेडर, सामग्री) के बारे में कोई जानकारी नहीं मिल सकता है।

इस प्रकार, यदि आप किसी हमलावर के पृष्ठ पर जाते हैं, तो यह gmail.com से आपके ईमेल को नहीं पढ़ सकता है।

सिवाय इसके कि JSON सामग्री के अनुरोध के लिए एक स्क्रिप्ट टैग का उपयोग करते समय, JSON को हमलावर के नियंत्रित वातावरण में जावास्क्रिप्ट के रूप में निष्पादित किया जाता है। यदि हमलावर ऐरे या ऑब्जेक्ट कंस्ट्रक्टर या ऑब्जेक्ट कंस्ट्रक्शन के दौरान उपयोग की जाने वाली कुछ अन्य विधि को बदल सकता है, तो JSON में कुछ भी हमलावर के कोड से होकर गुजरेगा, और खुलासा किया जाएगा।

ध्यान दें कि यह उस समय होता है जब JSON को जावास्क्रिप्ट के रूप में निष्पादित किया जाता है, उस समय नहीं जब इसे पार्स किया जाता है।

कई प्रतिवाद हैं:

यह सुनिश्चित करना कि JSON कभी भी निष्पादित नहीं करता है

while(1);JSON डेटा से पहले एक स्टेटमेंट देकर , Google यह सुनिश्चित करता है कि JSON डेटा को जावास्क्रिप्ट के रूप में कभी भी निष्पादित नहीं किया जाता है।

केवल एक वैध पृष्ठ ही संपूर्ण सामग्री प्राप्त कर सकता है while(1);, और JSON के रूप में शेष को छीन सकता है।

for(;;);उदाहरण के लिए फेसबुक पर जैसी चीजें देखी गई हैं, वैसा ही परिणाम सामने आया है।

यह सुनिश्चित करना कि JSON मान्य जावास्क्रिप्ट नहीं है

इसी तरह, JSON से पहले अमान्य टोकन जोड़ना, जैसे &&&START&&&, यह सुनिश्चित करता है कि इसे कभी भी निष्पादित नहीं किया गया है।

हमेशा JSON को बाहर की ओर एक ऑब्जेक्ट के साथ लौटाएं

यह JSON अपहरण से बचाने के लिए OWASPअनुशंसित तरीका है और कम घुसपैठ वाला है।

पिछले काउंटर-उपायों के समान, यह सुनिश्चित करता है कि JSON को जावास्क्रिप्ट के रूप में कभी भी निष्पादित नहीं किया जाता है।

एक मान्य JSON ऑब्जेक्ट, जब किसी चीज़ से संलग्न नहीं होता है, तो जावास्क्रिप्ट में मान्य नहीं है:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

हालांकि यह वैध JSON है:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

इसलिए, सुनिश्चित करें कि आप हमेशा प्रतिक्रिया के शीर्ष स्तर पर एक वस्तु लौटाते हैं, यह सुनिश्चित करता है कि JSON मान्य जावास्क्रिप्ट नहीं है, जबकि अभी भी वैध JSON है।

जैसा कि टिप्पणियों में @hvd द्वारा उल्लेख किया गया है, खाली वस्तु {}वैध जावास्क्रिप्ट है, और वस्तु को खाली जानना स्वयं बहुमूल्य जानकारी हो सकती है।

उपरोक्त तरीकों की तुलना

OWASP तरीका कम घुसपैठ वाला है, क्योंकि इसमें किसी क्लाइंट लाइब्रेरी में बदलाव की आवश्यकता नहीं है, और वैध JSON को स्थानांतरित करता है। हालांकि यह अनिश्चित है कि अतीत या भविष्य के ब्राउज़र बग्स इसे हरा सकते हैं या नहीं। जैसा कि @oriadam द्वारा नोट किया गया है, यह स्पष्ट नहीं है कि डेटा त्रुटि-हैंडलिंग के माध्यम से पार्स त्रुटि में लीक किया जा सकता है या नहीं (उदाहरण के लिए window.onerror)।

Google के रास्ते को इसके लिए क्लाइंट लाइब्रेरी की आवश्यकता होती है ताकि वह स्वचालित डी-सीरियलाइज़ेशन का समर्थन कर सके और ब्राउज़र बग के बारे में अधिक सुरक्षित माना जा सके।

डेवलपर्स को गलती से JSON भेजने से बचने के लिए दोनों तरीकों को सर्वर-साइड परिवर्तनों की आवश्यकता होती है।


23
OWASP सिफारिश इसकी सादगी के कारण दिलचस्प है। किसी को भी एक कारण पता है कि Google का तरीका अधिक सुरक्षित है?
फरो

18
मेरा मानना ​​है कि यह किसी भी तरह से अधिक सुरक्षित नहीं है । यहाँ OWASP प्रदान करना +1 के लिए एक अच्छा पर्याप्त कारण लगता है।

30
यह ध्यान देने योग्य हो सकता है कि किसी वस्तु को शाब्दिक रूप से लौटाने से scriptटैग या evalफ़ंक्शन विफल हो जाता है । ब्रेसिज़ की {}व्याख्या या तो कोड या ऑब्जेक्ट शाब्दिक के ब्लॉक के रूप में की जा सकती है, और स्वयं जावास्क्रिप्ट, पूर्व को पसंद करता है। कोड के एक ब्लॉक के रूप में, यह निश्चित रूप से अमान्य है। इस तर्क से, मैं भविष्य के ब्राउज़र व्यवहार में कोई परिवर्तनशील परिवर्तन नहीं देख सकता।
मन्ंजो

16
बैड कोड पर्याप्त नहीं है क्योंकि एक हमलावर भी ब्राउज़र की स्क्रिप्ट-एरर हैडर को हाईजैक कर सकता है ( window.onerror) मुझे यकीन नहीं है कि onerrorसिंटैक्स त्रुटियों के साथ व्यवहार क्या है । मुझे लगता है कि Google अनिश्चित थे।
ओरियम

12
"एक वैध JSON ऑब्जेक्ट, जब किसी चीज़ से संलग्न नहीं होता है, तो जावास्क्रिप्ट में मान्य नहीं होता है:" - एक खाली वस्तु ( {}) के तुच्छ मामले को छोड़कर , जो एक वैध खाली ब्लॉक भी है। यदि वस्तु को जानना रिक्त है तो स्वयं मूल्यवान जानकारी हो सकती है, यह शोषक हो सकता है।

371

यह सुनिश्चित करने के लिए है कि कुछ अन्य साइट आपके डेटा को चोरी करने की कोशिश करने के लिए बुरा चालें नहीं कर सकती हैं। उदाहरण के लिए, सरणी निर्माणकर्ता को बदलकर , फिर इस JSON URL को <script>टैग के माध्यम से , दुर्भावनापूर्ण तृतीय-पक्ष साइट JSON प्रतिक्रिया से डेटा चुरा सकती है। while(1);शुरुआत में डालने से इसकी बजाय स्क्रिप्ट लटक जाएगी।

XHR और दूसरी ओर एक अलग JSON पार्सर का उपयोग करके एक ही साइट अनुरोध, आसानी से while(1);उपसर्ग को अनदेखा कर सकता है ।


6
तकनीकी रूप से, एक "सामान्य" JSON पार्सर को एक त्रुटि देना चाहिए यदि आपके पास एक उपसर्ग है।
मैथ्यू क्रूले

12
हमलावर सिर्फ एक सादे पुराने <script>तत्व का उपयोग करेंगे , एक्सएचआर का नहीं।
लॉरेंस गोंसाल्वेस

9
@ मैथ्यू, यकीन है, लेकिन आप JSON पार्सर को डेटा पास करने से पहले इसे हटा सकते हैं। आप एक <script>टैग के साथ ऐसा नहीं कर सकते
12

7
क्या इसके कोई उदाहरण हैं? व्यूह रचना को फिर से संदर्भित किया जाता है, लेकिन यह एक बग लंबा है। मुझे समझ नहीं आता कि स्क्रिप्ट टैग के माध्यम से प्राप्त डेटा तक किसी की पहुंच कैसे होगी। मुझे एक डमी कार्यान्वयन देखना पसंद है जो हाल के ब्राउज़र में काम करता है।
डेनिस जी

7
@joeltine, नहीं, यह नहीं है। Stackoverflow.com/questions/16289894/… देखें ।

111

<script>टैग के साथ HTML दस्तावेज़ में JSON प्रतिक्रिया सम्मिलित करने के लिए किसी तृतीय-पक्ष के लिए इसे बनाना मुश्किल होगा । याद रखें कि <script>टैग को समान मूल नीति से छूट दी गई है ।


21
यह केवल आधा उत्तर है। यदि यह Objectऔर Arrayकंस्ट्रक्टर्स को ओवरराइड करने की चाल के लिए नहीं थे , तो एक वैध JSON प्रतिक्रिया निष्पादित करते हुए जैसे कि यह जावास्क्रिप्ट सभी परिस्थितियों में पूरी तरह से अहानिकर होगा। हां, टैग while(1);द्वारा लक्षित किए जाने पर प्रतिक्रिया को जावास्क्रिप्ट के रूप में निष्पादित होने से रोकता है <script>, लेकिन आपका उत्तर स्पष्ट नहीं करता है कि यह क्यों आवश्यक है।
मार्क अमेरी

लेकिन यह iframes को कैसे रोकेगा
रविंदर पायल

स्क्रिप्ट टैग को समान मूल नीति से कभी छूट नहीं दी गई है। क्या आप स्पष्ट कर सकते हैं कि मेरे लिए?
सूरज जैन

82

नोट : 2019 तक, इस प्रश्न में चर्चा की गई निवारक उपायों के लिए नेतृत्व करने वाली कई पुरानी कमजोरियां अब आधुनिक ब्राउज़रों में कोई समस्या नहीं हैं। मैं एक ऐतिहासिक जिज्ञासा के रूप में नीचे दिए गए उत्तर को छोड़ दूंगा, लेकिन वास्तव में 2010 (!!) के बाद से पूरा विषय मौलिक रूप से बदल गया है।


यह इसे एक साधारण <script>टैग के लक्ष्य के रूप में उपयोग करने से रोकता है । (ठीक है, यह इसे रोकता नहीं है, लेकिन यह इसे अप्रिय बनाता है।) इस तरह से बुरे लोग सिर्फ उस स्क्रिप्ट टैग को अपनी साइट पर नहीं डाल सकते हैं और अपनी सामग्री लाने के लिए एक सक्रिय सत्र पर भरोसा करते हैं।

संपादित करें - टिप्पणी (और अन्य उत्तर) पर ध्यान दें। इस मुद्दे को विशेष रूप से Objectऔर Arrayनिर्माणकर्ताओं द्वारा निर्मित सुविधाओं के साथ करना है । जिन्हें बदल दिया जा सकता है, अन्यथा अन्यथा JSON, जब पार्स किया जाता है, तो हमलावर कोड को ट्रिगर कर सकता है।


17
यह केवल आधा उत्तर है। यदि यह Objectऔर Arrayकंस्ट्रक्टर्स को ओवरराइड करने की चाल के लिए नहीं थे , तो एक वैध JSON प्रतिक्रिया निष्पादित करते हुए जैसे कि यह जावास्क्रिप्ट सभी परिस्थितियों में पूरी तरह से अहानिकर होगा। हां, टैग while(1);द्वारा लक्षित किए जाने पर प्रतिक्रिया को जावास्क्रिप्ट के रूप में निष्पादित होने से रोकता है <script>, लेकिन आपका उत्तर स्पष्ट नहीं करता है कि यह क्यों आवश्यक है।
मार्क अमेरी

11

चूंकि <script>टैग को समान उत्पत्ति नीति से छूट दी गई है जो वेब दुनिया में सुरक्षा की आवश्यकता है, while(1)जब JSON प्रतिक्रिया में जोड़ा जाता है तो <script>टैग में इसका दुरुपयोग रोकता है ।


0

प्रमाणीकरण स्थान पर होने के बाद, JSON अपहरण सुरक्षा कई प्रकार के रूप ले सकती है। Google अपने JSON डेटा में (1) अपॉइंट करता है, ताकि यदि कोई दुर्भावनापूर्ण स्क्रिप्ट उसका मूल्यांकन करती है, तो दुर्भावनापूर्ण स्क्रिप्ट एक अनंत लूप में प्रवेश करती है।

संदर्भ: वेब सिक्योरिटी टेस्टिंग कुकबुक: सिस्टेमेटिक टेक्निक्स टू प्रॉब्लम फास्ट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.