javascript - लोग "फेंक 1" जैसे कोड क्यों डालते हैं;<बुरा मत बनो> "और" के लिए(;;); "जेसन प्रतिक्रियाओं के सामने?




ajax security (3)

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

Google इस तरह जेसन लौटाता है:

throw 1; <dont be evil> { foo: bar}

और फेसबुक्स AJAX इस तरह जेसन है:

for(;;); {"error":0,"errorSummary": ""}
  • वे कोड क्यों डालते हैं जो निष्पादन को रोक देगा और अमान्य जेसन बनाता है?
  • यदि यह अमान्य है और यदि आप इसे निकालने का प्रयास करते हैं तो वे इसे कैसे पार्स करेंगे?
  • क्या वे इसे स्ट्रिंग से हटाते हैं (महंगा लगता है)?
  • क्या इसके लिए कोई सुरक्षा लाभ है?

सुरक्षा उद्देश्यों के जवाब में:

यदि स्क्रैपर किसी अन्य डोमेन पर है तो उन्हें डेटा प्राप्त करने के लिए एक script टैग का उपयोग करना होगा क्योंकि XHR क्रॉस-डोमेन काम नहीं करेगा। इसके बिना भी for(;;); हमलावर को डेटा कैसे मिलेगा? यह एक चर के लिए असाइन नहीं किया गया है, तो क्या यह सिर्फ कचरा नहीं होगा क्योंकि इसमें कोई संदर्भ नहीं है?

मूल रूप से डेटा क्रॉस डोमेन प्राप्त करने के लिए उन्हें करना होगा

<script src="http://target.com/json.js"></script>

लेकिन यहां तक ​​कि दुर्घटनाग्रस्त स्क्रिप्ट के बिना भी हमलावर किसी भी जेसन डेटा का उपयोग किसी वैरिएबल को असाइन किए बिना नहीं कर सकता है जिसे आप वैश्विक रूप से एक्सेस कर सकते हैं (यह इन मामलों में नहीं है)। क्रैश कोड प्रभावशाली रूप से कुछ भी नहीं करता है क्योंकि इसके बिना भी उन्हें अपनी साइट पर डेटा का उपयोग करने के लिए सर्वर पक्षीय स्क्रिप्टिंग का उपयोग करना पड़ता है।


इसके बिना भी for(;;); हमलावर को डेटा कैसे मिलेगा?

हमले अपने कन्स्ट्रक्टर फ़ंक्शन या उसके prototype को बदलकर, विशेष रूप से Object और Array में अंतर्निहित प्रकारों के व्यवहार को बदलने पर आधारित होते हैं। फिर जब लक्षित JSON एक {...} या [...] निर्माण का उपयोग करता है, तो संभावित रूप से अप्रत्याशित व्यवहार के साथ वे उन वस्तुओं के हमलावर के अपने संस्करण होंगे।

उदाहरण के लिए, आप Object में एक सेटर-प्रॉपर्टी को हैक कर सकते हैं, जो ऑब्जेक्ट अक्षरों में लिखे गए मानों को धोखा दे देगा:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

फिर जब कुछ JSON पर <script> की ओर इशारा किया गया था, उस प्रॉपर्टी का नाम इस्तेमाल किया गया था:

{"x": "hello"}

मूल्य "hello" लीक हो जाएगा।

जिस तरह से सरणी और ऑब्जेक्ट अक्षर सेटर्स को बुलाया जाता है वह विवादास्पद है। उच्च प्रोफ़ाइल वेब साइटों पर प्रचारित हमलों के जवाब में फ़ायरफ़ॉक्स ने संस्करण 3.5 में व्यवहार को हटा दिया। हालांकि सफारी (4) और क्रोम (5) लिखने के समय अभी भी इसके लिए कमजोर हैं।

एक और हमला जो अब सभी ब्राउज़रों को अस्वीकार करता है, कन्स्ट्रक्टर कार्यों को फिर से परिभाषित करना था:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

और अभी के लिए, Object.defineProperty के गुणों का कार्यान्वयन ( Object.defineProperty फिफ्थ संस्करण मानक और Object.defineProperty पर आधारित) वर्तमान में Object.prototype या Array.prototype पर काम नहीं करता है।

लेकिन साथ ही पिछले ब्राउज़र की सुरक्षा के साथ, यह हो सकता है कि जावास्क्रिप्ट के विस्तार भविष्य में इसी प्रकार के संभावित लीक का कारण बनें, और उस मामले में चाफ को भी उन लोगों के खिलाफ सुरक्षा करनी चाहिए।


यदि यह अमान्य है और यदि आप इसे निकालने का प्रयास करते हैं तो वे इसे कैसे पार्स करेंगे?

यह एक विशेषता है कि अगर आप इसे eval प्रयास करते हैं तो यह दुर्घटनाग्रस्त हो जाएगा। eval arbitary जावास्क्रिप्ट कोड की अनुमति देता है, जिसका उपयोग क्रॉस-साइट स्क्रिप्टिंग हमले के लिए किया जा सकता है।

क्या वे इसे स्ट्रिंग से हटाते हैं (महंगा लगता है)?

मुझे कल्पना है। शायद कुछ ऐसा है:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

"बुरा मत बनो" क्रूर डेवलपर्स को अधिक सुरक्षित विकल्प की बजाय सीधे eval का उपयोग करने से रोकता है।


संपादित करें

इन तारों को आम तौर पर "अयोग्य क्रूर" के रूप में जाना जाता है और इन्हें जेएसओएन विनिर्देश को प्रभावित करने वाली सूचना रिसाव भेद्यता को पैच करने के लिए उपयोग किया जाता है। यह हमला वास्तविक दुनिया है और jeremiahgrossman.blogspot.com/2006/01/… । मोज़िला यह भी मानता है कि यह JSON विनिर्देश में भेद्यता है और इसे फ़ायरफ़ॉक्स 3 में पैच किया गया है। हालांकि, क्योंकि यह समस्या अभी भी अन्य ब्राउज़रों को प्रभावित करती है, यह "अयोग्य क्रूर" आवश्यक है क्योंकि यह एक संगत पैच है।

बॉबिस के जवाब में इस हमले की तकनीकी व्याख्या है और यह सही है।







json