क्या दोहरी सुरक्षा खतरनाक है?


136

मेरे पास एक ASP.NET MVC एप्लिकेशन है जो एक ऐसे मार्ग के साथ है जो / खोज / <खोजकर्ता> के माध्यम से सामान खोजने की अनुमति देता है।

जब मैं "खोज / एबीसी" की आपूर्ति करता हूं तो यह अच्छी तरह से काम करता है, लेकिन जब मैं आपूर्ति करता हूं "/ खोज / ए + बी + सी" (सही तरीके से एन्कोड किया गया) तो IIS7 HTTP त्रुटि 404.11 के अनुरोध को अस्वीकार करता है ( अनुरोध फ़िल्टरिंग मॉड्यूल को अस्वीकार करने के लिए कॉन्फ़िगर किया गया है अनुरोध है कि एक डबल भागने अनुक्रम होता है )। सभी के अनुसार, यह ऐसा क्यों करता है? यह केवल त्रुटि को फेंकने के लिए लगता है यदि यह URL का हिस्सा है, लेकिन क्वेरी स्ट्रिंग (/ संचारित? Q = a + b + c ठीक काम करता है) के भाग के रूप में नहीं।

अब मैं अपने web.config के सुरक्षा अनुभाग में डबल एस्केप अनुरोधों को सक्षम कर सकता हूं लेकिन मैं ऐसा करने में संकोच कर रहा हूं क्योंकि मुझे इसके निहितार्थ समझ में नहीं आते हैं, और न ही सर्वर अनुरोध को अस्वीकार क्यों करेगा "a + b + c" के रूप में URL का हिस्सा लेकिन एक क्वेरी स्ट्रिंग के भाग के रूप में स्वीकार करें।

क्या कोई समझा सकता है और कुछ सलाह दे सकता है कि क्या करना है?


7
मैंने Server.Url Path Encode को कॉल करने के संभवतः अधिक सही विकल्प का भी प्रयास किया और /search/a%2520b%2520cमार्क- अप के साथ समाप्त हो गया, जिसके कारण एक सुंदर "संभावित संभावित Request.Path मान क्लाइंट (%)" त्रुटि से पता चला था। आप इसे जीत नहीं सकते लगता है।
ज़ाफ - बेन ड्यूगिड

जवाबों:


158

संपादित करें: प्रासंगिक अनुभागों पर जोर दिया गया।

मूल रूप से: IIS अत्यधिक पागल हो रहा है। आप सुरक्षित रूप से इस चेक को अक्षम कर सकते हैं यदि आप यूआरआई डिकोड्ड डेटा (जैसे स्थानीय फाइलसिस्टम यूआरआई को स्ट्रिंग कॉन्सेन्टनेशन के माध्यम से उत्पन्न करना) के साथ विशेष रूप से अनजान नहीं हैं।

चेक को अक्षम करने के लिए निम्नलिखित ( यहाँ से ) करें: (मेरी टिप्पणी नीचे दी गई जानकारी से बचने के लिए क्या है)।

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

यदि खोज प्रतीक में प्लस प्रतीक एक मान्य वर्ण है, तो आपको IIS को URI के पथ से इस तरह के इनपुट को संसाधित करने की अनुमति देने के लिए "allowDoubleEsformation" को सक्षम करने की आवश्यकता होगी ।

अंत में, एक बहुत ही सरल, अगर सीमित वर्कअराउंड केवल '+' से बचने और इसके बजाय '% 20' का उपयोग करने के लिए है। किसी भी स्थिति में, किसी स्थान को एन्कोड करने के लिए '+' प्रतीक का उपयोग करना मान्य url एन्कोडिंग नहीं है , लेकिन प्रोटोकॉल के सीमित सेट के लिए विशिष्ट है और संभवतः पीछे-संगतता कारणों के लिए व्यापक रूप से समर्थित है। यदि केवल विहितकरण उद्देश्यों के लिए, तो आप किसी भी तरह '% 20' के लिए एन्कोडिंग रिक्त स्थान से बेहतर हैं; और यह IIS7 मुद्दे (जो अभी भी 25% जैसे अन्य दृश्यों के लिए क्रॉप कर सकता है) को बेहतर बनाता है।


3
मैं जाँच अक्षम कर दूंगा। यह एक परेशानी है और अधिकांश ऐप्स को अतिरिक्त सुरक्षा प्रदान नहीं करता है।
Eamon Nerbonne

3
क्या आपके पास एक लिंक / संदर्भ है जो डबल एस्केपिंग को अक्षम करने के लिए बहुत सुरक्षित है? इसके अलावा, वास्तव में यह सुरक्षा उपाय क्या होने से रोकता है?
एलेक्स

15
यदि कोई यूरी डबल-बच गया है, तो अनसैप्ड यूरी घटक में स्वयं को आरक्षित वर्ण शामिल हो सकते हैं और इस प्रकार अनसैप्ड यूरी स्वयं एक मान्य यूआरआई हो सकता है। संक्षेप में, यदि आप नए uri के निर्माण के लिए unescaped uri string का उपयोग करते हैं - विशेष रूप से फाइलसिस्टम पथों में - और आप नए पथ से सही ढंग से बचने में विफल रहते हैं, तो आप पथ इंजेक्शन की अनुमति दे सकते हैं। पथ इंजेक्शन एक हमलावर को आपके प्रोग्राम को उस डेटा को संसाधित करने की अनुमति नहीं दे सकता है जो उसे नहीं करना चाहिए, या यह सोचने में भ्रमित नहीं करना चाहिए कि दो यूआरआई अलग हैं जब वे वास्तव में समान होते हैं लेकिन बस अलग-अलग एन्कोडेड होते हैं।
Eamon Nerbonne


4
@Stijn: हाँ: यह सुरक्षित है । यह सब चेक रिक्वेस्ट को फ़िल्टर करता है जिसे संभवतः छोटी गाड़ी कोड द्वारा गलत समझा जा सकता है (यदि आप डबल डिकोड करते हैं या स्ट्रिंग-कॉनकट के माध्यम से और उचित एन्कोडिंग के बिना) का निर्माण करते हैं। आप किसी भी तरह की प्रोसेसिंग नहीं कर रहे हैं, इसलिए यह आपके हिस्से पर बहुत अधिक सुरक्षित है। किसी भी बग को IIS की मूल फ़ाइल सेवा कोड में होना चाहिए, और मुझे लगता है कि हम सुरक्षित रूप से मान सकते हैं कि अब तक बहुत, बहुत अच्छी तरह से परीक्षण किया गया है। फिर से, यह चेक कुछ भी फैंसी नहीं है, यह सिर्फ उन चीजों पर निर्भर करता है जिन्हें डिकोड किया जा सकता है और फिर एक एन्कोडेड यूरी की तरह दिख सकता है ।
ईमोन नेरबोन ने

2

मैं आपके प्रश्न के भाग "( क्या करूँ समझा नहीं) " से संबंधित Eamon Nerbonne के उत्तर में कुछ जानकारी जोड़ना चाहूँगा । आप किसी विशेष एप्लिकेशन की सेटिंग भी आसानी से बदल सकते हैं

  1. व्यवस्थापक अधिकारों के साथ कंसोल खोलना (प्रारंभ - cmd - राइट क्लिक करें, व्यवस्थापक के रूप में चलाएँ)
  2. निम्नलिखित में टाइप करना (यहाँ से लिया गया: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-contain.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (आप विकल्प जैसे कर सकते हैं YOURSITENAMEके साथ Default Web Siteडिफ़ॉल्ट वेबसाइट के लिए इस नियम को लागू करने के लिए)

  3. दर्ज करें, तैयार।

एक उदाहरण:

  1. सबसे पहले मुझे एक ही समस्या थी: HTTP एरर 404.11 - एक डबल एस्केप सीक्वेंस वाले अनुरोध को अस्वीकार करने के लिए अनुरोध फ़िल्टरिंग मॉड्यूल कॉन्फ़िगर किया गया है।
  2. ऊपर वर्णित पाठ में टाइपिंग: Drupal7-एक और HTTP एरर 404.11 का समाधान - रिक्वेस्ट फ़िल्टरिंग मॉड्यूल डबल रिक्वैस अनुक्रम वाले अनुरोध को अस्वीकार करने के लिए कॉन्फ़िगर किया गया है।
  3. अब यह उम्मीद के मुताबिक काम करता है: HTTP एरर 404.11 का समाधान - रिक्वेस्ट फ़िल्टरिंग मॉड्यूल डबल रिक्वैस अनुक्रम वाले अनुरोध को अस्वीकार करने के लिए कॉन्फ़िगर किया गया है।

1

क्या आपने खोज URL जैसे '/ खोज / a / b / c' के बारे में सोचा है?

आपको एक रूट सेटअप करना होगा

search/{*path}

और फिर कार्रवाई में अपने पथ स्ट्रिंग से खोज मान निकालें।

HTHs
चार्ल्स


समस्या यह है कि अन्य URL एन्कोड किए गए वर्ण ('स्वयं' सहित) खोज का हिस्सा हो सकते हैं।
एलेक्स

क्या आप उन सभी '/' को एनकोड नहीं कर सकते जो वास्तव में '% 2F' की खोज का हिस्सा हैं?
चार्लिनो सेप

0

मैं IIS 7.5 में एक अनुप्रयोग में एक Server.TransferRequest () कर रहा था।

फ़ाइल नाम को एन्कोड करने से दोहरी-भागने की समस्या उत्पन्न हुई, लेकिन अगर मैंने इसे एनकोड नहीं किया, तो मैं "संभावित रूप से खतरनाक Request.Path" त्रुटि में चला जाऊंगा

किसी भी प्रोटोकॉल को लाना, यहां तक ​​कि एक खाली भी, जिस पर मैं URL पर Server.TranferRequest () में समस्या को हल करता हूं।

काम नहीं करता:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

काम करता है:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.