2012-06-13 16 views
52

मैं एक वेब सेवा का निर्माण कर रहा हूं जो विशेष रूप से जेएसओएन का अनुरोध और प्रतिक्रिया सामग्री (यानी, कोई फॉर्म एन्कोडेड पेलोड) के लिए उपयोग नहीं करता है।क्या सीएसआरएफ हमलों के लिए जेएसओएन वेब सेवाएं कमजोर हैं?

क्या सीएसआरएफ हमले के लिए एक वेब सेवा कमजोर है यदि निम्नलिखित सत्य हैं?

  1. एक शीर्ष स्तर JSON ऑब्जेक्ट के बिना किसी भी POST अनुरोध, उदाहरण के लिए, {"foo":"bar"}, एक 400 उदाहरण के लिए के साथ अस्वीकार कर दिया जाएगा, सामग्री 42 के साथ एक POST अनुरोध इस प्रकार अस्वीकृत कर दिया जाएगा।

  2. application/json के अलावा किसी अन्य सामग्री प्रकार के साथ कोई POST अनुरोध एक 400 उदाहरण के लिए के साथ अस्वीकार कर दिया जाएगा, सामग्री प्रकार application/x-www-form-urlencoded के साथ एक POST अनुरोध इस प्रकार अस्वीकृत कर दिया जाएगा।

  3. सभी जीईटी अनुरोध Safe होंगे, और इस प्रकार किसी सर्वर-साइड डेटा को संशोधित नहीं करेंगे।

  4. ग्राहकों को सत्र कुकी के माध्यम से प्रमाणित किया जाता है, जो वेब सेवा उन्हें JSON डेटा के साथ एक पोस्ट के माध्यम से सही उपयोगकर्ता नाम/पासवर्ड जोड़ी प्रदान करने के बाद देता है, उदा। {"username":"[email protected]", "password":"my password"}

अनुषंगी प्रश्न: PUT और DELETE अनुरोध कभी CSRF की चपेट में हैं? मैं पूछता हूं क्योंकि ऐसा लगता है कि अधिकांश (सभी?) ब्राउज़र इन तरीकों को HTML रूपों में अस्वीकार करते हैं।

संपादित करें: जोड़ा गया आइटम # 4।

संपादित करें: अब तक बहुत अच्छी टिप्पणियां और उत्तर हैं, लेकिन किसी ने भी एक विशिष्ट सीएसआरएफ हमला नहीं किया है जिस पर यह वेब सेवा कमजोर है।

+0

सत्र और कुकी बनती मूल्यों के माध्यम से आपके अनुरोध tokenize, स्वच्छ जो कुछ निर्देशों आपके द्वारा भेजी JSON के माध्यम से ट्रिगर कर रहे हैं, अतिरिक्त स्वाद –

+0

मैं डॉन के लिए नमक एक अच्छा जवाब देने के लिए यहां पर्याप्त जानकारी नहीं है। आप प्रमाणीकरण की किस विधि का उपयोग कर रहे हैं? वेब सेवा के उद्देश्य वाले उपभोक्ता कौन हैं (यानी, आपकी सेवा के समान होस्ट पर साइट के उपयोगकर्ता?) – McGarnagle

+1

आपके सभी वर्तमान सत्यापन पूरी तरह से समझदार हैं और आपके हमले की सतह को सीमित करते हैं, लेकिन वे वास्तव में कुछ भी संबोधित नहीं करते हैं सीएसआरएफ भेद्यता क्या है के साथ करो। – Cheekysoft

उत्तर

50

मनमाने ढंग से मीडिया प्रकारों के साथ मनमाने ढंग से सीएसआरएफ अनुरोधों को फोर्ज करना एक्सएचआर के साथ प्रभावी रूप से संभव है, क्योंकि form’s method is limited to GET and POST और form’s POST message body is also limited to the three formats application/x-www-form-urlencoded, multipart/form-data, and text/plain। हालांकि, with the form data encoding text/plain it is still possible to forge requests containing valid JSON data

तो एक्सएचआर-आधारित सीएसआरएफ हमलों से एकमात्र खतरा आता है। और वे केवल सफल होंगे यदि वे

  • उसी मूल से चलते हैं, इसलिए मूल रूप से आपकी साइट से किसी भी तरह (ई। जी।एक्सएसएस), या
  • एक अलग मूल से चल रहा है और आपके server allows such cross-origin requests

यदि आप दोनों को खत्म कर सकते हैं, तो आपकी वेब सेवा सीएसआरएफ के लिए कमजोर नहीं है। कम से कम उन लोगों को नहीं जो वेब ब्राउज़र के माध्यम से किए जाते हैं।

+7

जैसा कि मैंने आपके लिंक किए गए उत्तर पर टिप्पणी की है, मैं जोर देता हूं कि जेएसओएन फर्जी के लिए पाठ/सादा का उपयोग वास्तव में किया जा सकता है यदि सर्वर को http://pentestmonkey.net/blog/csrf-xml जैसी तकनीकों का उपयोग करके एप्लिकेशन/जेसन की आवश्यकता नहीं है -post-अनुरोध। –

+7

वह उत्तर आज तक सही है, लेकिन शायद जल्द ही गलत हो जाएगा। डब्ल्यू 3 सी एचटीएमएल मानक में enctype = "application/json" जोड़ने पर विचार कर रहा है: http://darobin.github.io/formic/specs/json/ तो स्थायी सुरक्षा के लिए POST बॉडी के प्रकार पर भरोसा न करें, एक का उपयोग करें विरोधी सीएसआरएफ टोकन। – LordOfThePigs

+0

@LordOfThePigs फोर्जिंग मान्य JSON * टेक्स्ट/सादे * के साथ पहले से ही संभव है। – Gumbo

-6

क्या सीएसआरएफ हमले के लिए एक वेब सेवा कमजोर है यदि निम्नलिखित सत्य हैं?

हां। यह अभी भी HTTP है।

क्या सीएसआरएफ के लिए कभी भी कमजोर अनुरोध हैं?

हाँ

ऐसा लगता है सबसे (सभी?) ब्राउज़रों नामंज़ूर कि HTML में इन तरीकों रूपों

आपको लगता है कि एक ब्राउज़र एक HTTP अनुरोध बनाने के लिए एक ही रास्ता है?

+2

सिर्फ इसलिए कि एक सेवा HTTP का उपयोग करता है, यह CSRF के लिए कमजोर नहीं बनाता है। क्या आप एक वास्तविक सीएसआरएफ हमले वेक्टर की पहचान कर सकते हैं जिस पर यह सेवा वर्णित है, कमजोर है? और निश्चित रूप से मुझे नहीं लगता कि ब्राउज़र एक HTTP अनुरोध करने का एकमात्र तरीका है, लेकिन ब्राउजर को यह सबसे आम (केवल?) उपयोगकर्ता के लिए नकली, क्रॉस-साइट अनुरोध बनाने में धोखा दिया जाता है, जिसे उन्होंने नहीं किया उम्मीद करते हैं। – djsmith

+0

दूसरे शब्दों में, मुझे एक विशिष्ट सीएसआरएफ हमला वेक्टर दिखाएं जो उपयोगकर्ता को मेरी वेब सेवा (जैसा वर्णित है) को PUT अनुरोध सबमिट करने के लिए चाल करने के लिए PUT का उपयोग करता है। मेरा मानना ​​है कि यह संभव नहीं है। – djsmith

+0

@ सिमकबीन: क्या आप या तो संदर्भ पोस्ट कर सकते हैं या अन्यथा आपके उत्तर की रक्षा कर सकते हैं? मैंने इस जवाब पर मतदान नहीं किया है, मैं चाहता हूं कि आप पहले झुकें। धन्यवाद। – dotancohen

-1

मुझे बिंदु 3 से संबंधित कुछ संदेह हैं। हालांकि इसे सुरक्षित माना जा सकता है क्योंकि यह सर्वर की ओर से डेटा को नहीं बदलता है, डेटा अभी भी पढ़ा जा सकता है, और जोखिम यह है कि उन्हें चोरी किया जा सकता है।

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

+1

यह केवल तभी काम करता है जब एपीआई द्वारा लौटाया गया शीर्ष स्तर ऑब्जेक्ट एक JSON सरणी है, क्योंकि जावास्क्रिप्ट ऐरे कन्स्ट्रक्टर को ओवरराइड करने की अनुमति देता है। एक शीर्ष स्तर वस्तु सुरक्षित है। Http://flask.pocoo.org/docs/0.10/security/#json-security पर और अधिक। – btubbs

+0

लेखक के अनुसार, "* मुझे नहीं लगता कि किसी भी आधुनिक ब्राउज़र में अब यह दोष है *"। –

-1

यह JSON आधारित शोकहारा अजाक्स का उपयोग सेवाओं पर CSRF करने के लिए संभव है। मैंने इसे एक एप्लिकेशन (क्रोम और फ़ायरफ़ॉक्स दोनों का उपयोग करके) पर परीक्षण किया। आपको प्रीफलाइट अनुरोध से बचने के लिए सामग्री को टेक्स्ट/सादे टाइप करना होगा और जेएसओएन को डेटा टाइप करना होगा। फिर आप अनुरोध भेज सकते हैं, लेकिन सत्रडेटा भेजने के लिए, आपको अपने AJAX अनुरोध में क्रेडेंशियल ध्वज सेट करने की आवश्यकता है। मैं और अधिक विस्तार यहाँ में इस पर चर्चा (संदर्भ शामिल किए गए हैं):

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html

+0

यह अनावश्यक है। यदि सर्वर जेएसओएन के रूप में सादे टेक्स्ट अनुरोधों को पढ़ता है, तो सादे टेक्स्ट के रूप में एन्कोड किए गए फॉर्म को ऐसे अनुरोध को बनाने के लिए पर्याप्त है, जैसा कि गंबो ने उल्लेख किया है। एपीआई सर्वरों को केवल सादे टेक्स्ट अनुरोधों को अस्वीकार कर देना चाहिए। –

संबंधित मुद्दे