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


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

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

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

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

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

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


3491
2018-04-19 18:00


मूल


मेरा मानना ​​है कि आपकी पहली छाप सही है। यदि आप कोड की तलाश करना शुरू करते हैं और स्रोत के आधार पर इनपुट स्ट्रीम को ट्रिम करने का प्रयास करते हैं, तो आप पुनर्विचार करेंगे और इसे सुरक्षित (और Google के कार्यों के कारण, आसान) तरीके से करेंगे। - Esteban Küber
शायद एक फॉलो-अप प्रश्न: Google प्रीपेड क्यों करता है )]}' अब के बजाय while(1);? क्या जवाब वही होंगे? - Gizmo
Eval को रोक देगा, लेकिन अनंत लूप के साथ नहीं। - Mardoxx
इस )]}' बाइट्स को सहेजने के लिए भी हो सकता है, जैसे फेसबुक इस्तेमाल किया जाता है for(;;); जो एक बाइट बचाता है :) - Gras Double
जेसन i.e. के प्रकटीकरण को रोकने के लिए JSON hijacking - Ashraf.Shk786


जवाब:


यह रोकता है जेएसओएन अपहरण

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

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

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


3770
2018-04-19 18:11



इस डेटा को प्राप्त करने का अनुरोध क्यों CSRF-टोकन की आवश्यकता नहीं है? - Jakub P.
कर देता है for(;;); वही काम करो? मैंने इसे फेसबुक के अजाक्स प्रतिक्रियाओं में देखा है। - King Julien
@JakubP। Google के पैमाने पर सीएसआरएफ-टोकन को संग्रहीत और बनाए रखने के लिए बड़ी मात्रा में बुनियादी ढांचे और लागत की आवश्यकता होती है। - abraham
@JakubP। कैशिंग के साथ विरोधी सीएसआरएफ टोकन गड़बड़, और क्रिप्टोग्राफिक मूल्यांकन सर्वर-साइड की कुछ मात्रा की आवश्यकता होती है। Google स्केल पर, इसके लिए बहुत सारे CPU की आवश्यकता होगी। इस तरह के क्लाइंट को ऑफलोड करता है। - bluesmoon
ऐसा लगता है कि सही हेडर सेट किया गया है, तो सर्वर को केवल JSON को भेजने का एक बेहतर तरीका होगा। आप इसे AJAX कॉल में कर सकते हैं, लेकिन स्क्रिप्ट टैग के साथ नहीं। इस तरह, संवेदनशील जानकारी कभी भी भेजी नहीं जाती है, और आपको ब्राउज़र-पक्ष सुरक्षा पर भरोसा नहीं करना पड़ता है। - mcv


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

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

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

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

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

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

कई काउंटर उपायों हैं:

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

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

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

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

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

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

बाहरी पर जेएसओएन हमेशा ऑब्जेक्ट के साथ वापस करें

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

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

एक वैध JSON ऑब्जेक्ट, जब किसी भी चीज़ से घिरा नहीं है, जावास्क्रिप्ट में मान्य नहीं है:

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

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

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

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

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

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

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

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

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


445
2018-02-02 12:09



OWASP अनुशंसा इसकी सादगी के कारण दिलचस्प है। किसी को भी एक कारण पता है कि Google का रास्ता अधिक सुरक्षित है? - funroll
मुझे विश्वास है नहीं है किसी भी तरह से अधिक सुरक्षित। यहां ओडब्ल्यूएएसपी प्रदान करना +1 के लिए एक अच्छा कारण है। - vaxquis
2014 में कौन से ब्राउज़र आपको ऐरे या ऑब्जेक्ट कन्स्ट्रक्टर को प्रतिस्थापित करने देते हैं? - Filipe Giusti
यह ध्यान देने योग्य हो सकता है क्यूं कर एक ऑब्जेक्ट शाब्दिक लौटने से विफल रहता है script टैग या eval समारोह। ब्रेसिज़ {} कोड या ब्लॉक ऑब्जेक्ट के रूप में व्याख्या किया जा सकता है, और स्वयं ही, जावास्क्रिप्ट पूर्व को पसंद करता है। कोड के एक ब्लॉक के रूप में, निश्चित रूप से, अवैध है। इस तर्क से, मैं भविष्य के ब्राउज़र व्यवहार में किसी भी पूर्ववर्ती परिवर्तन नहीं देख सकता। - Manngo
खराब कोड पर्याप्त नहीं है क्योंकि हमलावर ब्राउज़र के स्क्रिप्ट-त्रुटि हैंडर को हाइजैक कर सकता है (window.onerror) मुझे यकीन नहीं है कि इसका क्या व्यवहार है onerror वाक्यविन्यास त्रुटियों के साथ। मुझे लगता है कि Google भी अनिश्चित थे। - oriadam


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

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


344
2018-05-16 02:08



तकनीकी रूप से, यदि आपके पास उपसर्ग है तो "सामान्य" JSON पार्सर को त्रुटि मिलनी चाहिए। - Matthew Crumley
हमलावर सिर्फ एक सादे पुराने का उपयोग करेंगे <script> तत्व, एक्सएचआर नहीं। - Laurence Gonsalves
@ मैथ्यू, यकीन है, लेकिन आप JSON पार्सर को डेटा पास करने से पहले इसे हटा सकते हैं। आप इसे एक के साथ नहीं कर सकते हैं <script> टैग - bdonlan
क्या इसका कोई उदाहरण है? सरणी कन्स्ट्रक्टर को दोबारा संदर्भित किया जाता है, लेकिन यह एक बग लंबा तय है। मुझे समझ में नहीं आता कि स्क्रिप्ट टैग के माध्यम से प्राप्त डेटा तक पहुंच कैसे होगी। मुझे एक डमी कार्यान्वयन देखना अच्छा लगेगा जो हाल के ब्राउज़र में काम करता है। - Dennis G
@joeltine, नहीं, यह नहीं है। देख stackoverflow.com/questions/16289894/... ।


यह किसी तीसरे पक्ष के लिए एक HTML दस्तावेज़ में जेएसओएन प्रतिक्रिया डालने में मुश्किल होगी <script> टैग। याद रखें कि <script> टैग से मुक्त है वही उत्पत्ति नीति


98
2018-04-19 18:04



यह केवल आधा जवाब है। अगर यह ओवरराइड करने की चाल के लिए नहीं था Object तथा Arrayरचनाकार, एक वैध JSON प्रतिक्रिया निष्पादित करते हुए जैसे कि यह जावास्क्रिप्ट था, सभी परिस्थितियों में पूरी तरह से निर्दोष होगा। हाँ while(1); यदि लक्षित है तो प्रतिक्रिया को जावास्क्रिप्ट के रूप में निष्पादित होने से रोकता है <script> टैग, लेकिन आपका जवाब यह नहीं बताता कि यह क्यों जरूरी है। - Mark Amery
लेकिन यह iframes को कैसे रोक देगा - Ravinder Payal
@RavinderPayal <iframe> टैग समान उत्पत्ति नीति से मुक्त नहीं हैं ... - YoYoYonnY
स्क्रिप्ट टैग को कभी भी मूल उत्पत्ति से मुक्त नहीं किया जाता है। क्या आप इसे मेरे लिए साफ़ कर सकते हैं? - Suraj Jain


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

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


65
2018-04-19 18:02



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


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


3
2017-08-18 04:14